forked from OSchip/llvm-project
[clang] Fix signedness in vector bitcast evaluation
The included test case triggered a sign assertion on the result in `Success()`. This was caused by the APSInt created for a bitcast having its signedness bit inverted. The second APSInt constructor argument is `isUnsigned`, so invert the result of `isSignedIntegerType`. Differential Revision: https://reviews.llvm.org/D95135
This commit is contained in:
parent
8e3adda820
commit
14947cd047
|
@ -10193,7 +10193,7 @@ bool VectorExprEvaluator::VisitCastExpr(const CastExpr *E) {
|
|||
Elt = SValInt.rotl(i*EltSize+EltSize).zextOrTrunc(EltSize);
|
||||
else
|
||||
Elt = SValInt.rotr(i*EltSize).zextOrTrunc(EltSize);
|
||||
Elts.push_back(APValue(APSInt(Elt, EltTy->isSignedIntegerType())));
|
||||
Elts.push_back(APValue(APSInt(Elt, !EltTy->isSignedIntegerType())));
|
||||
}
|
||||
} else {
|
||||
return Error(E);
|
||||
|
|
|
@ -63,3 +63,10 @@ void vector_literals_valid() {
|
|||
//CHECK: store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %V2
|
||||
float4 V2 = (float4)(1);
|
||||
}
|
||||
|
||||
void vector_literals_with_cast() {
|
||||
// CHECK-LABEL: vector_literals_with_cast
|
||||
// CHECK: store <2 x i32> <i32 12, i32 34>, <2 x i32>*
|
||||
// CHECK: extractelement <2 x i32> %{{[0-9]+}}, i64 0
|
||||
unsigned int withCast = ((int2)((int2)(12, 34))).s0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue