llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Amr Hesham (AmrDeveloper) <details> <summary>Changes</summary> 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 --- Full diff: https://github.com/llvm/llvm-project/pull/221558.diff 4 Files Affected: - (modified) clang/docs/ReleaseNotes.md (+2) - (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+2) - (modified) clang/lib/Sema/SemaChecking.cpp (+11-2) - (added) clang/test/SemaCXX/vector-shuffle.cpp (+16) ``````````diff 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))}} +} `````````` </details> https://github.com/llvm/llvm-project/pull/221558 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
