aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaInit.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-02-12 19:00:39 +0000
committerDouglas Gregor <dgregor@apple.com>2009-02-12 19:00:39 +0000
commitdfb5e597e033c8fa09c0e178bd93cfcdf060862e (patch)
treeaf2fff75df5c91d48688e9665771efdfe5919e33 /lib/Sema/SemaInit.cpp
parent01a0c3624aaa976ccba08b6cee1606521b8378d2 (diff)
Fix a bug with designated initializers where we were stepping out of a
union subobject initialization before checking whether the next initiailizer was actually a designated initializer. This led to spurious "excess elements in union initializer" errors. Thanks to rdivacky for reporting the bug! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64392 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaInit.cpp')
-rw-r--r--lib/Sema/SemaInit.cpp15
1 files changed, 7 insertions, 8 deletions
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp
index 27d8d5aa2e..b54a8d674b 100644
--- a/lib/Sema/SemaInit.cpp
+++ b/lib/Sema/SemaInit.cpp
@@ -742,14 +742,13 @@ void InitListChecker::CheckStructUnionTypes(InitListExpr *IList,
return;
}
-
-
// If structDecl is a forward declaration, this loop won't do
// anything except look at designated initializers; That's okay,
// because an error should get printed out elsewhere. It might be
// worthwhile to skip over the rest of the initializer, though.
RecordDecl *RD = DeclType->getAsRecordType()->getDecl();
RecordDecl::field_iterator FieldEnd = RD->field_end();
+ bool InitializedSomething = false;
while (Index < IList->getNumInits()) {
Expr *Init = IList->getInit(Index);
@@ -768,11 +767,7 @@ void InitListChecker::CheckStructUnionTypes(InitListExpr *IList,
true, TopLevelObject))
hadError = true;
- // Abort early for unions: the designator handled the
- // initialization of the appropriate field.
- if (DeclType->isUnionType())
- break;
-
+ InitializedSomething = true;
continue;
}
@@ -781,6 +776,10 @@ void InitListChecker::CheckStructUnionTypes(InitListExpr *IList,
break;
}
+ // We've already initialized a member of a union. We're done.
+ if (InitializedSomething && DeclType->isUnionType())
+ break;
+
// If we've hit the flexible array member at the end, we're done.
if (Field->getType()->isIncompleteArrayType())
break;
@@ -793,11 +792,11 @@ void InitListChecker::CheckStructUnionTypes(InitListExpr *IList,
CheckSubElementType(IList, Field->getType(), Index,
StructuredList, StructuredIndex);
+ InitializedSomething = true;
if (DeclType->isUnionType()) {
// Initialize the first field within the union.
StructuredList->setInitializedFieldInUnion(*Field);
- break;
}
++Field;