Index: lib/Sema/SemaInit.cpp =================================================================== --- lib/Sema/SemaInit.cpp +++ lib/Sema/SemaInit.cpp @@ -1632,8 +1632,26 @@ CheckEmptyInitializable( InitializedEntity::InitializeMember(*Field, &Entity), IList->getLocEnd()); - else + else { + FieldDecl *CurrentField = + StructuredList->getInitializedFieldInUnion(); + if (CurrentField && *Field != CurrentField) { + assert(StructuredList->getNumInits() == 1 + && "A union should never have more than one initializer!"); + + // FIXME: emit warning because we're overriding the initializer. + Expr *ExistingInit = StructuredList->getInit(0); + SemaRef.Diag(ExistingInit->getLocStart(), + diag::note_previous_initializer) + << /*FIXME:has side effects=*/0 + << ExistingInit->getSourceRange(); + + // remove existing initializer + StructuredList->resizeInits(SemaRef.Context, 0); + StructuredList->setInitializedFieldInUnion(nullptr); + } StructuredList->setInitializedFieldInUnion(*Field); + } break; } }