diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -8393,7 +8393,7 @@ // Allow ?: operations in which both operands have the same // built-in sizeless type. - if (LHSTy->isSizelessBuiltinType() && LHSTy == RHSTy) + if (LHSTy->isSizelessBuiltinType() && Context.hasSameType(LHSTy, RHSTy)) return LHSTy; // Emit a better diagnostic if one of the expressions is a null pointer diff --git a/clang/test/Sema/riscv-types.c b/clang/test/Sema/riscv-types.c --- a/clang/test/Sema/riscv-types.c +++ b/clang/test/Sema/riscv-types.c @@ -134,3 +134,12 @@ // CHECK: __rvv_int8mf2_t x43; __rvv_int8mf2_t x43; } + +typedef __rvv_bool4_t vbool4_t; +__rvv_bool4_t get_rvv_bool4(); +vbool4_t get_vbool4_t(); + +void func1(int sel) { + // CHECK: vbool4_t t0 = sel ? get_rvv_bool4() : get_vbool4_t(); + vbool4_t t0 = sel ? get_rvv_bool4() : get_vbool4_t(); +} diff --git a/clang/test/Sema/sizeless-1.c b/clang/test/Sema/sizeless-1.c --- a/clang/test/Sema/sizeless-1.c +++ b/clang/test/Sema/sizeless-1.c @@ -57,6 +57,7 @@ static svint8_t static_int8; // expected-error {{non-local variable with sizeless type 'svint8_t'}} svint8_t local_int8; + int8_typedef typedef_int8; svint16_t local_int16; svint8_t __attribute__((aligned)) aligned_int8_1; // expected-error {{'aligned' attribute cannot be applied to sizeless type 'svint8_t'}} @@ -137,6 +138,7 @@ const_volatile_int8 = local_int8; // expected-error {{cannot assign to variable 'const_volatile_int8' with const-qualified type 'const volatile svint8_t'}} init_int8 = sel ? init_int8 : local_int8; + init_int8 = sel ? init_int8 : typedef_int8; init_int8 = sel ? init_int8 : const_int8; init_int8 = sel ? volatile_int8 : const_int8; init_int8 = sel ? volatile_int8 : const_volatile_int8;