forked from OSchip/llvm-project
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
This commit is contained in:
parent
1a1e818b13
commit
9d100866f2
|
@ -1679,8 +1679,9 @@ void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
|
||||||
HiddenNames &Hidden = HiddenNamesMap[Owner];
|
HiddenNames &Hidden = HiddenNamesMap[Owner];
|
||||||
HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II);
|
HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II);
|
||||||
if (HI != Hidden.HiddenMacros.end()) {
|
if (HI != Hidden.HiddenMacros.end()) {
|
||||||
removeOverriddenMacros(II, Ambig, HI->second->getOverriddenSubmodules());
|
auto SubOverrides = HI->second->getOverriddenSubmodules();
|
||||||
Hidden.HiddenMacros.erase(HI);
|
Hidden.HiddenMacros.erase(HI);
|
||||||
|
removeOverriddenMacros(II, Ambig, SubOverrides);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this macro is already in our list of conflicts, remove it from there.
|
// If this macro is already in our list of conflicts, remove it from there.
|
||||||
|
|
|
@ -3021,9 +3021,19 @@ class ASTIdentifierTableTrait {
|
||||||
// We can't do that currently, because a #include of a different submodule
|
// 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
|
// of the same module just leaks through macros instead of providing new
|
||||||
// DefMacroDirectives for them.
|
// DefMacroDirectives for them.
|
||||||
if (DefMacroDirective *DefMD = dyn_cast<DefMacroDirective>(MD))
|
if (DefMacroDirective *DefMD = dyn_cast<DefMacroDirective>(MD)) {
|
||||||
if (SubmoduleID SourceID = DefMD->getInfo()->getOwningModuleID())
|
// 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);
|
Overridden.push_back(SourceID);
|
||||||
|
}
|
||||||
|
|
||||||
// We are looking for a definition in a different submodule than the one
|
// 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
|
// that we started with. If a submodule has re-definitions of the same
|
||||||
|
|
|
@ -20,3 +20,5 @@
|
||||||
#define TOP_OTHER_REDEF2 2
|
#define TOP_OTHER_REDEF2 2
|
||||||
|
|
||||||
#define TOP_OTHER_DEF_RIGHT_UNDEF void
|
#define TOP_OTHER_DEF_RIGHT_UNDEF void
|
||||||
|
|
||||||
|
#define TOP_REDEF_IN_SUBMODULES 0
|
||||||
|
|
|
@ -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
|
|
@ -0,0 +1,2 @@
|
||||||
|
#include "macros_top_b.h"
|
||||||
|
#undef TOP_REDEF_IN_SUBMODULES
|
|
@ -23,6 +23,8 @@ module module_private_left { header "module_private_left.h" }
|
||||||
module module_private_right { header "module_private_right.h" }
|
module module_private_right { header "module_private_right.h" }
|
||||||
module macros_top {
|
module macros_top {
|
||||||
header "macros_top.h"
|
header "macros_top.h"
|
||||||
|
explicit module b { header "macros_top_b.h" }
|
||||||
|
explicit module c { header "macros_top_c.h" }
|
||||||
}
|
}
|
||||||
module macros_left {
|
module macros_left {
|
||||||
header "macros_left.h"
|
header "macros_left.h"
|
||||||
|
|
|
@ -75,3 +75,9 @@ int n1 = TOP_OTHER_REDEF1; // expected-warning{{ambiguous expansion of macro 'TO
|
||||||
int n2 = TOP_OTHER_REDEF2; // ok
|
int n2 = TOP_OTHER_REDEF2; // ok
|
||||||
|
|
||||||
int n3 = TOP_OTHER_DEF_RIGHT_UNDEF; // 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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue