aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Grosser <grosser@fim.uni-passau.de>2011-09-21 18:28:29 +0000
committerTobias Grosser <grosser@fim.uni-passau.de>2011-09-21 18:28:29 +0000
commit37c31c2e050856f87efd652958352181e72e5dea (patch)
treeab7915d021cce46a83334fb6c88aeeee517edaee
parent4278c654b645402554eb52a48e9c7097c9f1233a (diff)
In the OpenCL mode, the AltiVec mode must be off and checks must be strict
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
-rw-r--r--lib/Frontend/CompilerInvocation.cpp4
-rw-r--r--lib/Sema/SemaExpr.cpp3
-rw-r--r--test/SemaOpenCL/vector_literals_invalid.cl2
3 files changed, 5 insertions, 4 deletions
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index a8d98b2608..7cb707b966 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -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;
}
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 1d23f4f3b2..58b6258304 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -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();
diff --git a/test/SemaOpenCL/vector_literals_invalid.cl b/test/SemaOpenCL/vector_literals_invalid.cl
index 957680f44f..e4e23cd85f 100644
--- a/test/SemaOpenCL/vector_literals_invalid.cl
+++ b/test/SemaOpenCL/vector_literals_invalid.cl
@@ -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'}}
}