aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Serialization/ASTWriter.cpp
diff options
context:
space:
mode:
authorVolodymyr Sapsai <vsapsai@apple.com>2025-04-16 10:14:05 -0700
committerGitHub <noreply@github.com>2025-04-16 10:14:05 -0700
commit81739c39db11b7f9a4f3528c1c66b552e57b47e4 (patch)
treeb8acd7bf7812595b7a18db5879b348077eab0d19 /clang/lib/Serialization/ASTWriter.cpp
parent52e0337ea34142f55c427493e9ca2be5fce2dd38 (diff)
downloadllvm-81739c39db11b7f9a4f3528c1c66b552e57b47e4.zip
llvm-81739c39db11b7f9a4f3528c1c66b552e57b47e4.tar.gz
llvm-81739c39db11b7f9a4f3528c1c66b552e57b47e4.tar.bz2
[Modules] Fix an identifier hiding a function-like macro definition. (#135471)
We emit a macro definition only in a module defining it. But it means that if another module has an identifier with the same name as the macro, the users of such module won't be able to use the macro anymore. Fix by storing that an identifier has a macro definition that's not in a current module (`MacroDirectivesOffset == 0`). This way `IdentifierLookupVisitor` knows not to stop at the first module with an identifier but to keep checking included modules for the actual macro definition. Fixes issue #32040. rdar://30258278
Diffstat (limited to 'clang/lib/Serialization/ASTWriter.cpp')
-rw-r--r--clang/lib/Serialization/ASTWriter.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp
index 95b5718..8c261e1 100644
--- a/clang/lib/Serialization/ASTWriter.cpp
+++ b/clang/lib/Serialization/ASTWriter.cpp
@@ -3795,7 +3795,10 @@ bool IsInterestingIdentifier(const IdentifierInfo *II, uint64_t MacroOffset,
II->getNotableIdentifierID() != tok::NotableIdentifierKind::not_notable ||
II->getBuiltinID() != Builtin::ID::NotBuiltin ||
II->getObjCKeywordID() != tok::ObjCKeywordKind::objc_not_keyword;
- if (MacroOffset || II->isPoisoned() || (!IsModule && IsInteresting) ||
+ if (MacroOffset ||
+ (II->hasMacroDefinition() &&
+ II->hasFETokenInfoChangedSinceDeserialization()) ||
+ II->isPoisoned() || (!IsModule && IsInteresting) ||
II->hasRevertedTokenIDToIdentifier() ||
(NeedDecls && II->getFETokenInfo()))
return true;
@@ -3874,7 +3877,8 @@ public:
if (isInterestingIdentifier(II, MacroOffset)) {
DataLen += 2; // 2 bytes for builtin ID
DataLen += 2; // 2 bytes for flags
- if (MacroOffset)
+ if (MacroOffset || (II->hasMacroDefinition() &&
+ II->hasFETokenInfoChangedSinceDeserialization()))
DataLen += 4; // MacroDirectives offset.
if (NeedDecls && IdResolver)
@@ -3905,15 +3909,17 @@ public:
assert((Bits & 0xffff) == Bits && "ObjCOrBuiltinID too big for ASTReader.");
LE.write<uint16_t>(Bits);
Bits = 0;
- bool HadMacroDefinition = MacroOffset != 0;
- Bits = (Bits << 1) | unsigned(HadMacroDefinition);
+ bool HasMacroDefinition =
+ (MacroOffset != 0) || (II->hasMacroDefinition() &&
+ II->hasFETokenInfoChangedSinceDeserialization());
+ Bits = (Bits << 1) | unsigned(HasMacroDefinition);
Bits = (Bits << 1) | unsigned(II->isExtensionToken());
Bits = (Bits << 1) | unsigned(II->isPoisoned());
Bits = (Bits << 1) | unsigned(II->hasRevertedTokenIDToIdentifier());
Bits = (Bits << 1) | unsigned(II->isCPlusPlusOperatorKeyword());
LE.write<uint16_t>(Bits);
- if (HadMacroDefinition)
+ if (HasMacroDefinition)
LE.write<uint32_t>(MacroOffset);
if (NeedDecls && IdResolver) {