Index: lib/Sema/SemaInit.cpp =================================================================== --- lib/Sema/SemaInit.cpp +++ lib/Sema/SemaInit.cpp @@ -2269,15 +2269,17 @@ assert(StructuredList->getNumInits() == 1 && "A union should never have more than one initializer!"); - // We're about to throw away an initializer, emit warning. - SemaRef.Diag(D->getFieldLoc(), - diag::warn_initializer_overrides) - << D->getSourceRange(); Expr *ExistingInit = StructuredList->getInit(0); - SemaRef.Diag(ExistingInit->getLocStart(), - diag::note_previous_initializer) - << /*FIXME:has side effects=*/0 - << ExistingInit->getSourceRange(); + if (ExistingInit) { + // We're about to throw away an initializer, emit warning. + SemaRef.Diag(D->getFieldLoc(), + diag::warn_initializer_overrides) + << D->getSourceRange(); + SemaRef.Diag(ExistingInit->getLocStart(), + diag::note_previous_initializer) + << /*FIXME:has side effects=*/0 + << ExistingInit->getSourceRange(); + } // remove existing initializer StructuredList->resizeInits(SemaRef.Context, 0); Index: test/Sema/designated-initializers.c =================================================================== --- test/Sema/designated-initializers.c +++ test/Sema/designated-initializers.c @@ -351,3 +351,20 @@ { { 'f', 'o', 'o' }, 1 }, [0].L[4] = 'x' // no-warning }; + +struct { + struct { } s1; + union { + int a; + int b; + } u1; +} s = { + .s1 = { + .x = 0, // expected-error{{field designator}} + }, + + .u1 = { + .a = 0, + .b = 0, + }, +};