pt.c (mabybe_get_template_decl_from_type_decl): New function.
authorMark Mitchell <mmitchell@usa.net>
Sun, 26 Apr 1998 13:36:02 +0000 (13:36 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sun, 26 Apr 1998 13:36:02 +0000 (13:36 +0000)
* pt.c (mabybe_get_template_decl_from_type_decl): New function.
(lookup_template_class): Use it.

From-SVN: r19414

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.old-deja/g++.pt/memclass8.C [new file with mode: 0644]

index 323d0e414b66af54a0fbe14d1722107257a5aaec..a6bd63f614a6b58321c2408ac6048543174da119 100644 (file)
@@ -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.
index 01868c55f3fd42d8f15e9ab9098ed4b51b42dd77..a0c4e6b5fea83b83f6476ab05aff323322751c3c 100644 (file)
@@ -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);
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 (file)
index 0000000..c0bf0cd
--- /dev/null
@@ -0,0 +1,11 @@
+// Build don't link:
+
+template <class T>
+class S
+{
+  template <class U>
+  class S2 {
+    S2(const S2<U>& s2u) {}
+  };
+};