On 5/25/26 11:58 AM, Eczbek wrote:
Bootstrapped/regtested on x86_64-pc-linux-gnu.

This accidentally allows `&(A::operator int);` to compile.

As Patrick mentioned on the other version of the patch, this is an existing bug with &(A::f<int>). Patrick, is there a PR for that?

`auto f = &(A::operator int);` correctly errors, but emits a funny message: "note: (a pointer 
to member can only be formed with '&A::operator int<int>')"

-- >8 --

Taking the address of a conversion function template instantiation
incorrectly errors.

        PR c++/122383

gcc/cp/ChangeLog:

        * pt.cc (resolve_overloaded_unification): If expr represents a
        conversion function template instantiation, call
        lookup_template_function with baselink, then fall through to
        TEMPLATE_ID_EXPR check.

Let's describe implementation strategy in the main commit message and/or code comments rather than in the ChangeLog entry.

@@ -25212,7 +25213,18 @@ resolve_overloaded_unification (tree tparms,
/* Strip baselink information. */
    if (BASELINK_P (arg))
-    arg = BASELINK_FUNCTIONS (arg);
+    {
+      baselink = arg;
+      arg = BASELINK_FUNCTIONS (arg);
+    }
+
+  if (TREE_CODE (arg) == OVERLOAD
+      && IDENTIFIER_CONV_OP_P (OVL_NAME (arg)))
+    {
+      tree targs = make_tree_vec (1);
+      TREE_VEC_ELT (targs, 0) = BASELINK_OPTYPE (baselink);

This assumes a template with a single template parameter; it doesn't work for e.g.

struct A {
  template<typename T, typename U>
  operator T U::*() {
    return 0;
  }
};

int main() {
  (void) &A::operator int A::*;
}

to handle the general case you need to deduce the template arguments.

Jason

Reply via email to