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 { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits