From bb35151a166db2b4fee043bc90e60858ac2b7a89 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Sat, 7 Jul 2012 23:00:31 +0000 Subject: [PATCH] Reject 'int a[1][];' in Sema rather than crashing in IR generation. Found by a misreduction of PR13290. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159905 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaType.cpp | 7 ++++++- test/SemaCXX/array-bound-merge.cpp | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 694a94d556..84e8a7944d 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -1249,6 +1249,11 @@ QualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM, // type, the (possibly cv-qualified) type void, a function type or an // abstract class type. // + // C++ [dcl.array]p3: + // When several "array of" specifications are adjacent, [...] only the + // first of the constant expressions that specify the bounds of the arrays + // may be omitted. + // // Note: function types are handled in the common path with C. if (T->isReferenceType()) { Diag(Loc, diag::err_illegal_decl_array_of_references) @@ -1256,7 +1261,7 @@ QualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM, return QualType(); } - if (T->isVoidType()) { + if (T->isVoidType() || T->isIncompleteArrayType()) { Diag(Loc, diag::err_illegal_decl_array_incomplete_type) << T; return QualType(); } diff --git a/test/SemaCXX/array-bound-merge.cpp b/test/SemaCXX/array-bound-merge.cpp index 74f58fa123..8fb2ec52a9 100644 --- a/test/SemaCXX/array-bound-merge.cpp +++ b/test/SemaCXX/array-bound-merge.cpp @@ -7,3 +7,5 @@ extern int b[10]; int b[]; extern int c[1]; int c[] = {1,2}; // expected-error {{excess elements in array initializer}} + +int d[1][]; // expected-error {{array has incomplete element type 'int []'}} -- 2.50.1