Index: lib/Sema/SemaInit.cpp
===================================================================
--- lib/Sema/SemaInit.cpp	(revision 150127)
+++ lib/Sema/SemaInit.cpp	(working copy)
@@ -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();
Index: test/Sema/init.c
===================================================================
--- test/Sema/init.c	(revision 150127)
+++ test/Sema/init.c	(working copy)
@@ -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'}}
 }
 
 
