diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-03-06 03:16:27 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-03-06 03:16:27 +0000 |
commit | 9d100866f235b792e68b03697c4f7a83ad02e6e8 (patch) | |
tree | 35046d64c60a2bf4d5a45ed065bb4999c76e0f4b /clang | |
parent | 1a1e818b13b11109903140cfaebb64d2ce537237 (diff) | |
download | bcm5719-llvm-9d100866f235b792e68b03697c4f7a83ad02e6e8.tar.gz bcm5719-llvm-9d100866f235b792e68b03697c4f7a83ad02e6e8.zip |
Fix crash if a submodule overrides one of its own macros, and add support for
submodule macro overriding within the same top-level module (necessary for the
testcase to be remotely reasonable). Incidentally reduces the number of libc++
testsuite regressions with modules enabled from 7 to 6.
llvm-svn: 203063
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 14 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/macros_top.h | 2 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/macros_top_b.h | 5 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/macros_top_c.h | 2 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/module.map | 2 | ||||
-rw-r--r-- | clang/test/Modules/macros2.c | 6 |
7 files changed, 31 insertions, 3 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 99361d207e8..cc218a2807b 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -1679,8 +1679,9 @@ void ASTReader::removeOverriddenMacros(IdentifierInfo *II, HiddenNames &Hidden = HiddenNamesMap[Owner]; HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II); if (HI != Hidden.HiddenMacros.end()) { - removeOverriddenMacros(II, Ambig, HI->second->getOverriddenSubmodules()); + auto SubOverrides = HI->second->getOverriddenSubmodules(); Hidden.HiddenMacros.erase(HI); + removeOverriddenMacros(II, Ambig, SubOverrides); } // If this macro is already in our list of conflicts, remove it from there. diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 3365d1ee0c5..2769b9fda11 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -3021,9 +3021,19 @@ class ASTIdentifierTableTrait { // We can't do that currently, because a #include of a different submodule // of the same module just leaks through macros instead of providing new // DefMacroDirectives for them. - if (DefMacroDirective *DefMD = dyn_cast<DefMacroDirective>(MD)) - if (SubmoduleID SourceID = DefMD->getInfo()->getOwningModuleID()) + if (DefMacroDirective *DefMD = dyn_cast<DefMacroDirective>(MD)) { + // Figure out which submodule the macro was originally defined within. + SubmoduleID SourceID = DefMD->getInfo()->getOwningModuleID(); + if (!SourceID) { + SourceLocation DefLoc = DefMD->getInfo()->getDefinitionLoc(); + if (DefLoc == MD->getLocation()) + SourceID = ThisModID; + else + SourceID = Writer.inferSubmoduleIDFromLocation(DefLoc); + } + if (SourceID != OrigModID) Overridden.push_back(SourceID); + } // We are looking for a definition in a different submodule than the one // that we started with. If a submodule has re-definitions of the same diff --git a/clang/test/Modules/Inputs/macros_top.h b/clang/test/Modules/Inputs/macros_top.h index 2955471a8fa..10935043e2a 100644 --- a/clang/test/Modules/Inputs/macros_top.h +++ b/clang/test/Modules/Inputs/macros_top.h @@ -20,3 +20,5 @@ #define TOP_OTHER_REDEF2 2 #define TOP_OTHER_DEF_RIGHT_UNDEF void + +#define TOP_REDEF_IN_SUBMODULES 0 diff --git a/clang/test/Modules/Inputs/macros_top_b.h b/clang/test/Modules/Inputs/macros_top_b.h new file mode 100644 index 00000000000..cfee17cb587 --- /dev/null +++ b/clang/test/Modules/Inputs/macros_top_b.h @@ -0,0 +1,5 @@ +#include "macros_top.h" +#undef TOP_REDEF_IN_SUBMODULES +#define TOP_REDEF_IN_SUBMODULES 1 +#undef TOP_REDEF_IN_SUBMODULES +#define TOP_REDEF_IN_SUBMODULES 2 diff --git a/clang/test/Modules/Inputs/macros_top_c.h b/clang/test/Modules/Inputs/macros_top_c.h new file mode 100644 index 00000000000..aee82462131 --- /dev/null +++ b/clang/test/Modules/Inputs/macros_top_c.h @@ -0,0 +1,2 @@ +#include "macros_top_b.h" +#undef TOP_REDEF_IN_SUBMODULES diff --git a/clang/test/Modules/Inputs/module.map b/clang/test/Modules/Inputs/module.map index 67b3a5a0ebe..c4727d74918 100644 --- a/clang/test/Modules/Inputs/module.map +++ b/clang/test/Modules/Inputs/module.map @@ -23,6 +23,8 @@ module module_private_left { header "module_private_left.h" } module module_private_right { header "module_private_right.h" } module macros_top { header "macros_top.h" + explicit module b { header "macros_top_b.h" } + explicit module c { header "macros_top_c.h" } } module macros_left { header "macros_left.h" diff --git a/clang/test/Modules/macros2.c b/clang/test/Modules/macros2.c index 87b4c97d96d..c4c8059011c 100644 --- a/clang/test/Modules/macros2.c +++ b/clang/test/Modules/macros2.c @@ -75,3 +75,9 @@ int n1 = TOP_OTHER_REDEF1; // expected-warning{{ambiguous expansion of macro 'TO int n2 = TOP_OTHER_REDEF2; // ok int n3 = TOP_OTHER_DEF_RIGHT_UNDEF; // ok + +int top_redef_in_submodules = TOP_REDEF_IN_SUBMODULES; +@import macros_top.c; +void test2() { + int TOP_REDEF_IN_SUBMODULES = top_redef_in_submodules; +} |