[cfe-commits] r163552 - in /cfe/trunk: lib/AST/Decl.cpp test/PCH/field-designator.c
Argyrios Kyrtzidis
akyrtzi at gmail.com
Mon Sep 10 15:04:22 PDT 2012
Author: akirtzidis
Date: Mon Sep 10 17:04:22 2012
New Revision: 163552
URL: http://llvm.org/viewvc/llvm-project?rev=163552&view=rev
Log:
[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
Added:
cfe/trunk/test/PCH/field-designator.c
Modified:
cfe/trunk/lib/AST/Decl.cpp
Modified: cfe/trunk/lib/AST/Decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=163552&r1=163551&r2=163552&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Decl.cpp (original)
+++ cfe/trunk/lib/AST/Decl.cpp Mon Sep 10 17:04:22 2012
@@ -2762,6 +2762,10 @@
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 @@
SmallVector<Decl*, 64> Decls;
LoadedFieldsFromExternalStorage = true;
- switch (Source->FindExternalLexicalDeclsBy<FieldDecl>(this, Decls)) {
+ switch (Source->FindExternalLexicalDecls(this, isFieldOrIndirectField,
+ Decls)) {
case ELR_Success:
break;
@@ -2783,7 +2788,7 @@
#ifndef NDEBUG
// Check that all decls we got were FieldDecls.
for (unsigned i=0, e=Decls.size(); i != e; ++i)
- assert(isa<FieldDecl>(Decls[i]));
+ assert(isa<FieldDecl>(Decls[i]) || isa<IndirectFieldDecl>(Decls[i]));
#endif
if (Decls.empty())
Added: cfe/trunk/test/PCH/field-designator.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/field-designator.c?rev=163552&view=auto
==============================================================================
--- cfe/trunk/test/PCH/field-designator.c (added)
+++ cfe/trunk/test/PCH/field-designator.c Mon Sep 10 17:04:22 2012
@@ -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
More information about the cfe-commits
mailing list