Author: Oleksandr T. Date: 2024-09-20T09:14:26-04:00 New Revision: da36603148baf37d3625aa030b4c05bf5785cae2
URL: https://github.com/llvm/llvm-project/commit/da36603148baf37d3625aa030b4c05bf5785cae2 DIFF: https://github.com/llvm/llvm-project/commit/da36603148baf37d3625aa030b4c05bf5785cae2.diff LOG: [Clang] prevented assertion failure by handling integral to boolean conversions for boolean vectors (#108657) Fixes #108326 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaExpr.cpp clang/test/Sema/ext_vector_casts.c Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 3f146cb9247a78..0a1d0fd85e7ae0 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -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 ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 2f7e9c754ce095..66df9c969256a2 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -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))) { diff --git a/clang/test/Sema/ext_vector_casts.c b/clang/test/Sema/ext_vector_casts.c index 48440735d88ea9..8bf2737e0bfab1 100644 --- a/clang/test/Sema/ext_vector_casts.c +++ b/clang/test/Sema/ext_vector_casts.c @@ -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)}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits