diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -1204,11 +1204,18 @@ SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK) << IList->getInit(Index)->getSourceRange(); } else { - int initKind = T->isArrayType() ? 0 : - T->isVectorType() ? 1 : - T->isScalarType() ? 2 : - T->isUnionType() ? 3 : - 4; + int initKind = 4; + if (T->isArrayType()) + initKind = 0; + else if (T->isVectorType()) + initKind = 1; + // Since we apply the rules for scalar types to sizeless built-in types, + // we get more consistent error messages by treating them as scalar + // here. "sizeless initializer" wouldn't make much sense anyhow. + else if (T->isScalarType() || T->isSizelessBuiltinType()) + initKind = 2; + else if (T->isUnionType()) + initKind = 3; unsigned DK = ExtraInitsIsError ? diag::err_excess_initializers : diag::ext_excess_initializers; @@ -1295,7 +1302,8 @@ if (!VerifyOnly) SemaRef.Diag(IList->getBeginLoc(), diag::err_init_objc_class) << DeclType; hadError = true; - } else if (DeclType->isOCLIntelSubgroupAVCType()) { + } else if (DeclType->isOCLIntelSubgroupAVCType() || + DeclType->isSizelessBuiltinType()) { // Checks for scalar type are sufficient for these types too. CheckScalarType(Entity, IList, DeclType, Index, StructuredList, StructuredIndex); diff --git a/clang/test/Sema/sizeless-1.c b/clang/test/Sema/sizeless-1.c --- a/clang/test/Sema/sizeless-1.c +++ b/clang/test/Sema/sizeless-1.c @@ -83,6 +83,11 @@ svint8_t bad_init_int8 = for; // expected-error {{expected expression}} int empty_brace_init_int = {}; // expected-error {{scalar initializer cannot be empty}} + svint8_t empty_brace_init_int8 = {}; // expected-error {{scalar initializer cannot be empty}} + svint8_t brace_init_int8 = {local_int8}; + svint8_t bad_brace_init_int8_1 = {local_int8, 0}; // expected-warning {{excess elements in scalar initializer}} + svint8_t bad_brace_init_int8_2 = {0}; // expected-error {{incompatible type 'int'}} + svint8_t bad_brace_init_int8_3 = {local_int16}; // expected-error {{incompatible type 'svint16_t'}} const svint8_t const_int8 = local_int8; // expected-note {{declared const here}} const svint8_t uninit_const_int8; diff --git a/clang/test/SemaCXX/sizeless-1.cpp b/clang/test/SemaCXX/sizeless-1.cpp --- a/clang/test/SemaCXX/sizeless-1.cpp +++ b/clang/test/SemaCXX/sizeless-1.cpp @@ -94,9 +94,15 @@ #if __cplusplus >= 201103L int empty_brace_init_int = {}; + svint8_t empty_brace_init_int8 = {}; #else int empty_brace_init_int = {}; // expected-error {{scalar initializer cannot be empty}} + svint8_t empty_brace_init_int8 = {}; // expected-error {{scalar initializer cannot be empty}} #endif + svint8_t brace_init_int8 = {local_int8}; + svint8_t bad_brace_init_int8_1 = {local_int8, 0}; // expected-error {{excess elements in scalar initializer}} + svint8_t bad_brace_init_int8_2 = {0}; // expected-error {{rvalue of type 'int'}} + svint8_t bad_brace_init_int8_3 = {local_int16}; // expected-error {{lvalue of type 'svint16_t'}} const svint8_t const_int8 = local_int8; // expected-note {{declared const here}} const svint8_t uninit_const_int8; // expected-error {{default initialization of an object of const type 'const svint8_t'}} @@ -454,6 +460,11 @@ local_int8 = ref_int8; #if __cplusplus >= 201103L + svint8_t zero_init_int8{}; + svint8_t init_int8{local_int8}; + svint8_t bad_brace_init_int8_1{local_int8, 0}; // expected-error {{excess elements in scalar initializer}} + svint8_t bad_brace_init_int8_2{0}; // expected-error {{rvalue of type 'int'}} + svint8_t bad_brace_init_int8_3{local_int16}; // expected-error {{lvalue of type 'svint16_t'}} svint8_t wrapper_init_int8{wrapper()}; svint8_t &ref_init_int8{local_int8};