[modules] Set the lexical DC for dummy tag decls that refer to hidden

declarations that are made visible after the dummy is parsed and ODR verified

Prior to this commit the
"(getContainingDC(DC) == CurContext && "The next DeclContext should be lexically contained in the current one."),"
assertion failure was triggered during semantic analysis of the dummy
tag declaration that was declared in another tag declaration because its
lexical context did not point to the outer tag decl.

rdar://32292196

llvm-svn: 310706
This commit is contained in:
Alex Lorenz 2017-08-11 12:06:52 +00:00
parent 45d2767ca7
commit 213d34330f
4 changed files with 28 additions and 0 deletions

View File

@ -13722,6 +13722,7 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
// comparison.
SkipBody->CheckSameAsPrevious = true;
SkipBody->New = createTagFromNewDecl();
SkipBody->New->setLexicalDeclContext(CurContext);
SkipBody->Previous = Hidden;
} else {
SkipBody->ShouldSkip = true;

View File

@ -0,0 +1,6 @@
struct Outer {
// This definition is actually hidden since only submodule 'one' is imported.
struct Inner {
int x;
} field;
};

View File

@ -451,3 +451,12 @@ module DebugNestedB {
module objcAtKeywordMissingEnd {
header "objcAtKeywordMissingEnd.h"
}
module innerstructredef {
module one {
header "empty.h"
}
module two {
header "innerstructredef.h"
}
}

View File

@ -0,0 +1,12 @@
// RUN: rm -rf %t
// RUN: %clang_cc1 -fsyntax-only -I%S/Inputs -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -verify %s
// expected-no-diagnostics
@import innerstructredef.one;
struct Outer {
// Should set lexical context when parsing 'Inner' here, otherwise there's a crash:
struct Inner {
int x;
} field;
};