]> granicus.if.org Git - clang/commitdiff
In the OpenCL mode, the AltiVec mode must be off and checks must be strict
authorTobias Grosser <grosser@fim.uni-passau.de>
Wed, 21 Sep 2011 18:28:29 +0000 (18:28 +0000)
committerTobias Grosser <grosser@fim.uni-passau.de>
Wed, 21 Sep 2011 18:28:29 +0000 (18:28 +0000)
OpenCL is different from AltiVec in the way it supports vector literals.  OpenCL
is strict with regards to semantic checks.  For example, implicit conversions
and explicit casts between vectors of different types are disallowed.

Fixes PR10975. Submitted by: Anton Lokhmotov <Anton.lokhmotov@gmail.com>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140270 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Frontend/CompilerInvocation.cpp
lib/Sema/SemaExpr.cpp
test/SemaOpenCL/vector_literals_invalid.cl

index a8d98b260897f07095f245fd081c00431cfd3ec0..7cb707b966179351cf2a99a37b65b0f882b26ecd 100644 (file)
@@ -1492,9 +1492,9 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
   // OpenCL has some additional defaults.
   if (LangStd == LangStandard::lang_opencl) {
     Opts.OpenCL = 1;
-    Opts.AltiVec = 1;
+    Opts.AltiVec = 0;
     Opts.CXXOperatorNames = 1;
-    Opts.LaxVectorConversions = 1;
+    Opts.LaxVectorConversions = 0;
     Opts.DefaultFPContract = 1;
   }
 
index 1d23f4f3b2a1fdfc5fb9e03a305d271611d8c8fc..58b6258304428b36982227fac20ed04738c20730 100644 (file)
@@ -4248,7 +4248,8 @@ Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc,
   // i.e. all the elements are integer constants.
   ParenExpr *PE = dyn_cast<ParenExpr>(CastExpr);
   ParenListExpr *PLE = dyn_cast<ParenListExpr>(CastExpr);
-  if (getLangOptions().AltiVec && castType->isVectorType() && (PE || PLE)) {
+  if ((getLangOptions().AltiVec || getLangOptions().OpenCL)
+       && castType->isVectorType() && (PE || PLE)) {
     if (PLE && PLE->getNumExprs() == 0) {
       Diag(PLE->getExprLoc(), diag::err_altivec_empty_initializer);
       return ExprError();
index 957680f44ffeca9329f61246cccb598ba271879c..e4e23cd85f00924e0c20519a490e3b189c140092 100644 (file)
@@ -8,6 +8,6 @@ void vector_literals_invalid()
 {
   int4 a = (int4)(1,2,3); // expected-error{{too few elements}}
   int4 b = (int4)(1,2,3,4,5); // expected-error{{excess elements in vector}}
-  ((float4)(1.0f))++; // expected-error{{expression is not assignable}}
+  ((float4)(1.0f))++; // expected-error{{cannot increment value of type 'float4'}}
   int8 d = (int8)(a,(float4)(1)); // expected-error{{initializing 'int' with an expression of incompatible type 'float4'}}
 }