[cfe-commits] r150144 - in /cfe/trunk: lib/Sema/SemaInit.cpp test/Sema/init.c

Aaron Ballman aaron at aaronballman.com
Wed Feb 8 19:29:07 PST 2012


Author: aaronballman
Date: Wed Feb  8 21:29:06 2012
New Revision: 150144

URL: http://llvm.org/viewvc/llvm-project?rev=150144&view=rev
Log:
Attempting to initialize a union member that does not exist no longer crashes.

Patch by Remi Gacogne

Modified:
    cfe/trunk/lib/Sema/SemaInit.cpp
    cfe/trunk/test/Sema/init.c

Modified: cfe/trunk/lib/Sema/SemaInit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=150144&r1=150143&r2=150144&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaInit.cpp (original)
+++ cfe/trunk/lib/Sema/SemaInit.cpp Wed Feb  8 21:29:06 2012
@@ -1511,7 +1511,8 @@
                                                  IdentifierInfo *FieldName) {
   assert(AnonField->isAnonymousStructOrUnion());
   Decl *NextDecl = AnonField->getNextDeclInContext();
-  while (IndirectFieldDecl *IF = dyn_cast<IndirectFieldDecl>(NextDecl)) {
+  IndirectFieldDecl *IF = NULL;
+  while (NextDecl && (IF = dyn_cast<IndirectFieldDecl>(NextDecl))) {
     if (FieldName && FieldName == IF->getAnonField()->getIdentifier())
       return IF;
     NextDecl = NextDecl->getNextDeclInContext();

Modified: cfe/trunk/test/Sema/init.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/init.c?rev=150144&r1=150143&r2=150144&view=diff
==============================================================================
--- cfe/trunk/test/Sema/init.c (original)
+++ cfe/trunk/test/Sema/init.c Wed Feb  8 21:29:06 2012
@@ -18,10 +18,19 @@
 void *g = &x;
 int *h = &x;
 
+struct union_crash
+{
+    union
+    {
+    };
+};
+
 int test() {
-int a[10];
-int b[10] = a; // expected-error {{array initializer must be an initializer list}}
-int +; // expected-error {{expected identifier or '('}}
+  int a[10];
+  int b[10] = a; // expected-error {{array initializer must be an initializer list}}
+  int +; // expected-error {{expected identifier or '('}}
+
+  struct union_crash u = { .d = 1 }; // expected-error {{field designator 'd' does not refer to any field in type 'struct union_crash'}}
 }
 
 





More information about the cfe-commits mailing list