Author: erichkeane Date: 2024-09-05T08:24:48-07:00 New Revision: 0c8d6df362fe5b4bce54776e2199623d0382293b
URL: https://github.com/llvm/llvm-project/commit/0c8d6df362fe5b4bce54776e2199623d0382293b DIFF: https://github.com/llvm/llvm-project/commit/0c8d6df362fe5b4bce54776e2199623d0382293b.diff LOG: 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 Added: Modified: clang/lib/Sema/SemaChecking.cpp clang/test/Sema/builtin-unary-fp.c Removed: ################################################################################ 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}} } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits