From: Alex Lorenz Date: Fri, 11 Aug 2017 12:06:52 +0000 (+0000) Subject: [modules] Set the lexical DC for dummy tag decls that refer to hidden X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=39f3cd045120c7497d0cc550aa8f05878fff10d5;p=clang [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@310706 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index d19ace9c43..86c367097f 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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; diff --git a/test/Modules/Inputs/innerstructredef.h b/test/Modules/Inputs/innerstructredef.h new file mode 100644 index 0000000000..600f44e41c --- /dev/null +++ b/test/Modules/Inputs/innerstructredef.h @@ -0,0 +1,6 @@ +struct Outer { +// This definition is actually hidden since only submodule 'one' is imported. +struct Inner { + int x; +} field; +}; diff --git a/test/Modules/Inputs/module.map b/test/Modules/Inputs/module.map index 4cb3e8a028..4788daa431 100644 --- a/test/Modules/Inputs/module.map +++ b/test/Modules/Inputs/module.map @@ -451,3 +451,12 @@ module DebugNestedB { module objcAtKeywordMissingEnd { header "objcAtKeywordMissingEnd.h" } + +module innerstructredef { + module one { + header "empty.h" + } + module two { + header "innerstructredef.h" + } +} diff --git a/test/Modules/inner-struct-redefines-invisible.m b/test/Modules/inner-struct-redefines-invisible.m new file mode 100644 index 0000000000..ecf6d808df --- /dev/null +++ b/test/Modules/inner-struct-redefines-invisible.m @@ -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; +};