Commit ff14c1f7 by Jason Merrill Committed by Jason Merrill

re PR c++/41994 (ICE with &A::operator T)

	PR c++/41994
	* pt.c (tsubst_baselink): tsubst the name.

From-SVN: r154041
parent 8b0c13a8
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> 2009-11-07 Jason Merrill <jason@redhat.com>
PR c++/37920 PR c++/37920
......
...@@ -10318,7 +10318,7 @@ tsubst_baselink (tree baselink, tree object_type, ...@@ -10318,7 +10318,7 @@ tsubst_baselink (tree baselink, tree object_type,
qualifying_scope = tsubst (qualifying_scope, args, qualifying_scope = tsubst (qualifying_scope, args,
complain, in_decl); complain, in_decl);
fns = BASELINK_FUNCTIONS (baselink); fns = BASELINK_FUNCTIONS (baselink);
optype = BASELINK_OPTYPE (baselink); optype = tsubst (BASELINK_OPTYPE (baselink), args, complain, in_decl);
if (TREE_CODE (fns) == TEMPLATE_ID_EXPR) if (TREE_CODE (fns) == TEMPLATE_ID_EXPR)
{ {
template_id_p = true; template_id_p = true;
...@@ -10329,6 +10329,8 @@ tsubst_baselink (tree baselink, tree object_type, ...@@ -10329,6 +10329,8 @@ tsubst_baselink (tree baselink, tree object_type,
complain, in_decl); complain, in_decl);
} }
name = DECL_NAME (get_first_fn (fns)); 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); baselink = lookup_fnfields (qualifying_scope, name, /*protect=*/1);
/* If lookup found a single function, mark it as used at this /* If lookup found a single function, mark it as used at this
...@@ -10347,8 +10349,7 @@ tsubst_baselink (tree baselink, tree object_type, ...@@ -10347,8 +10349,7 @@ tsubst_baselink (tree baselink, tree object_type,
BASELINK_FUNCTIONS (baselink), BASELINK_FUNCTIONS (baselink),
template_args); template_args);
/* Update the conversion operator type. */ /* Update the conversion operator type. */
BASELINK_OPTYPE (baselink) BASELINK_OPTYPE (baselink) = optype;
= tsubst (optype, args, complain, in_decl);
if (!object_type) if (!object_type)
object_type = current_class_type; object_type = current_class_type;
......
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> 2009-11-07 Jason Merrill <jason@redhat.com>
PR c++/37920 PR c++/37920
......
// PR c++/41994
template<typename T> struct A
{
operator T();
A() { T (A::*f)() = &A::operator T; }
};
A<int> a;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment