Author: Acthink Yang Date: 2025-05-30T07:09:20-07:00 New Revision: 4d650ef4b3d7a0f21f8681e73586d0319fc3953b
URL: https://github.com/llvm/llvm-project/commit/4d650ef4b3d7a0f21f8681e73586d0319fc3953b DIFF: https://github.com/llvm/llvm-project/commit/4d650ef4b3d7a0f21f8681e73586d0319fc3953b.diff LOG: [Sema] Fix type mismatch error when arguments to elementwise math builtin have different qualifiers, which should be well-formed (#141485) Fixes #141397 Element-wise math builtins (e.g. __builtin_elementwise_max/__builtin_elementwise_pow etc.) fail when their arguments have different qualifications, but should be well-formed. The fix is to use hasSameUnqualifiedType to check if the arguments match. Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaChecking.cpp clang/test/Sema/builtins-elementwise-math.c Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 32266fce4d3cb..dc97883de05d0 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -669,6 +669,7 @@ Bug Fixes in This Version base classes. (GH139452) - Fixed an assertion failure in serialization of constexpr structs containing unions. (#GH140130) - Fixed duplicate entries in TableGen that caused the wrong attribute to be selected. (GH#140701) +- Fixed type mismatch error when 'builtin-elementwise-math' arguments have diff erent qualifiers, this should be well-formed. (#GH141397) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index ba2630e960e6f..373ca549cb23b 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -15572,7 +15572,7 @@ Sema::BuiltinVectorMath(CallExpr *TheCall, if (checkMathBuiltinElementType(*this, LocA, TyA, ArgTyRestr, 1)) return std::nullopt; - if (TyA.getCanonicalType() != TyB.getCanonicalType()) { + if (!Context.hasSameUnqualifiedType(TyA, TyB)) { Diag(LocA, diag::err_typecheck_call_ diff erent_arg_types) << TyA << TyB; return std::nullopt; } diff --git a/clang/test/Sema/builtins-elementwise-math.c b/clang/test/Sema/builtins-elementwise-math.c index b5648a5e5c6e8..01057b3f8d083 100644 --- a/clang/test/Sema/builtins-elementwise-math.c +++ b/clang/test/Sema/builtins-elementwise-math.c @@ -3,6 +3,7 @@ typedef double double2 __attribute__((ext_vector_type(2))); typedef double double4 __attribute__((ext_vector_type(4))); typedef float float2 __attribute__((ext_vector_type(2))); +typedef float float3 __attribute__((ext_vector_type(3))); typedef float float4 __attribute__((ext_vector_type(4))); typedef int int2 __attribute__((ext_vector_type(2))); @@ -1202,3 +1203,13 @@ void test_builtin_elementwise_fma(int i32, int2 v2i32, short i16, c3 = __builtin_elementwise_fma(f32, f32, c3); // expected-error@-1 {{3rd argument must be a scalar or vector of floating-point types (was '_Complex float')}} } + +typedef struct { + float3 b; +} struct_float3; +// This example uncovered a bug #141397 : +// Type mismatch error when 'builtin-elementwise-math' arguments have diff erent qualifiers, this should be well-formed +float3 foo(float3 a,const struct_float3* hi) { + float3 b = __builtin_elementwise_max((float3)(0.0f), a); + return __builtin_elementwise_pow(b, hi->b.yyy); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits