From 22cd9ac42a730a7776e323bc1210df2d457d8377 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Mon, 10 Sep 2012 22:04:22 +0000 Subject: [PATCH] [PCH] When loading fields from external storage make sure to also load in the IndirectField declarations as well. Field designators in initializer lists depend on traversing the fields decl chain to find the indirect fields. Fixes rdar://12239321 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163552 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/Decl.cpp | 9 +++++++-- test/PCH/field-designator.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 test/PCH/field-designator.c diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index bfc6f61c8f..13f931ae0b 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -2762,6 +2762,10 @@ void RecordDecl::completeDefinition() { TagDecl::completeDefinition(); } +static bool isFieldOrIndirectField(Decl::Kind K) { + return FieldDecl::classofKind(K) || IndirectFieldDecl::classofKind(K); +} + void RecordDecl::LoadFieldsFromExternalStorage() const { ExternalASTSource *Source = getASTContext().getExternalSource(); assert(hasExternalLexicalStorage() && Source && "No external storage?"); @@ -2771,7 +2775,8 @@ void RecordDecl::LoadFieldsFromExternalStorage() const { SmallVector Decls; LoadedFieldsFromExternalStorage = true; - switch (Source->FindExternalLexicalDeclsBy(this, Decls)) { + switch (Source->FindExternalLexicalDecls(this, isFieldOrIndirectField, + Decls)) { case ELR_Success: break; @@ -2783,7 +2788,7 @@ void RecordDecl::LoadFieldsFromExternalStorage() const { #ifndef NDEBUG // Check that all decls we got were FieldDecls. for (unsigned i=0, e=Decls.size(); i != e; ++i) - assert(isa(Decls[i])); + assert(isa(Decls[i]) || isa(Decls[i])); #endif if (Decls.empty()) diff --git a/test/PCH/field-designator.c b/test/PCH/field-designator.c new file mode 100644 index 0000000000..763cfdab28 --- /dev/null +++ b/test/PCH/field-designator.c @@ -0,0 +1,35 @@ +// RUN: %clang_cc1 -cc1 %s -include %s +// RUN: %clang_cc1 -cc1 %s -emit-pch -o %t.pch +// RUN: %clang_cc1 -cc1 %s -include-pch %t.pch + +// rdar://12239321 Make sure we don't emit a bogus +// error: field designator 'e' does not refer to a non-static data member + +#ifndef HEADER +#define HEADER +//===----------------------------------------------------------------------===// + +struct U { + union { + struct { + int e; + int f; + }; + + int a; + }; +}; + +//===----------------------------------------------------------------------===// +#else +#if !defined(HEADER) +# error Header inclusion order messed up +#endif +//===----------------------------------------------------------------------===// + +void bar() { + static const struct U plan = { .e = 1 }; +} + +//===----------------------------------------------------------------------===// +#endif -- 2.50.1