aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2013-04-12 21:00:54 +0000
committerDouglas Gregor <dgregor@apple.com>2013-04-12 21:00:54 +0000
commit7332ae49671762239c9986c8f30f291c3a13d27e (patch)
treece1c3081071f7a3e0a8cc462fa8fd0c5cc4667b0
parentb1b683ea5f1ff161b6bbdf2e2519317618ee2811 (diff)
<rdar://problem/13643854> Only emit ambiguous-expansion warnings when at least one of the macro definitions comes from a non-system header.
This slightly weakens the heuristic introduced in r178109. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179411 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Lex/ModuleMap.h1
-rw-r--r--lib/Serialization/ASTReader.cpp34
2 files changed, 8 insertions, 27 deletions
diff --git a/include/clang/Lex/ModuleMap.h b/include/clang/Lex/ModuleMap.h
index 1c9c67314a..33c92f59a4 100644
--- a/include/clang/Lex/ModuleMap.h
+++ b/include/clang/Lex/ModuleMap.h
@@ -177,7 +177,6 @@ public:
void setBuiltinIncludeDir(const DirectoryEntry *Dir) {
BuiltinIncludeDir = Dir;
}
- const DirectoryEntry *getBuiltinIncludeDir() { return BuiltinIncludeDir; }
/// \brief Retrieve the module that owns the given header file, if any.
///
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp
index c8b3e93a87..4302f8bb53 100644
--- a/lib/Serialization/ASTReader.cpp
+++ b/lib/Serialization/ASTReader.cpp
@@ -1563,9 +1563,9 @@ void ASTReader::installPCHMacroDirectives(IdentifierInfo *II,
}
/// \brief For the given macro definitions, check if they are both in system
-/// modules and if one of the two is in the clang builtin headers.
-static bool isSystemAndClangMacro(MacroInfo *PrevMI, MacroInfo *NewMI,
- Module *NewOwner, ASTReader &Reader) {
+/// modules.
+static bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI,
+ Module *NewOwner, ASTReader &Reader) {
assert(PrevMI && NewMI);
if (!NewOwner)
return false;
@@ -1576,22 +1576,7 @@ static bool isSystemAndClangMacro(MacroInfo *PrevMI, MacroInfo *NewMI,
return false;
if (PrevOwner == NewOwner)
return false;
- if (!PrevOwner->IsSystem || !NewOwner->IsSystem)
- return false;
-
- SourceManager &SM = Reader.getSourceManager();
- FileID PrevFID = SM.getFileID(PrevMI->getDefinitionLoc());
- FileID NewFID = SM.getFileID(NewMI->getDefinitionLoc());
- const FileEntry *PrevFE = SM.getFileEntryForID(PrevFID);
- const FileEntry *NewFE = SM.getFileEntryForID(NewFID);
- if (PrevFE == 0 || NewFE == 0)
- return false;
-
- Preprocessor &PP = Reader.getPreprocessor();
- ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
- const DirectoryEntry *BuiltinDir = ModMap.getBuiltinIncludeDir();
-
- return (PrevFE->getDir() == BuiltinDir) != (NewFE->getDir() == BuiltinDir);
+ return PrevOwner->IsSystem && NewOwner->IsSystem;
}
void ASTReader::installImportedMacro(IdentifierInfo *II, MacroDirective *MD,
@@ -1607,15 +1592,12 @@ void ASTReader::installImportedMacro(IdentifierInfo *II, MacroDirective *MD,
if (NewMI != PrevMI && !PrevMI->isIdenticalTo(*NewMI, PP,
/*Syntactically=*/true)) {
// Before marking the macros as ambiguous, check if this is a case where
- // the system macro uses a not identical definition compared to a macro
- // from the clang headers. For example:
+ // both macros are in system headers. If so, we trust that the system
+ // did not get it wrong. This also handles cases where Clang's own
+ // headers have a different spelling of certain system macros:
// #define LONG_MAX __LONG_MAX__ (clang's limits.h)
// #define LONG_MAX 0x7fffffffffffffffL (system's limits.h)
- // in which case don't mark them to avoid the "ambiguous macro expansion"
- // warning.
- // FIXME: This should go away if the system headers get "fixed" to use
- // identical definitions.
- if (!isSystemAndClangMacro(PrevMI, NewMI, Owner, *this)) {
+ if (!areDefinedInSystemModules(PrevMI, NewMI, Owner, *this)) {
PrevDef.getDirective()->setAmbiguous(true);
DefMD->setAmbiguous(true);
}