Commit a2b60a0e by Mark Mitchell Committed by Mark Mitchell

pt.c (mabybe_get_template_decl_from_type_decl): New function.

	* pt.c (mabybe_get_template_decl_from_type_decl): New function.
	(lookup_template_class): Use it.

From-SVN: r19414
parent 42da2fd8
...@@ -3,6 +3,9 @@ Sun Apr 26 12:10:18 1998 Mark Mitchell <mmitchell@usa.net> ...@@ -3,6 +3,9 @@ Sun Apr 26 12:10:18 1998 Mark Mitchell <mmitchell@usa.net>
* pt.c (check_explicit_specialization): Handle overloaded * pt.c (check_explicit_specialization): Handle overloaded
constructors correctly. constructors correctly.
* pt.c (mabybe_get_template_decl_from_type_decl): New function.
(lookup_template_class): Use it.
Thu Apr 23 21:19:06 1998 Jason Merrill <jason@yorick.cygnus.com> Thu Apr 23 21:19:06 1998 Jason Merrill <jason@yorick.cygnus.com>
* cp-tree.def: Add WRAPPER. USER_CONV now only has two ops. * cp-tree.def: Add WRAPPER. USER_CONV now only has two ops.
......
...@@ -102,6 +102,7 @@ static int mark_template_parm PROTO((tree, void *)); ...@@ -102,6 +102,7 @@ static int mark_template_parm PROTO((tree, void *));
static tree tsubst_friend_function PROTO((tree, tree)); static tree tsubst_friend_function PROTO((tree, tree));
static tree get_bindings_real PROTO((tree, tree, tree, int)); static tree get_bindings_real PROTO((tree, tree, tree, int));
static int template_decl_level PROTO((tree)); static int template_decl_level PROTO((tree));
static tree maybe_get_template_decl_from_type_decl PROTO((tree));
/* Do any processing required when DECL (a member template declaration /* Do any processing required when DECL (a member template declaration
using TEMPLATE_PARAMETERS as its innermost parameter list) is using TEMPLATE_PARAMETERS as its innermost parameter list) is
...@@ -2695,6 +2696,23 @@ lookup_template_function (fns, arglist) ...@@ -2695,6 +2696,23 @@ lookup_template_function (fns, arglist)
fns, arglist); fns, arglist);
} }
/* Within the scope of a template class S<T>, the name S gets bound
(in build_self_reference) to a TYPE_DECL for the class, not a
TEMPLATE_DECL. If DECL is a TYPE_DECL for current_class_type,
or one of its enclosing classes, and that type is a template,
return the associated TEMPLATE_DECL. Otherwise, the original
DECL is returned. */
tree
maybe_get_template_decl_from_type_decl (decl)
tree decl;
{
return (decl != NULL_TREE
&& TREE_CODE (decl) == TYPE_DECL
&& DECL_ARTIFICIAL (decl)
&& CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (decl)))
? CLASSTYPE_TI_TEMPLATE (TREE_TYPE (decl)) : decl;
}
/* Given an IDENTIFIER_NODE (type TEMPLATE_DECL) and a chain of /* Given an IDENTIFIER_NODE (type TEMPLATE_DECL) and a chain of
parameters, find the desired type. parameters, find the desired type.
...@@ -2727,9 +2745,11 @@ lookup_template_class (d1, arglist, in_decl, context) ...@@ -2727,9 +2745,11 @@ lookup_template_class (d1, arglist, in_decl, context)
template = IDENTIFIER_LOCAL_VALUE (d1); template = IDENTIFIER_LOCAL_VALUE (d1);
else else
{ {
template = IDENTIFIER_NAMESPACE_VALUE (d1); /* XXX */ template =
if (! template) maybe_get_template_decl_from_type_decl
template = IDENTIFIER_CLASS_VALUE (d1); (IDENTIFIER_CLASS_VALUE (d1));
if (template == NULL_TREE)
template = IDENTIFIER_NAMESPACE_VALUE (d1);
} }
if (template) if (template)
context = DECL_CONTEXT (template); context = DECL_CONTEXT (template);
......
// Build don't link:
template <class T>
class S
{
template <class U>
class S2 {
S2(const S2<U>& s2u) {}
};
};
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