From 1a1678e7eb6ee3a865c7bdc2d07f37c8d2c08ef4 Mon Sep 17 00:00:00 2001 From: Vassil Vassilev Date: Fri, 14 Apr 2017 08:48:08 +0000 Subject: [PATCH] PR32280: Do not crash on nested initializers. Patch by Yuka Takahashi (D31591)! llvm-svn: 300313 --- clang/lib/Sema/SemaInit.cpp | 18 ++++++++++-------- clang/test/Sema/designated-initializers.c | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 0d96304..d0f5300 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -2270,15 +2270,17 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, 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); diff --git a/clang/test/Sema/designated-initializers.c b/clang/test/Sema/designated-initializers.c index a4582de..43f3318 100644 --- a/clang/test/Sema/designated-initializers.c +++ b/clang/test/Sema/designated-initializers.c @@ -351,3 +351,20 @@ overwrite_string4[] = { { { '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, + }, +}; -- 2.7.4