https://github.com/a-tarasyuk updated https://github.com/llvm/llvm-project/pull/108657
>From 70d1be2a2a0f2f44cdd70bfb4397e7a36f1c9f30 Mon Sep 17 00:00:00 2001 From: Oleksandr T <oleksandr.taras...@outlook.com> Date: Sat, 14 Sep 2024 01:46:28 +0300 Subject: [PATCH 1/2] [Clang] prevented assertion failure by handling integral to boolean conversions for boolean vectors --- clang/docs/ReleaseNotes.rst | 1 + clang/lib/Sema/SemaExpr.cpp | 7 ++++++- clang/test/Sema/ext_vector_casts.c | 5 +++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 3929a9fb599259..e9d8d1b789506d 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -386,6 +386,7 @@ Bug Fixes to C++ Support - Fixed a crash in the typo correction of an invalid CTAD guide. (#GH107887) - Fixed a crash when clang tries to subtitute parameter pack while retaining the parameter pack. #GH63819, #GH107560 +- 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 8f3e15cc9a9bb7..15b233212b770b 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -9868,7 +9868,12 @@ static bool tryVectorConvertAndSplat(Sema &S, ExprResult *scalar, // if necessary. CastKind scalarCast = CK_NoOp; - if (vectorEltTy->isIntegralType(S.Context)) { + if (vectorEltTy->isBooleanType()) { + if (scalarTy->isIntegralType(S.Context)) + scalarCast = CK_IntegralToBoolean; + else if (!scalarTy->isBooleanType()) + return true; + } 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..6338035a61aad6 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 float 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)}} >From b7dc3966847429864fc56886370833afd40e38a5 Mon Sep 17 00:00:00 2001 From: Oleksandr T <oleksandr.taras...@outlook.com> Date: Tue, 17 Sep 2024 13:36:52 +0300 Subject: [PATCH 2/2] eliminate redundant logic that disallows non-boolean scalar casts --- clang/lib/Sema/SemaExpr.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 15b233212b770b..17dd3aeb6e3b6f 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -9868,11 +9868,8 @@ static bool tryVectorConvertAndSplat(Sema &S, ExprResult *scalar, // if necessary. CastKind scalarCast = CK_NoOp; - if (vectorEltTy->isBooleanType()) { - if (scalarTy->isIntegralType(S.Context)) - scalarCast = CK_IntegralToBoolean; - else if (!scalarTy->isBooleanType()) - return true; + if (vectorEltTy->isBooleanType() && scalarTy->isIntegralType(S.Context)) { + scalarCast = CK_IntegralToBoolean; } else if (vectorEltTy->isIntegralType(S.Context)) { if (S.getLangOpts().OpenCL && (scalarTy->isRealFloatingType() || (scalarTy->isIntegerType() && _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits