pt.c (lookup_template_class): Add comment.
authorMark Mitchell <mark@markmitchell.com>
Wed, 14 Oct 1998 20:23:45 +0000 (20:23 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Wed, 14 Oct 1998 20:23:45 +0000 (20:23 +0000)
* pt.c (lookup_template_class): Add comment.
(instantiate_class_template): Don't mark the _TYPE node for
member class templates as an instantiation.

From-SVN: r23092

gcc/cp/ChangeLog
gcc/cp/pt.c

index 87e9762326711570085f7101758830dcea27c87d..0e5b319822e2550bb3eb943fbca3d40d959e03cc 100644 (file)
@@ -1,3 +1,9 @@
+1998-10-14  Mark Mitchell  <mark@markmitchell.com>
+
+       * pt.c (lookup_template_class): Add comment.
+       (instantiate_class_template): Don't mark the _TYPE node for
+       member class templates as an instantiation.
+
 1998-10-14  Jason Merrill  <jason@yorick.cygnus.com>
 
        * decl.c (grokfndecl): Fix my thinko.
index ea021fa80258c915e9ca471cd395d92dcfa7567b..c836fbd450560239ea144ec402a02058a4f4f6f1 100644 (file)
@@ -3547,7 +3547,9 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope)
       push_obstacks (&permanent_obstack, &permanent_obstack);
       
       /* This type is a "partial instantiation" if any of the template
-        arguments still inolve template parameters.  */
+        arguments still inolve template parameters.  Note that we set
+        IS_PARTIAL_INSTANTIATION for partial specializations as
+        well.  */
       is_partial_instantiation = uses_template_parms (arglist);
 
       /* Create the type.  */
@@ -4519,6 +4521,17 @@ instantiate_class_template (type)
       newtag = tsubst (tag, args, NULL_TREE);
       if (TREE_CODE (newtag) != ENUMERAL_TYPE)
        {
+         if (TYPE_LANG_SPECIFIC (tag) && CLASSTYPE_IS_TEMPLATE (tag))
+           /* Unfortunately, lookup_template_class sets
+              CLASSTYPE_IMPLICIT_INSTANTIATION for a partial
+              instantiation (i.e., for the type of a member template
+              class nested within a template class.)  This behavior is
+              required for maybe_process_partial_specialization to work
+              correctly, but is not accurate in this case; the TAG is not
+              an instantiation of anything.  (The corresponding
+              TEMPLATE_DECL is an instantiation, but the TYPE is not.) */
+           CLASSTYPE_USE_TEMPLATE (newtag) = 0;
+
          /* Now, we call pushtag to put this NEWTAG into the scope of
             TYPE.  We first set up the IDENTIFIER_TYPE_VALUE to avoid
             pushtag calling push_template_decl.  We don't have to do