https://gcc.gnu.org/g:40ee8d4e9f95a2217c1e0d72477522f98807f118
commit r16-7867-g40ee8d4e9f95a2217c1e0d72477522f98807f118 Author: Marek Polacek <[email protected]> Date: Mon Mar 2 10:42:29 2026 -0500 c++/reflection: static member template operator [PR124324] 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. Reviewed-by: Jason Merrill <[email protected]> Diff: --- gcc/cp/reflect.cc | 1 + gcc/testsuite/g++.dg/reflect/extract11.C | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc index 09b0632a6194..5d4cc16c67aa 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 000000000000..054cdde19dff --- /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);
