https://github.com/hokein created https://github.com/llvm/llvm-project/pull/140865
See https://github.com/llvm/llvm-project/issues/120108 TODO: test the patch >From 31b94099a420dc9606c84771e9ba6365fadafe20 Mon Sep 17 00:00:00 2001 From: Haojian Wu <hokein...@gmail.com> Date: Wed, 21 May 2025 10:14:28 +0200 Subject: [PATCH] [clang] Recursively instantiate constexpr template functions. --- clang/lib/Sema/SemaExpr.cpp | 2 +- .../instantiate-pure-virtual-function.cpp | 11 +---------- clang/unittests/Support/TimeProfilerTest.cpp | 2 +- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 2c81f7c583eb6..d2149bdbac054 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -18485,7 +18485,7 @@ void Sema::MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, // Do not defer instantiations of constexpr functions, to avoid the // expression evaluator needing to call back into Sema if it sees a // call to such a function. - InstantiateFunctionDefinition(PointOfInstantiation, Func); + InstantiateFunctionDefinition(PointOfInstantiation, Func, true); else { Func->setInstantiationIsPending(true); PendingInstantiations.push_back( diff --git a/clang/test/SemaTemplate/instantiate-pure-virtual-function.cpp b/clang/test/SemaTemplate/instantiate-pure-virtual-function.cpp index caec42b6b77f9..adb0f3310ff68 100644 --- a/clang/test/SemaTemplate/instantiate-pure-virtual-function.cpp +++ b/clang/test/SemaTemplate/instantiate-pure-virtual-function.cpp @@ -43,18 +43,9 @@ namespace non_pure_virtual_function { constexpr void foo(const T &) { bar(1); } virtual constexpr void bar(unsigned int); // expected-warning {{inline function 'non_pure_virtual_function::B<int>::bar' is not defined}} - // expected-note@-1 {{forward declaration of template entity is here}} - // expected-note@-2 {{forward declaration of template entity is here}} - // expected-note@-3 {{forward declaration of template entity is here}} }; - template <typename T> class D : public B<T> { // expected-warning {{instantiation of function 'non_pure_virtual_function::B<int>::bar' required here, but no definition is available}} -// expected-warning@-1 {{instantiation of function 'non_pure_virtual_function::B<int>::bar' required here, but no definition is available}} -// expected-warning@-2 {{instantiation of function 'non_pure_virtual_function::B<int>::bar' required here, but no definition is available}} -// expected-note@-3 {{add an explicit instantiation declaration to suppress this warning if 'non_pure_virtual_function::B<int>::bar' is explicitly instantiated in another translation unit}} -// expected-note@-4 {{add an explicit instantiation declaration to suppress this warning if 'non_pure_virtual_function::B<int>::bar' is explicitly instantiated in another translation unit}} -// expected-note@-5 {{add an explicit instantiation declaration to suppress this warning if 'non_pure_virtual_function::B<int>::bar' is explicitly instantiated in another translation unit}} -// expected-note@-6 {{used here}} + template <typename T> class D : public B<T> { // expected-note@ {{used here}} public: constexpr void bar(unsigned int) override { } diff --git a/clang/unittests/Support/TimeProfilerTest.cpp b/clang/unittests/Support/TimeProfilerTest.cpp index 7698742426dfc..49a24bb62bdb0 100644 --- a/clang/unittests/Support/TimeProfilerTest.cpp +++ b/clang/unittests/Support/TimeProfilerTest.cpp @@ -332,8 +332,8 @@ Frontend (test.cc) | | InstantiateFunction (fooA<int>, a.h:7) | | | InstantiateFunction (fooB<int>, b.h:8) | | | | DeferInstantiation (fooC<int>) +| | | | InstantiateFunction (fooC<int>, b.h:3) | | | DeferInstantiation (fooMTA<int>) -| | | InstantiateFunction (fooC<int>, b.h:3) | | | InstantiateFunction (fooMTA<int>, a.h:4) )", buildTraceGraph(Json)); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits