From 0c8d6df362fe5b4bce54776e2199623d0382293b Mon Sep 17 00:00:00 2001 From: erichkeane Date: Thu, 5 Sep 2024 08:18:41 -0700 Subject: [PATCH] Fix handling of FP-classify where the last arg fails to convert The last argument of an FP-classify function was checked for vailidity as an expression, but we never ensured that the usual unary conversions/etc properly resulted in a valid value. Thus, when we got the value, it was null, so we had a null dereference. This patch instead fails out/marks the function call as invalid if the argument is incorrect. I DID consider just allowing it to continue, but the result was an extraneous error about how the last argument wasn't a float (in this case, it was an overload set). Fixes: #107411 --- clang/lib/Sema/SemaChecking.cpp | 17 +++++++++++++---- clang/test/Sema/builtin-unary-fp.c | 4 ++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 2aab52160afa79..99500daca295c9 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -4936,10 +4936,19 @@ bool Sema::BuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs, // Usual Unary Conversions will convert half to float, which we want for // machines that use fp16 conversion intrinsics. Else, we wnat to leave the // type how it is, but do normal L->Rvalue conversions. - if (Context.getTargetInfo().useFP16ConversionIntrinsics()) - OrigArg = UsualUnaryConversions(OrigArg).get(); - else - OrigArg = DefaultFunctionArrayLvalueConversion(OrigArg).get(); + if (Context.getTargetInfo().useFP16ConversionIntrinsics()) { + ExprResult Res = UsualUnaryConversions(OrigArg); + + if (!Res.isUsable()) + return true; + OrigArg = Res.get(); + } else { + ExprResult Res = DefaultFunctionArrayLvalueConversion(OrigArg); + + if (!Res.isUsable()) + return true; + OrigArg = Res.get(); + } TheCall->setArg(FPArgNo, OrigArg); QualType VectorResultTy; diff --git a/clang/test/Sema/builtin-unary-fp.c b/clang/test/Sema/builtin-unary-fp.c index 3f4f65eeb73a1e..fb8e341156a59e 100644 --- a/clang/test/Sema/builtin-unary-fp.c +++ b/clang/test/Sema/builtin-unary-fp.c @@ -14,4 +14,8 @@ void a(void) { check(__builtin_fpclassify(0, 1, 2, 3, 4.5, 5.0)); // expected-warning{{implicit conversion from 'double' to 'int' changes value from 4.5 to 4}} check(__builtin_fpclassify(0, 0, 0, 0, 1)); // expected-error{{too few arguments}} check(__builtin_fpclassify(0, 0, 0, 0, 0, 1, 0)); // expected-error{{too many arguments}} + + check(__builtin_fpclassify(0,0,0,0,0, (invalid))); // expected-error{{use of undeclared identifier 'invalid'}} + check(__builtin_fpclassify(0,0,0,0,0, (inf))); // expected-error{{use of undeclared identifier 'inf'}} + // expected-error@-1{{reference to overloaded function could not be resolved}} }