[clang] WIP [clang] Recursively instantiate constexpr template functions. (PR #140865)
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Wed May 21 01:17:30 PDT 2025
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.wu at 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 at -1 {{forward declaration of template entity is here}}
- // expected-note at -2 {{forward declaration of template entity is here}}
- // expected-note at -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 at -1 {{instantiation of function 'non_pure_virtual_function::B<int>::bar' required here, but no definition is available}}
-// expected-warning at -2 {{instantiation of function 'non_pure_virtual_function::B<int>::bar' required here, but no definition is available}}
-// expected-note at -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 at -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 at -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 at -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));
More information about the cfe-commits
mailing list