[clang] 0c8d6df - Fix handling of FP-classify where the last arg fails to convert
via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 5 08:24:54 PDT 2024
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 at -1{{reference to overloaded function could not be resolved}}
}
More information about the cfe-commits
mailing list