[clang] 91ffc12 - [clang][Interp] Pass callee decl to null_callee diagnostics (#104426)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 15 04:18:37 PDT 2024
Author: Timm Baeder
Date: 2024-08-15T13:18:33+02:00
New Revision: 91ffc12a820164bdebb1a388b5d7f41a6f25ce04
URL: https://github.com/llvm/llvm-project/commit/91ffc12a820164bdebb1a388b5d7f41a6f25ce04
DIFF: https://github.com/llvm/llvm-project/commit/91ffc12a820164bdebb1a388b5d7f41a6f25ce04.diff
LOG: [clang][Interp] Pass callee decl to null_callee diagnostics (#104426)
The callee is null, not the full call expression.
Added:
Modified:
clang/lib/AST/Interp/Interp.h
clang/test/AST/Interp/functions.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h
index 3eab0cfd871385..c2d73f32f0b20c 100644
--- a/clang/lib/AST/Interp/Interp.h
+++ b/clang/lib/AST/Interp/Interp.h
@@ -2702,9 +2702,9 @@ inline bool CallPtr(InterpState &S, CodePtr OpPC, uint32_t ArgSize,
const Function *F = FuncPtr.getFunction();
if (!F) {
- const Expr *E = S.Current->getExpr(OpPC);
+ const auto *E = cast<CallExpr>(S.Current->getExpr(OpPC));
S.FFDiag(E, diag::note_constexpr_null_callee)
- << const_cast<Expr *>(E) << E->getSourceRange();
+ << const_cast<Expr *>(E->getCallee()) << E->getSourceRange();
return false;
}
diff --git a/clang/test/AST/Interp/functions.cpp b/clang/test/AST/Interp/functions.cpp
index f190262ad3ebee..b00f59a8d8d433 100644
--- a/clang/test/AST/Interp/functions.cpp
+++ b/clang/test/AST/Interp/functions.cpp
@@ -221,6 +221,17 @@ namespace Comparison {
static_assert(pg == &g, "");
}
+ constexpr int Double(int n) { return 2 * n; }
+ constexpr int Triple(int n) { return 3 * n; }
+ constexpr int Twice(int (*F)(int), int n) { return F(F(n)); }
+ constexpr int Quadruple(int n) { return Twice(Double, n); }
+ constexpr auto Select(int n) -> int (*)(int) {
+ return n == 2 ? &Double : n == 3 ? &Triple : n == 4 ? &Quadruple : 0;
+ }
+ constexpr int Apply(int (*F)(int), int n) { return F(n); } // both-note {{'F' evaluates to a null function pointer}}
+
+ constexpr int Invalid = Apply(Select(0), 0); // both-error {{must be initialized by a constant expression}} \
+ // both-note {{in call to 'Apply(nullptr, 0)'}}
}
struct F {
More information about the cfe-commits
mailing list