Hello, I am looking for feedback on this patch. It additionally allows `&(A::operator int)` to compile, and I'm not sure how to fix this. Bootstrapped/regtested on x86_64-pc-linux-gnu.
-- >8 -- >From 3577df94d250407f322ce9fd2e77667dc625f803 Mon Sep 17 00:00:00 2001 From: Eczbek <[email protected]> Date: Fri, 15 May 2026 11:45:07 -0400 Subject: [PATCH] c++: Fix taking address of conversion operator template instantiation [PR122383] PR c++/122383 gcc/cp/ChangeLog: * pt.cc (resolve_nondeduced_context): If expr is a conversion operator template instantiation, call lookup_template_function, then fall through to TEMPLATE_ID_EXPR. gcc/testsuite/ChangeLog: * g++.dg/cpp/pr122383.C: New test. --- gcc/cp/pt.cc | 11 ++++++++++- gcc/testsuite/g++.dg/cpp/pr122383.C | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp/pr122383.C diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 42e82e305aa..db8ac48ff58 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -25361,7 +25361,16 @@ resolve_nondeduced_context (tree orig_expr, tsubst_flags_t complain) baselink = expr; expr = BASELINK_FUNCTIONS (expr); } - + if (TREE_CODE (expr) == OVERLOAD + && IDENTIFIER_CONV_OP_P (OVL_NAME (expr))) + { + if (tree conv_type = BASELINK_OPTYPE (baselink)) + { + tree targs = make_tree_vec (1); + TREE_VEC_ELT (targs, 0) = conv_type; + expr = lookup_template_function (expr, targs); + } + } if (TREE_CODE (expr) == TEMPLATE_ID_EXPR) { int good = 0; diff --git a/gcc/testsuite/g++.dg/cpp/pr122383.C b/gcc/testsuite/g++.dg/cpp/pr122383.C new file mode 100644 index 00000000000..074195abd61 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/pr122383.C @@ -0,0 +1,18 @@ +// PR c++/122383 +// { dg-do compile } + +struct A { + template<typename T> + operator T() { + return 0; + } +}; + +template<typename U> +void f(U(A::*)()) {} + +int main() { + &A::operator int; + + f(&A::operator int); +} -- 2.54.0
