Index: llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2301,6 +2301,9 @@ "cannot convert between vector and non-scalar values (%0 and %1)">; def err_typecheck_vector_lengths_not_equal : Error< "vector operands do not have the same number of elements (%0 and %1)">; +def warn_typecheck_vector_element_sizes_not_equal : Warning< + "vector operands do not have the same elements sizes (%0 and %1)">, + InGroup>, DefaultError; def err_ext_vector_component_exceeds_length : Error< "vector component access exceeds type %0">; def err_ext_vector_component_name_illegal : Error< Index: llvm/tools/clang/lib/Sema/SemaExpr.cpp =================================================================== --- llvm/tools/clang/lib/Sema/SemaExpr.cpp +++ llvm/tools/clang/lib/Sema/SemaExpr.cpp @@ -8784,6 +8784,20 @@ << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); return QualType(); } + if (!S.LangOpts.OpenCL && !S.LangOpts.ZVector) { + const BuiltinType *LHSBT = LHSEleType->getAs(); + const BuiltinType *RHSBT = RHSEleType->getAs(); + if (LHSBT != RHSBT && + S.Context.getTypeSize(LHSBT) != S.Context.getTypeSize(RHSBT)) { + S.Diag(Loc, diag::warn_typecheck_vector_element_sizes_not_equal) + << LHS.get()->getType() << RHS.get()->getType() + << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); + if (S.Diags.getDiagnosticLevel( + diag::warn_typecheck_vector_element_sizes_not_equal, Loc) == + DiagnosticsEngine::Level::Error) + return QualType(); + } + } } else { // ...else expand RHS to match the number of elements in LHS. QualType VecTy = Index: llvm/tools/clang/test/CodeGen/vecshift.c =================================================================== --- llvm/tools/clang/test/CodeGen/vecshift.c +++ llvm/tools/clang/test/CodeGen/vecshift.c @@ -1,5 +1,7 @@ -// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -Wno-error-vec-elem-size -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -Wno-error-vec-elem-size -DEXT -emit-llvm %s -o - | FileCheck %s +#ifdef EXT typedef __attribute__((__ext_vector_type__(8))) char vector_char8; typedef __attribute__((__ext_vector_type__(8))) short vector_short8; typedef __attribute__((__ext_vector_type__(8))) int vector_int8; @@ -12,6 +14,20 @@ typedef __attribute__((__ext_vector_type__(4))) unsigned char vector_uchar4; typedef __attribute__((__ext_vector_type__(4))) unsigned short vector_ushort4; typedef __attribute__((__ext_vector_type__(4))) unsigned int vector_uint4; +#else +typedef __attribute__((vector_size(8))) char vector_char8; +typedef __attribute__((vector_size(16))) short vector_short8; +typedef __attribute__((vector_size(32))) int vector_int8; +typedef __attribute__((vector_size(8))) unsigned char vector_uchar8; +typedef __attribute__((vector_size(16))) unsigned short vector_ushort8; +typedef __attribute__((vector_size(32))) unsigned int vector_uint8; +typedef __attribute__((vector_size(4))) char vector_char4; +typedef __attribute__((vector_size(4))) short vector_short4; +typedef __attribute__((vector_size(16))) int vector_int4; +typedef __attribute__((vector_size(4))) unsigned char vector_uchar4; +typedef __attribute__((vector_size(8))) unsigned short vector_ushort4; +typedef __attribute__((vector_size(16))) unsigned int vector_uint4; +#endif char c; short s; Index: llvm/tools/clang/test/Sema/vecshift.c =================================================================== --- llvm/tools/clang/test/Sema/vecshift.c +++ llvm/tools/clang/test/Sema/vecshift.c @@ -1,5 +1,9 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -DERR -verify %s +// RUN: %clang_cc1 -fsyntax-only -Wno-error-vec-elem-size -verify %s +// RUN: %clang_cc1 -fsyntax-only -DEXT -DERR -verify %s +// RUN: %clang_cc1 -fsyntax-only -DEXT -Wno-error-vec-elem-size -verify %s +#ifdef EXT typedef __attribute__((__ext_vector_type__(8))) char vector_char8; typedef __attribute__((__ext_vector_type__(8))) short vector_short8; typedef __attribute__((__ext_vector_type__(8))) int vector_int8; @@ -12,6 +16,20 @@ typedef __attribute__((__ext_vector_type__(4))) unsigned char vector_uchar4; typedef __attribute__((__ext_vector_type__(4))) unsigned short vector_ushort4; typedef __attribute__((__ext_vector_type__(4))) unsigned int vector_uint4; +#else +typedef __attribute__((vector_size(8))) char vector_char8; +typedef __attribute__((vector_size(16))) short vector_short8; +typedef __attribute__((vector_size(32))) int vector_int8; +typedef __attribute__((vector_size(8))) unsigned char vector_uchar8; +typedef __attribute__((vector_size(16))) unsigned short vector_ushort8; +typedef __attribute__((vector_size(32))) unsigned int vector_uint8; +typedef __attribute__((vector_size(4))) char vector_char4; +typedef __attribute__((vector_size(4))) short vector_short4; +typedef __attribute__((vector_size(16))) int vector_int4; +typedef __attribute__((vector_size(4))) unsigned char vector_uchar4; +typedef __attribute__((vector_size(8))) unsigned short vector_ushort4; +typedef __attribute__((vector_size(16))) unsigned int vector_uint4; +#endif char c; short s; @@ -48,16 +66,30 @@ vus8 = 1 << vus8; vc8 = vc8 << vc8; - vi8 = vi8 << vuc8; - vuc8 = vuc8 << vi8; - vus8 = vus8 << vui8; - vui8 = vui8 << vs8; +#ifdef ERR + vi8 = vi8 << vuc8; // expected-error {{vector operands do not have the same elements sizes}} + vuc8 = vuc8 << vi8; // expected-error {{vector operands do not have the same elements sizes}} + vus8 = vus8 << vui8; // expected-error {{vector operands do not have the same elements sizes}} + vui8 = vui8 << vs8; // expected-error {{vector operands do not have the same elements sizes}} +#else + vi8 = vi8 << vuc8; // expected-warning {{vector operands do not have the same elements sizes}} + vuc8 = vuc8 << vi8; // expected-warning {{vector operands do not have the same elements sizes}} + vus8 = vus8 << vui8; // expected-warning {{vector operands do not have the same elements sizes}} + vui8 = vui8 << vs8; // expected-warning {{vector operands do not have the same elements sizes}} +#endif vc8 <<= vc8; - vi8 <<= vuc8; - vuc8 <<= vi8; - vus8 <<= vui8; - vui8 <<= vs8; +#ifdef ERR + vi8 <<= vuc8; // expected-error {{vector operands do not have the same elements sizes}} + vuc8 <<= vi8; // expected-error {{vector operands do not have the same elements sizes}} + vus8 <<= vui8; // expected-error {{vector operands do not have the same elements sizes}} + vui8 <<= vs8; // expected-error {{vector operands do not have the same elements sizes}} +#else + vi8 <<= vuc8; // expected-warning {{vector operands do not have the same elements sizes}} + vuc8 <<= vi8; // expected-warning {{vector operands do not have the same elements sizes}} + vus8 <<= vui8; // expected-warning {{vector operands do not have the same elements sizes}} + vui8 <<= vs8; // expected-warning {{vector operands do not have the same elements sizes}} +#endif c <<= vc8; // expected-error {{assigning to 'char' from incompatible type}} i <<= vuc8; // expected-error {{assigning to 'int' from incompatible type}}