mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-23 00:59:36 +08:00
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
This commit is contained in:
parent
42da2fd81b
commit
a2b60a0ea2
@ -3,6 +3,9 @@ Sun Apr 26 12:10:18 1998 Mark Mitchell <mmitchell@usa.net>
|
||||
* pt.c (check_explicit_specialization): Handle overloaded
|
||||
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>
|
||||
|
||||
* cp-tree.def: Add WRAPPER. USER_CONV now only has two ops.
|
||||
|
26
gcc/cp/pt.c
26
gcc/cp/pt.c
@ -102,6 +102,7 @@ static int mark_template_parm PROTO((tree, void *));
|
||||
static tree tsubst_friend_function PROTO((tree, tree));
|
||||
static tree get_bindings_real PROTO((tree, tree, tree, int));
|
||||
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
|
||||
using TEMPLATE_PARAMETERS as its innermost parameter list) is
|
||||
@ -2695,6 +2696,23 @@ lookup_template_function (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
|
||||
parameters, find the desired type.
|
||||
@ -2727,9 +2745,11 @@ lookup_template_class (d1, arglist, in_decl, context)
|
||||
template = IDENTIFIER_LOCAL_VALUE (d1);
|
||||
else
|
||||
{
|
||||
template = IDENTIFIER_NAMESPACE_VALUE (d1); /* XXX */
|
||||
if (! template)
|
||||
template = IDENTIFIER_CLASS_VALUE (d1);
|
||||
template =
|
||||
maybe_get_template_decl_from_type_decl
|
||||
(IDENTIFIER_CLASS_VALUE (d1));
|
||||
if (template == NULL_TREE)
|
||||
template = IDENTIFIER_NAMESPACE_VALUE (d1);
|
||||
}
|
||||
if (template)
|
||||
context = DECL_CONTEXT (template);
|
||||
|
11
gcc/testsuite/g++.old-deja/g++.pt/memclass8.C
Normal file
11
gcc/testsuite/g++.old-deja/g++.pt/memclass8.C
Normal file
@ -0,0 +1,11 @@
|
||||
// Build don't link:
|
||||
|
||||
template <class T>
|
||||
class S
|
||||
{
|
||||
template <class U>
|
||||
class S2 {
|
||||
S2(const S2<U>& s2u) {}
|
||||
};
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user