diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -2697,10 +2697,29 @@ case Builtin::BI__builtin_elementwise_min: case Builtin::BI__builtin_elementwise_max: - case Builtin::BI__builtin_elementwise_bitreverse: if (SemaBuiltinElementwiseMath(TheCall)) return ExprError(); break; + + case Builtin::BI__builtin_elementwise_bitreverse: { + if (PrepareBuiltinElementwiseMathOneArgCall(TheCall)) + return ExprError(); + + const Expr *Arg = TheCall->getArg(0); + QualType ArgTy = Arg->getType(); + QualType EltTy = ArgTy; + + if (auto *VecTy = EltTy->getAs()) + EltTy = VecTy->getElementType(); + + if (!EltTy->isIntegerType()) { + Diag(Arg->getBeginLoc(), diag::err_builtin_invalid_arg_type) + << 1 << /* integer ty */ 6 << ArgTy; + return ExprError(); + } + break; + } + case Builtin::BI__builtin_elementwise_copysign: { if (checkArgCount(*this, TheCall, 2)) return ExprError(); diff --git a/clang/test/Sema/builtins-elementwise-math.c b/clang/test/Sema/builtins-elementwise-math.c --- a/clang/test/Sema/builtins-elementwise-math.c +++ b/clang/test/Sema/builtins-elementwise-math.c @@ -278,13 +278,13 @@ // expected-error@-1 {{too few arguments to function call, expected 1, have 0}} i = __builtin_elementwise_bitreverse(f); - // expected-error@-1 {{1st argument must be a integer type (was 'float')}} - + // expected-error@-1 {{1st argument must be a vector of integers (was 'float')}} + i = __builtin_elementwise_bitreverse(f, f); // expected-error@-1 {{too many arguments to function call, expected 1, have 2}} u = __builtin_elementwise_bitreverse(d); - // expected-error@-1 {{1st argument must be a integer type (was 'double')}} + // expected-error@-1 {{1st argument must be a vector of integers (was 'double')}} } void test_builtin_elementwise_ceil(int i, float f, double d, float4 v, int3 iv, unsigned u, unsigned4 uv) {