[flang] Fix preprocessor regression (#134405)
For numeric kind suffixes like 1_foo, the preprocessor should be able to perform macro replacement for macros named either "_foo" or "foo". Fixes https://github.com/llvm/llvm-project/issues/133399.
This commit is contained in:
parent
b92f4d4c33
commit
be133ff4c4
@ -892,11 +892,24 @@ bool Prescanner::HandleExponent(TokenSequence &tokens) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Prescanner::HandleKindSuffix(TokenSequence &tokens) {
|
bool Prescanner::HandleKindSuffix(TokenSequence &tokens) {
|
||||||
if (*at_ == '_' && IsLegalInIdentifier(*SkipWhiteSpace(at_ + 1))) {
|
if (*at_ == '_' && IsLegalInIdentifier(at_[1])) {
|
||||||
EmitCharAndAdvance(tokens, *at_);
|
// The kind specifier might be a macro (with or without its leading
|
||||||
if (IsLegalIdentifierStart(*at_)) {
|
// underscore); put it into its own token if it has been defined.
|
||||||
// The kind specifier might be a macro, so put it into its own token.
|
const char *p{at_ + 1};
|
||||||
|
while (IsLegalInIdentifier(*++p)) {
|
||||||
|
}
|
||||||
|
if (CharBlock id{at_, static_cast<std::size_t>(p - at_)};
|
||||||
|
preprocessor_.IsNameDefined(id)) {
|
||||||
|
// In 1.0e0_foo, "_foo" is a defined name; retain the
|
||||||
|
// underscore
|
||||||
tokens.CloseToken();
|
tokens.CloseToken();
|
||||||
|
} else {
|
||||||
|
EmitCharAndAdvance(tokens, '_');
|
||||||
|
if (CharBlock id{at_, static_cast<std::size_t>(p - at_)};
|
||||||
|
preprocessor_.IsNameDefined(id)) {
|
||||||
|
// In 1.0e0_foo, "foo" is a defined name
|
||||||
|
tokens.CloseToken();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
while (IsLegalInIdentifier(*at_)) {
|
while (IsLegalInIdentifier(*at_)) {
|
||||||
EmitCharAndAdvance(tokens, *at_);
|
EmitCharAndAdvance(tokens, *at_);
|
||||||
|
@ -187,7 +187,7 @@ TokenSequence &TokenSequence::ToLowerCase() {
|
|||||||
} else if (*p == 'h' || *p == 'H') {
|
} else if (*p == 'h' || *p == 'H') {
|
||||||
// Hollerith
|
// Hollerith
|
||||||
*p = 'h';
|
*p = 'h';
|
||||||
} else if (*p == '_') {
|
} else if (*p == '_' && p + 1 < limit && (p[1] == '"' || p[1] == '\'')) {
|
||||||
// kind-prefixed character literal (e.g., 1_"ABC")
|
// kind-prefixed character literal (e.g., 1_"ABC")
|
||||||
} else {
|
} else {
|
||||||
// exponent
|
// exponent
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
! RUN: %flang -E %s 2>&1 | FileCheck %s
|
! RUN: %flang -E %s 2>&1 | FileCheck %s
|
||||||
#define n k
|
#define n k
|
||||||
|
#define _m _p
|
||||||
parameter(n=4)
|
parameter(n=4)
|
||||||
!CHECK: print *,1_k
|
!CHECK: print *,1_k
|
||||||
print *,1_n
|
print *,1_n
|
||||||
|
!CHECK: print *,1_p
|
||||||
|
print *,1_m
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user