From: Alexey Bader Date: Sun, 30 Aug 2015 18:06:39 +0000 (+0000) Subject: [OpenCL] Improve diagnostics detecting implicit vector conversion. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7d8d400c70dcf450f9f868ba3904d344a38268b4;p=clang [OpenCL] Improve diagnostics detecting implicit vector conversion. Reviewers: pekka.jaaskelainen Differential Revision: http://reviews.llvm.org/D12470 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@246393 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 7b21e1068c..01fcc8714c 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -7445,6 +7445,8 @@ def err_opencl_return_value_with_address_space : Error< "return value cannot be qualified with address space">; def err_opencl_constant_no_init : Error< "variable in constant address space must be initialized">; +def err_opencl_implicit_vector_conversion : Error< + "implicit conversions between vector types (%0 and %1) are not permitted">; } // end of sema category let CategoryName = "OpenMP Issue" in { diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 5297d7e26a..58e2d2db6f 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -7534,6 +7534,18 @@ QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, return QualType(); } + // OpenCL V1.1 6.2.6.p1: + // If the operands are of more than one vector type, then an error shall + // occur. Implicit conversions between vector types are not permitted, per + // section 6.2.1. + if (getLangOpts().OpenCL && + RHSVecType && isa(RHSVecType) && + LHSVecType && isa(LHSVecType)) { + Diag(Loc, diag::err_opencl_implicit_vector_conversion) << LHSType + << RHSType; + return QualType(); + } + // Otherwise, use the generic diagnostic. Diag(Loc, diag::err_typecheck_vector_not_convertable) << LHSType << RHSType diff --git a/test/SemaOpenCL/cond.cl b/test/SemaOpenCL/cond.cl index 2e93c318b4..8cc4f1e8e9 100644 --- a/test/SemaOpenCL/cond.cl +++ b/test/SemaOpenCL/cond.cl @@ -84,7 +84,7 @@ uchar2 ntest03(int2 C, uchar X, uchar Y) float2 ntest04(int2 C, int2 X, float2 Y) { - return C ? X : Y; // expected-error {{cannot convert between vector values of different size ('int2' (vector of 2 'int' values) and 'float2' (vector of 2 'float' values))}} + return C ? X : Y; // expected-error {{implicit conversions between vector types ('int2' (vector of 2 'int' values) and 'float2' (vector of 2 'float' values)) are not permitted}} } float2 ntest05(int2 C, int2 X, float Y) @@ -115,7 +115,7 @@ int2 ntest09(int2 C, global int *X, global int *Y) char3 ntest10(char C, char3 X, char2 Y) { - return C ? X : Y; // expected-error {{cannot convert between vector values of different size ('char3' (vector of 3 'char' values) and 'char2' (vector of 2 'char' values))}} + return C ? X : Y; // expected-error {{implicit conversions between vector types ('char3' (vector of 3 'char' values) and 'char2' (vector of 2 'char' values)) are not permitted}} } char3 ntest11(char2 C, char3 X, char Y)