Author: Timm Bäder Date: 2024-02-15T07:23:35+01:00 New Revision: b200dfc15904f0f7f19443fd5a399242c80213dc
URL: https://github.com/llvm/llvm-project/commit/b200dfc15904f0f7f19443fd5a399242c80213dc DIFF: https://github.com/llvm/llvm-project/commit/b200dfc15904f0f7f19443fd5a399242c80213dc.diff LOG: [clang][Interp] Fix calling invalid function pointers Checking for isConstexpr() is wrong; we need to (try to) call the function and let later code diagnose the failure accordingly. 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 77c724f08e8eef..5bbb9f169a800e 100644 --- a/clang/lib/AST/Interp/Interp.h +++ b/clang/lib/AST/Interp/Interp.h @@ -2071,8 +2071,7 @@ inline bool CallPtr(InterpState &S, CodePtr OpPC, uint32_t ArgSize) { const FunctionPointer &FuncPtr = S.Stk.pop<FunctionPointer>(); const Function *F = FuncPtr.getFunction(); - if (!F || !F->isConstexpr()) - return false; + assert(F); assert(ArgSize >= F->getWrittenArgSize()); uint32_t VarArgSize = ArgSize - F->getWrittenArgSize(); diff --git a/clang/test/AST/Interp/functions.cpp b/clang/test/AST/Interp/functions.cpp index 7b8278cf13aa88..34a832c794c75d 100644 --- a/clang/test/AST/Interp/functions.cpp +++ b/clang/test/AST/Interp/functions.cpp @@ -187,6 +187,14 @@ namespace FunctionReturnType { static_assert(!!op, ""); constexpr int (*op2)(int, int) = nullptr; static_assert(!op2, ""); + + int m() { return 5;} // ref-note {{declared here}} \ + // expected-note {{declared here}} + constexpr int (*invalidFnPtr)() = m; + static_assert(invalidFnPtr() == 5, ""); // ref-error {{not an integral constant expression}} \ + // ref-note {{non-constexpr function 'm'}} \ + // expected-error {{not an integral constant expression}} \ + // expected-note {{non-constexpr function 'm'}} } namespace Comparison { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits