[Clang] prevented assertion failure by handling integral to boolean conversions for boolean vectors (#108657)

Fixes #108326
This commit is contained in:
Oleksandr T.
2024-09-20 16:14:26 +03:00
committed by GitHub
parent 03635b3215
commit da36603148
3 changed files with 9 additions and 1 deletions

View File

@@ -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
^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@@ -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))) {

View File

@@ -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)}}