Commit 3e0ec82f by Mark Mitchell

re PR c++/6492 (New boost regression (friends))

	PR c++/6492
	* pt.c (tsubst_friend_class): If the friend has an explicit scope,
	enter that scope before name lookup.

From-SVN: r52951
parent 30482eb0
......@@ -4831,12 +4831,19 @@ tsubst_friend_class (friend_tmpl, args)
{
tree friend_type;
tree tmpl;
tree context;
/* First, we look for a class template. */
if (DECL_CONTEXT (friend_tmpl))
tmpl = friend_tmpl;
else
context = DECL_CONTEXT (friend_tmpl);
if (context)
{
if (TREE_CODE (context) == NAMESPACE_DECL)
push_nested_namespace (context);
else
push_nested_class (context, 2);
}
/* First, we look for a class template. */
tmpl = lookup_name (DECL_NAME (friend_tmpl), /*prefer_type=*/0);
/* But, if we don't find one, it might be because we're in a
......@@ -4855,7 +4862,6 @@ tsubst_friend_class (friend_tmpl, args)
tmpl = lookup_name (DECL_NAME (friend_tmpl), /*prefer_type=*/1);
tmpl = maybe_get_template_decl_from_type_decl (tmpl);
}
}
if (tmpl && DECL_CLASS_TEMPLATE_P (tmpl))
{
......@@ -4865,12 +4871,15 @@ tsubst_friend_class (friend_tmpl, args)
of course. We only need the innermost template parameters
because that is all that redeclare_class_template will look
at. */
tree parms
= tsubst_template_parms (DECL_TEMPLATE_PARMS (friend_tmpl),
if (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (friend_tmpl))
> TMPL_ARGS_DEPTH (args))
{
tree parms;
parms = tsubst_template_parms (DECL_TEMPLATE_PARMS (friend_tmpl),
args, tf_error | tf_warning);
if (!parms)
return error_mark_node;
redeclare_class_template (TREE_TYPE (tmpl), parms);
}
friend_type = TREE_TYPE (tmpl);
}
else
......@@ -4892,6 +4901,14 @@ tsubst_friend_class (friend_tmpl, args)
friend_type = TREE_TYPE (pushdecl_top_level (tmpl));
}
if (context)
{
if (TREE_CODE (context) == NAMESPACE_DECL)
pop_nested_namespace (context);
else
pop_nested_class ();
}
return friend_type;
}
......
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