summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/SemaExpr.cpp3
-rw-r--r--clang/test/SemaOpenCL/vector_inc_dec_ops.cl19
2 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 5339c23c03d..da834cc2519 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -8413,6 +8413,9 @@ static QualType CheckIncrementDecrementOperand(Sema &S, Expr *Op,
IsInc, IsPrefix);
} else if (S.getLangOpts().AltiVec && ResType->isVectorType()) {
// OK! ( C/C++ Language Extensions for CBEA(Version 2.6) 10.3 )
+ } else if(S.getLangOpts().OpenCL && ResType->isVectorType() &&
+ ResType->getAs<VectorType>()->getElementType()->isIntegerType()) {
+ // OpenCL V1.2 6.3 says dec/inc ops operate on integer vector types.
} else {
S.Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
<< ResType << int(IsInc) << Op->getSourceRange();
diff --git a/clang/test/SemaOpenCL/vector_inc_dec_ops.cl b/clang/test/SemaOpenCL/vector_inc_dec_ops.cl
new file mode 100644
index 00000000000..c65bbcb5b74
--- /dev/null
+++ b/clang/test/SemaOpenCL/vector_inc_dec_ops.cl
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only
+// expected-no-diagnostics
+
+typedef __attribute__((ext_vector_type(2))) char char2;
+typedef __attribute__((ext_vector_type(4))) unsigned int uint4;
+typedef __attribute__((ext_vector_type(8))) long long8;
+
+void vectorIncrementDecrementOps()
+{
+ char2 A = (char2)(1);
+ uint4 B = (uint4)(1);
+ long8 C = (long8)(1);
+
+ A++;
+ --A;
+ B--;
+ ++B;
+ C++;
+}
OpenPOWER on IntegriCloud