[Clang] prevented assertion failure by handling integral to boolean conversions for boolean vectors (#108657)
Fixes #108326
This commit is contained in:
@@ -403,6 +403,7 @@ Bug Fixes to C++ Support
|
||||
- Avoided a redundant friend declaration instantiation under a certain ``consteval`` context. (#GH107175)
|
||||
- Fixed an assertion failure in debug mode, and potential crashes in release mode, when
|
||||
diagnosing a failed cast caused indirectly by a failed implicit conversion to the type of the constructor parameter.
|
||||
- Fixed an assertion failure by adjusting integral to boolean vector conversions (#GH108326)
|
||||
|
||||
Bug Fixes to AST Handling
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
@@ -9868,7 +9868,9 @@ static bool tryVectorConvertAndSplat(Sema &S, ExprResult *scalar,
|
||||
// if necessary.
|
||||
CastKind scalarCast = CK_NoOp;
|
||||
|
||||
if (vectorEltTy->isIntegralType(S.Context)) {
|
||||
if (vectorEltTy->isBooleanType() && scalarTy->isIntegralType(S.Context)) {
|
||||
scalarCast = CK_IntegralToBoolean;
|
||||
} else if (vectorEltTy->isIntegralType(S.Context)) {
|
||||
if (S.getLangOpts().OpenCL && (scalarTy->isRealFloatingType() ||
|
||||
(scalarTy->isIntegerType() &&
|
||||
S.Context.getIntegerTypeOrder(vectorEltTy, scalarTy) < 0))) {
|
||||
|
||||
@@ -11,6 +11,7 @@ typedef float t3 __attribute__ ((vector_size (16)));
|
||||
typedef __typeof__(sizeof(int)) size_t;
|
||||
typedef unsigned long ulong2 __attribute__ ((ext_vector_type(2)));
|
||||
typedef size_t stride4 __attribute__((ext_vector_type(4)));
|
||||
typedef _Bool bool4 __attribute__(( ext_vector_type(4) ));
|
||||
|
||||
static void test(void) {
|
||||
float2 vec2;
|
||||
@@ -19,6 +20,7 @@ static void test(void) {
|
||||
int4 ivec4;
|
||||
short8 ish8;
|
||||
t3 vec4_3;
|
||||
bool4 bvec4 = 0;
|
||||
int *ptr;
|
||||
int i;
|
||||
|
||||
@@ -51,6 +53,9 @@ static void test(void) {
|
||||
ivec4 -= ivec4;
|
||||
ivec4 |= ivec4;
|
||||
ivec4 += ptr; // expected-error {{cannot convert between vector and non-scalar values ('int4' (vector of 4 'int' values) and 'int *')}}
|
||||
|
||||
bvec4 != 0; // expected-warning {{inequality comparison result unused}} \
|
||||
// expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
|
||||
}
|
||||
|
||||
typedef __attribute__(( ext_vector_type(2) )) float2 vecfloat2; // expected-error{{invalid vector element type 'float2' (vector of 2 'float' values)}}
|
||||
|
||||
Reference in New Issue
Block a user