From: Richard Smith Date: Thu, 6 Mar 2014 03:16:27 +0000 (+0000) Subject: Fix crash if a submodule overrides one of its own macros, and add support for X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0b2b59a5f34124adc0ac08e04278eb247cfd819c;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203063 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 99361d207e..cc218a2807 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/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/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index 3365d1ee0c..2769b9fda1 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/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(MD)) - if (SubmoduleID SourceID = DefMD->getInfo()->getOwningModuleID()) + if (DefMacroDirective *DefMD = dyn_cast(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/test/Modules/Inputs/macros_top.h b/test/Modules/Inputs/macros_top.h index 2955471a8f..10935043e2 100644 --- a/test/Modules/Inputs/macros_top.h +++ b/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/test/Modules/Inputs/macros_top_b.h b/test/Modules/Inputs/macros_top_b.h new file mode 100644 index 0000000000..cfee17cb58 --- /dev/null +++ b/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/test/Modules/Inputs/macros_top_c.h b/test/Modules/Inputs/macros_top_c.h new file mode 100644 index 0000000000..aee8246213 --- /dev/null +++ b/test/Modules/Inputs/macros_top_c.h @@ -0,0 +1,2 @@ +#include "macros_top_b.h" +#undef TOP_REDEF_IN_SUBMODULES diff --git a/test/Modules/Inputs/module.map b/test/Modules/Inputs/module.map index 67b3a5a0eb..c4727d7491 100644 --- a/test/Modules/Inputs/module.map +++ b/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/test/Modules/macros2.c b/test/Modules/macros2.c index 87b4c97d96..c4c8059011 100644 --- a/test/Modules/macros2.c +++ b/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; +}