On 3/2/26 6:01 PM, Marek Polacek wrote:
On Mon, Mar 02, 2026 at 03:35:42PM -0500, Jason Merrill wrote:
On 3/2/26 11:21 AM, Marek Polacek wrote:
Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
-- >8 --
This testcase didn't compile properly because eval_is_function and
eval_extract got an unresolved TEMPLATE_ID_EXPR. We used to resolve
them in process_metafunction but I removed that call, thinking it was
no longer necessary. This patch puts it back.
Why isn't it resolved by substitute?
I suppose that would be better since eval_can_substitute already does it.
Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
OK.
-- >8 --
This testcase didn't compile properly because eval_is_function and
eval_extract got an unresolved TEMPLATE_ID_EXPR. We used to resolve
them in process_metafunction but I removed that call, thinking it was
no longer necessary. This patch puts it in eval_substitute which
should cover it.
PR c++/124324
gcc/cp/ChangeLog:
* reflect.cc (eval_substitute): Call resolve_nondeduced_context.
gcc/testsuite/ChangeLog:
* g++.dg/reflect/extract11.C: New test.
---
gcc/cp/reflect.cc | 1 +
gcc/testsuite/g++.dg/reflect/extract11.C | 18 ++++++++++++++++++
2 files changed, 19 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/reflect/extract11.C
diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc
index 09b0632a619..5d4cc16c67a 100644
--- a/gcc/cp/reflect.cc
+++ b/gcc/cp/reflect.cc
@@ -5399,6 +5399,7 @@ eval_substitute (location_t loc, const constexpr_ctx *ctx,
if (DECL_FUNCTION_TEMPLATE_P (r))
r = ovl_make (r, NULL_TREE);
ret = lookup_template_function (r, rvec);
+ ret = resolve_nondeduced_context (ret, tf_none);
}
return get_reflection_raw (loc, ret);
}
diff --git a/gcc/testsuite/g++.dg/reflect/extract11.C
b/gcc/testsuite/g++.dg/reflect/extract11.C
new file mode 100644
index 00000000000..054cdde19df
--- /dev/null
+++ b/gcc/testsuite/g++.dg/reflect/extract11.C
@@ -0,0 +1,18 @@
+// PR c++/124324
+// { dg-do compile { target c++26 } }
+// { dg-additional-options "-freflection" }
+
+#include <meta>
+
+consteval std::meta::info worst_sizeof_p1(std::meta::info ty) {
+ static constexpr auto lam = []<class T>() static { return sizeof(T); };
+ return substitute(^^decltype(lam)::template operator(), {ty});
+}
+
+constexpr std::meta::info ws = worst_sizeof_p1(^^int);
+static_assert([: ws :]() == 4);
+static_assert(is_function(ws));
+static_assert(is_static_member(ws));
+
+using F = size_t();
+constexpr F* f = extract<F*>(ws);
base-commit: 435346eafadece9d045874ba000cb4a53f625f0c