https://github.com/AmrDeveloper created https://github.com/llvm/llvm-project/pull/221558
Clang used to accept a vector with an integer representation as a valid mask; otherwise, it reported a type mismatch. This led to accepting a vector of booleans as a valid mask and reporting that types are not equal if both arguments are equal but not vectors of integers. Currently, it checks for the mask type and reports a clear error message if the mask is a vector of bool or not a vector of integers Fixes: #218132 >From 89ed3e32f83e9b1e1f36f3350c914e55dddd4320 Mon Sep 17 00:00:00 2001 From: Amr Hesham <[email protected]> Date: Sat, 5 Sep 2026 20:08:01 +0200 Subject: [PATCH] [Clang][Sema] Report diagnostic for invalid mask in shufflevector --- clang/docs/ReleaseNotes.md | 2 ++ clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 ++ clang/lib/Sema/SemaChecking.cpp | 13 +++++++++++-- clang/test/SemaCXX/vector-shuffle.cpp | 16 ++++++++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 clang/test/SemaCXX/vector-shuffle.cpp diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md index a43ed2b924622..0c4756572f52c 100644 --- a/clang/docs/ReleaseNotes.md +++ b/clang/docs/ReleaseNotes.md @@ -482,6 +482,8 @@ features cannot lower the translation-unit ABI level; dimension that is a zero integer constant, as in `struct Empty vla[n]` or `int vla[n][0]`. (#GH28328) +- Clang now diagnoses passing wrong vector type as a mask to `__builtin_shufflevector`. (#GH218132) + ### Improvements to Clang's time-trace ### Improvements to Coverage Mapping diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 9bd0a526654c7..b118c9d0f3fbe 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11446,6 +11446,8 @@ def err_shufflevector_argument_too_large : Error< "of vector elements">; def err_shufflevector_minus_one_is_undefined_behavior_constexpr : Error< "index for __builtin_shufflevector not within the bounds of the input vectors; index of -1 found at position %0 is not permitted in a constexpr context">; +def err_shufflevector_incompatible_mask : Error< + "second argument to __builtin_shufflevector must be a vector of any integer type other than boolean (was %0)">; def err_convertvector_non_vector : Error< "first argument to __builtin_convertvector must be a vector">; diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index f0a1a529841b2..a670c8a19b1a5 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -6588,8 +6588,17 @@ ExprResult Sema::BuiltinShuffleVector(CallExpr *TheCall) { // with mask. If so, verify that RHS is an integer vector type with the // same number of elts as lhs. if (NumArgs == 2) { - if (!RHSType->hasIntegerRepresentation() || - RHSType->castAs<VectorType>()->getNumElements() != NumElements) + auto *RHSVecType = RHSType->castAs<VectorType>(); + if (RHSVecType->getElementType()->isBooleanType() || + !RHSVecType->getElementType()->isIntegerType()) { + return ExprError(Diag(TheCall->getBeginLoc(), + diag::err_shufflevector_incompatible_mask) + << RHSType + << SourceRange(TheCall->getArg(0)->getBeginLoc(), + TheCall->getArg(1)->getEndLoc())); + } + + if (RHSVecType->getNumElements() != NumElements) return ExprError(Diag(TheCall->getBeginLoc(), diag::err_vec_builtin_incompatible_vector) << TheCall->getDirectCallee() diff --git a/clang/test/SemaCXX/vector-shuffle.cpp b/clang/test/SemaCXX/vector-shuffle.cpp new file mode 100644 index 0000000000000..c204db2d02a39 --- /dev/null +++ b/clang/test/SemaCXX/vector-shuffle.cpp @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -Wno-null-conversion -fsyntax-only -verify + +typedef bool v8b __attribute__((ext_vector_type(8))); +typedef float v8f __attribute__((ext_vector_type(8))); + +void vector_of_bool_mask() { + v8b a; + v8b b; + auto r = __builtin_shufflevector(a, b); // expected-error {{second argument to __builtin_shufflevector must be a vector of any integer type other than boolean (was 'v8b' (vector of 8 'bool' values))}} +} + +void vector_of_float_mask() { + v8f a; + v8f b; + auto r = __builtin_shufflevector(a, b); // expected-error {{second argument to __builtin_shufflevector must be a vector of any integer type other than boolean (was 'v8f' (vector of 8 'float' values))}} +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
