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

Reply via email to