PR c++/41994
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 9 Nov 2009 18:32:44 +0000 (18:32 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 9 Nov 2009 18:32:44 +0000 (18:32 +0000)
* pt.c (tsubst_baselink): tsubst the name.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154041 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/conv10.C [new file with mode: 0644]

index 74122c1..f126a10 100644 (file)
@@ -1,3 +1,8 @@
+2009-11-09  Jason Merrill  <jason@redhat.com>
+
+       PR c++/41994
+       * pt.c (tsubst_baselink): tsubst the name.
+
 2009-11-07  Jason Merrill  <jason@redhat.com>
 
        PR c++/37920
index 6e708b3..3efeda8 100644 (file)
@@ -10318,7 +10318,7 @@ tsubst_baselink (tree baselink, tree object_type,
     qualifying_scope = tsubst (qualifying_scope, args,
                               complain, in_decl);
     fns = BASELINK_FUNCTIONS (baselink);
-    optype = BASELINK_OPTYPE (baselink);
+    optype = tsubst (BASELINK_OPTYPE (baselink), args, complain, in_decl);
     if (TREE_CODE (fns) == TEMPLATE_ID_EXPR)
       {
        template_id_p = true;
@@ -10329,6 +10329,8 @@ tsubst_baselink (tree baselink, tree object_type,
                                                complain, in_decl);
       }
     name = DECL_NAME (get_first_fn (fns));
+    if (IDENTIFIER_TYPENAME_P (name))
+      name = mangle_conv_op_name_for_type (optype);
     baselink = lookup_fnfields (qualifying_scope, name, /*protect=*/1);
 
     /* If lookup found a single function, mark it as used at this
@@ -10347,8 +10349,7 @@ tsubst_baselink (tree baselink, tree object_type,
                    BASELINK_FUNCTIONS (baselink),
                    template_args);
     /* Update the conversion operator type.  */
-    BASELINK_OPTYPE (baselink) 
-      = tsubst (optype, args, complain, in_decl);
+    BASELINK_OPTYPE (baselink) = optype;
 
     if (!object_type)
       object_type = current_class_type;
index 740b64d..a470e60 100644 (file)
@@ -1,3 +1,8 @@
+2009-11-09  Jason Merrill  <jason@redhat.com>
+
+       PR c++/41994
+       * g++.dg/template/conv10.C: New.
+
 2009-11-07  Jason Merrill  <jason@redhat.com>
 
        PR c++/37920
diff --git a/gcc/testsuite/g++.dg/template/conv10.C b/gcc/testsuite/g++.dg/template/conv10.C
new file mode 100644 (file)
index 0000000..0a001be
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/41994
+
+template<typename T> struct A
+{
+  operator T();
+  A() { T (A::*f)() = &A::operator T; }
+};
+
+A<int> a;