forked from OSchip/llvm-project
Fix For pr28288 - Error message in shift of vector values
This fixes an error in type checking of shift of vector values. Patch by Vladimir Yakovlev. Differential Revision: https://reviews.llvm.org/D21678 llvm-svn: 278501
This commit is contained in:
parent
fdb2d99eaf
commit
1d31e45a8b
|
@ -8684,11 +8684,10 @@ static void DiagnoseBadShiftValues(Sema& S, ExprResult &LHS, ExprResult &RHS,
|
|||
<< RHS.get()->getSourceRange();
|
||||
}
|
||||
|
||||
/// \brief Return the resulting type when an OpenCL vector is shifted
|
||||
/// \brief Return the resulting type when a vector is shifted
|
||||
/// by a scalar or vector shift amount.
|
||||
static QualType checkOpenCLVectorShift(Sema &S,
|
||||
ExprResult &LHS, ExprResult &RHS,
|
||||
SourceLocation Loc, bool IsCompAssign) {
|
||||
static QualType checkVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS,
|
||||
SourceLocation Loc, bool IsCompAssign) {
|
||||
// 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)
|
||||
|
@ -8756,11 +8755,9 @@ 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, IsCompAssign);
|
||||
if (LangOpts.ZVector) {
|
||||
// The shift operators for the z vector extensions work basically
|
||||
// like OpenCL shifts, except that neither the LHS nor the RHS is
|
||||
// like general shifts, except that neither the LHS nor the RHS is
|
||||
// allowed to be a "vector bool".
|
||||
if (auto LHSVecType = LHS.get()->getType()->getAs<VectorType>())
|
||||
if (LHSVecType->getVectorKind() == VectorType::AltiVecBool)
|
||||
|
@ -8768,11 +8765,8 @@ QualType Sema::CheckShiftOperands(ExprResult &LHS, ExprResult &RHS,
|
|||
if (auto RHSVecType = RHS.get()->getType()->getAs<VectorType>())
|
||||
if (RHSVecType->getVectorKind() == VectorType::AltiVecBool)
|
||||
return InvalidOperands(Loc, LHS, RHS);
|
||||
return checkOpenCLVectorShift(*this, LHS, RHS, Loc, IsCompAssign);
|
||||
}
|
||||
return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign,
|
||||
/*AllowBothBool*/true,
|
||||
/*AllowBoolConversions*/false);
|
||||
return checkVectorShift(*this, LHS, RHS, Loc, IsCompAssign);
|
||||
}
|
||||
|
||||
// Shifts don't perform usual arithmetic conversions, they just do integer
|
||||
|
|
|
@ -67,3 +67,14 @@ void test_shift_too_much(char x) {
|
|||
(void) (x >> 80); // no-warning
|
||||
(void) (x >> 80); // expected-warning {{shift count >= width of type}}
|
||||
}
|
||||
|
||||
typedef unsigned vec16 __attribute__((vector_size(16)));
|
||||
typedef unsigned vec8 __attribute__((vector_size(8)));
|
||||
|
||||
void vect_shift_1(vec16 *x) { *x = *x << 4; }
|
||||
|
||||
void vect_shift_2(vec16 *x, vec16 y) { *x = *x << y; }
|
||||
|
||||
void vect_shift_3(vec16 *x, vec8 y) {
|
||||
*x = *x << y; // expected-error {{vector operands do not have the same number of elements}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue