summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2015-02-06 17:30:04 +0000
committerTom Stellard <thomas.stellard@amd.com>2015-02-06 17:30:04 +0000
commit96d5dc77faaee7188c4ff14b94938a1acffa4c1e (patch)
treee41ec6fb440ce99975dc1b6d771d4020c7dd168b /clang/lib/Sema/SemaExpr.cpp
parent7dc96dea0a566cfe14c4d2826773bae9e9a87b85 (diff)
downloadbcm5719-llvm-96d5dc77faaee7188c4ff14b94938a1acffa4c1e.tar.gz
bcm5719-llvm-96d5dc77faaee7188c4ff14b94938a1acffa4c1e.zip
Revert "OpenCL: handle shift operator with vector operands"
This reverts commit r228382. This breaks the following case: Reported by Jeroen Ketema: http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20150202/122961.html typedef __attribute__((ext_vector_type(3))) char char3; void foo() { char3 v = {1,1,1}; char3 w = {1,2,3}; w <<= v; } If I compile with: clang -x cl file.c Then an error is produced: file.c:10:5: error: expression is not assignable w <<= v; ~ ^ 1 error generated. llvm-svn: 228406
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
-rw-r--r--clang/lib/Sema/SemaExpr.cpp66
1 files changed, 1 insertions, 65 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 099238d0966..2b4c639dcd8 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -7772,67 +7772,6 @@ static void DiagnoseBadShiftValues(Sema& S, ExprResult &LHS, ExprResult &RHS,
<< RHS.get()->getSourceRange();
}
-/// \brief Return the resulting type when an OpenCL vector is shifted
-/// by a scalar or vector shift amount.
-static QualType checkOpenCLVectorShift(Sema &S,
- ExprResult &LHS, ExprResult &RHS,
- SourceLocation Loc) {
- // OpenCL v1.1 s6.3.j says RHS can be a vector only if LHS is a vector.
- if (!LHS.get()->getType()->isVectorType()) {
- S.Diag(Loc, diag::err_shift_rhs_only_vector)
- << RHS.get()->getType() << LHS.get()->getType()
- << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
- return QualType();
- }
-
- LHS = S.UsualUnaryConversions(LHS.get());
- if (LHS.isInvalid()) return QualType();
-
- RHS = S.UsualUnaryConversions(RHS.get());
- if (RHS.isInvalid()) return QualType();
-
- QualType LHSType = LHS.get()->getType();
- const VectorType *LHSVecTy = LHSType->getAs<VectorType>();
- QualType LHSEleType = LHSVecTy->getElementType();
-
- // Note that RHS might not be a vector.
- QualType RHSType = RHS.get()->getType();
- const VectorType *RHSVecTy = RHSType->getAs<VectorType>();
- QualType RHSEleType = RHSVecTy ? RHSVecTy->getElementType() : RHSType;
-
- // OpenCL v1.1 s6.3.j says that the operands need to be integers.
- if (!LHSEleType->isIntegerType()) {
- S.Diag(Loc, diag::err_typecheck_expect_int)
- << LHS.get()->getType() << LHS.get()->getSourceRange();
- return QualType();
- }
-
- if (!RHSEleType->isIntegerType()) {
- S.Diag(Loc, diag::err_typecheck_expect_int)
- << RHS.get()->getType() << RHS.get()->getSourceRange();
- return QualType();
- }
-
- if (RHSVecTy) {
- // OpenCL v1.1 s6.3.j says that for vector types, the operators
- // are applied component-wise. So if RHS is a vector, then ensure
- // that the number of elements is the same as LHS...
- if (RHSVecTy->getNumElements() != LHSVecTy->getNumElements()) {
- S.Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
- << LHS.get()->getType() << RHS.get()->getType()
- << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
- return QualType();
- }
- } else {
- // ...else expand RHS to match the number of elements in LHS.
- QualType VecTy =
- S.Context.getExtVectorType(RHSEleType, LHSVecTy->getNumElements());
- RHS = S.ImpCastExprToType(RHS.get(), VecTy, CK_VectorSplat);
- }
-
- return LHSType;
-}
-
// C99 6.5.7
QualType Sema::CheckShiftOperands(ExprResult &LHS, ExprResult &RHS,
SourceLocation Loc, unsigned Opc,
@@ -7841,11 +7780,8 @@ QualType Sema::CheckShiftOperands(ExprResult &LHS, ExprResult &RHS,
// Vector shifts promote their scalar inputs to vector type.
if (LHS.get()->getType()->isVectorType() ||
- RHS.get()->getType()->isVectorType()) {
- if (LangOpts.OpenCL)
- return checkOpenCLVectorShift(*this, LHS, RHS, Loc);
+ RHS.get()->getType()->isVectorType())
return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign);
- }
// Shifts don't perform usual arithmetic conversions, they just do integer
// promotions on each operand. C99 6.5.7p3
OpenPOWER on IntegriCloud