diff options
| author | Vassil Vassilev <v.g.vassilev@gmail.com> | 2017-04-14 08:48:08 +0000 |
|---|---|---|
| committer | Vassil Vassilev <v.g.vassilev@gmail.com> | 2017-04-14 08:48:08 +0000 |
| commit | 1a1678e7eb6ee3a865c7bdc2d07f37c8d2c08ef4 (patch) | |
| tree | c2b576c6df9971d45d84edd21d5266866cdc0011 | |
| parent | 3aa1d004b6b72dac6e8d3b0d36bf1b0c375ce4a5 (diff) | |
| download | bcm5719-llvm-1a1678e7eb6ee3a865c7bdc2d07f37c8d2c08ef4.tar.gz bcm5719-llvm-1a1678e7eb6ee3a865c7bdc2d07f37c8d2c08ef4.zip | |
PR32280: Do not crash on nested initializers.
Patch by Yuka Takahashi (D31591)!
llvm-svn: 300313
| -rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 18 | ||||
| -rw-r--r-- | 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 0d96304f4a2..d0f530010a0 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 a4582deb171..43f3318824d 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, + }, +}; |

