From a2b60a0ea2f0741a97fa8ec0e777ed134ce3dc7b Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Sun, 26 Apr 1998 13:36:02 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/pt.c | 26 ++++++++++++++++--- gcc/testsuite/g++.old-deja/g++.pt/memclass8.C | 11 ++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/memclass8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 323d0e414b6..a6bd63f614a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -3,6 +3,9 @@ Sun Apr 26 12:10:18 1998 Mark Mitchell * 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 * cp-tree.def: Add WRAPPER. USER_CONV now only has two ops. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 01868c55f3f..a0c4e6b5fea 100644 --- a/gcc/cp/pt.c +++ b/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, 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); diff --git a/gcc/testsuite/g++.old-deja/g++.pt/memclass8.C b/gcc/testsuite/g++.old-deja/g++.pt/memclass8.C new file mode 100644 index 00000000000..c0bf0cd83ab --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/memclass8.C @@ -0,0 +1,11 @@ +// Build don't link: + +template +class S +{ + template + class S2 { + S2(const S2& s2u) {} + }; +}; + -- 2.30.2