From: Aaron Ballman Date: Fri, 13 Sep 2013 20:43:08 +0000 (+0000) Subject: vector_size cannot be applied to Booleans. Updated the semantic checking logic,... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b445cb9662067b7c7586815937b07828ede9bb49;p=clang vector_size cannot be applied to Booleans. Updated the semantic checking logic, as well as the comment and added a test case. Fixes PR12649 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190721 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index d0da7b752a..0154a129af 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -4614,8 +4614,9 @@ static void HandleVectorSizeAttr(QualType& CurType, const AttributeList &Attr, Attr.setInvalid(); return; } - // the base type must be integer or float, and can't already be a vector. - if (!CurType->isBuiltinType() || + // The base type must be integer (not Boolean or enumeration) or float, and + // can't already be a vector. + if (!CurType->isBuiltinType() || CurType->isBooleanType() || (!CurType->isIntegerType() && !CurType->isRealFloatingType())) { S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << CurType; Attr.setInvalid(); diff --git a/test/SemaCXX/vector.cpp b/test/SemaCXX/vector.cpp index 37b586ca3a..7957c23e3e 100644 --- a/test/SemaCXX/vector.cpp +++ b/test/SemaCXX/vector.cpp @@ -37,7 +37,7 @@ void f2_test(char16 c16, longlong16 ll16, char16_e c16e, longlong16_e ll16e) { } // Test the conditional operator with vector types. -void conditional(bool Cond, char16 c16, longlong16 ll16, char16_e c16e, +void conditional(bool Cond, char16 c16, longlong16 ll16, char16_e c16e, longlong16_e ll16e) { // Conditional operators with the same type. __typeof__(Cond? c16 : c16) *c16p1 = &c16; @@ -105,11 +105,11 @@ struct convertible_to { // expected-note 3 {{candidate function (the implicit co operator T() const; }; -void test_implicit_conversions(bool Cond, char16 c16, longlong16 ll16, +void test_implicit_conversions(bool Cond, char16 c16, longlong16 ll16, char16_e c16e, longlong16_e ll16e, - convertible_to to_c16, - convertible_to to_ll16, - convertible_to to_c16e, + convertible_to to_c16, + convertible_to to_ll16, + convertible_to to_c16e, convertible_to to_ll16e, convertible_to rto_c16, convertible_to rto_c16e) { @@ -183,7 +183,7 @@ void test_implicit_conversions(bool Cond, char16 c16, longlong16 ll16, (void)(Cond? to_c16 : to_c16e); (void)(Cond? to_ll16e : to_ll16); - + // These 2 are convertable with -flax-vector-conversions (default) (void)(Cond? to_c16 : to_ll16); (void)(Cond? to_c16e : to_ll16e); @@ -282,3 +282,6 @@ void test_pseudo_dtor(fltx4 *f) { // PR16204 typedef __attribute__((ext_vector_type(4))) int vi4; const int &reference_to_vec_element = vi4(1).x; + +// PR12649 +typedef bool bad __attribute__((__vector_size__(16))); // expected-error {{invalid vector element type 'bool'}}