diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2008-05-25 13:49:22 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2008-05-25 13:49:22 +0000 |
commit | e0f832bd4f502e337cc9dbf826ddb5a3df8a933e (patch) | |
tree | 52264e828aaa73e802cdf0d710676f672eb1e281 /clang | |
parent | 85f5497c4a300b2ab3182cb9ec94fac9a1f52151 (diff) | |
download | bcm5719-llvm-e0f832bd4f502e337cc9dbf826ddb5a3df8a933e.tar.gz bcm5719-llvm-e0f832bd4f502e337cc9dbf826ddb5a3df8a933e.zip |
Diagnose implicit init list for empty aggregate, like struct {}. Fixes
PR2151 (by not creating the empty implicit init list).
llvm-svn: 51556
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/DiagnosticKinds.def | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 7 | ||||
-rw-r--r-- | clang/test/Sema/array-init.c | 4 |
3 files changed, 13 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticKinds.def b/clang/include/clang/Basic/DiagnosticKinds.def index beea258482b..ce41cfdcf6d 100644 --- a/clang/include/clang/Basic/DiagnosticKinds.def +++ b/clang/include/clang/Basic/DiagnosticKinds.def @@ -751,6 +751,8 @@ DIAG(err_empty_scalar_initializer, ERROR, "scalar initializer cannot be empty") DIAG(err_illegal_initializer, ERROR, "illegal initializer (only variables can be initialized)") +DIAG(err_implicit_empty_initializer, ERROR, + "initializer for aggregate with no elements requires explicit braces") DIAG(err_redefinition_of_label, ERROR, "redefinition of label '%0'") diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 35dda28d4ad..6eb072eebaf 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -57,6 +57,13 @@ void InitListChecker::CheckImplicitInitList(InitListExpr *ParentIList, else assert(0 && "CheckImplicitInitList(): Illegal type"); + if (maxElements == 0) { + SemaRef->Diag(ParentIList->getInit(Index)->getLocStart(), + diag::err_implicit_empty_initializer); + hadError = true; + return; + } + // Check the element types *before* we create the implicit init list; // otherwise, we might end up taking the wrong number of elements unsigned NewIndex = Index; diff --git a/clang/test/Sema/array-init.c b/clang/test/Sema/array-init.c index a7f27b68f86..69255569ddc 100644 --- a/clang/test/Sema/array-init.c +++ b/clang/test/Sema/array-init.c @@ -212,3 +212,7 @@ int u2 = {{3}}; //expected-error{{too many braces around scalar initializer}} void varArray() { int c[][x] = { 0 }; //expected-error{{variable-sized object may not be initialized}} } + +// PR2151 +int emptyInit() {struct {} x[] = {6};} //expected-warning{{empty struct extension}} expected-error{{initializer for aggregate with no elements}} + |