summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2014-03-06 03:16:27 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2014-03-06 03:16:27 +0000
commit9d100866f235b792e68b03697c4f7a83ad02e6e8 (patch)
tree35046d64c60a2bf4d5a45ed065bb4999c76e0f4b /clang
parent1a1e818b13b11109903140cfaebb64d2ce537237 (diff)
downloadbcm5719-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.cpp3
-rw-r--r--clang/lib/Serialization/ASTWriter.cpp14
-rw-r--r--clang/test/Modules/Inputs/macros_top.h2
-rw-r--r--clang/test/Modules/Inputs/macros_top_b.h5
-rw-r--r--clang/test/Modules/Inputs/macros_top_c.h2
-rw-r--r--clang/test/Modules/Inputs/module.map2
-rw-r--r--clang/test/Modules/macros2.c6
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;
+}
OpenPOWER on IntegriCloud