c++: Don't inject friends while processing templates
authorBenjamin Kosnik <bkoz@rhino.cygnus.com>
Thu, 18 Dec 1997 13:03:54 +0000 (13:03 +0000)
committerBenjamin Kosnik <bkoz@gcc.gnu.org>
Thu, 18 Dec 1997 13:03:54 +0000 (13:03 +0000)
* pt.c (instantiate_class_template): Don't do injection when
  processing_template_decl is true, as pollutes current_binding_level
        for base classes.
PR g++/13911/14438

From-SVN: r17128

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

index 2cf2aa8..c6bd7b6 100644 (file)
@@ -1,3 +1,9 @@
+Wed Dec 17 17:08:52 1997  Benjamin Kosnik  <bkoz@rhino.cygnus.com>
+
+       * pt.c (instantiate_class_template): Don't do injection when
+       processing_template_decl is true, as pollutes current_binding_level 
+        for base classes.
+
 Wed Dec 17 21:17:39 1997  Peter Schmid <schmid@ltoi.iap.physik.tu-darmstadt.de>
 
        * pt.c (maybe_fold_nontype_arg): Add prototype.
index 5e540fb..c1cfa92 100644 (file)
@@ -1956,18 +1956,22 @@ instantiate_class_template (type)
     for (; d; d = TREE_CHAIN (d))
       TREE_VALUE (d) = xref_tag_from_type (TREE_VALUE (d), NULL_TREE, 1);
 
-    d = tsubst (DECL_TEMPLATE_INJECT (template), args,
+    /* This does injection for friend functions. */
+    if (!processing_template_decl)
+      {
+       d = tsubst (DECL_TEMPLATE_INJECT (template), args,
                TREE_VEC_LENGTH (args), NULL_TREE);
 
-    for (; d; d = TREE_CHAIN (d))
-      {
-       tree t = TREE_VALUE (d);
+       for (; d; d = TREE_CHAIN (d))
+         {
+           tree t = TREE_VALUE (d);
 
-       if (TREE_CODE (t) == TYPE_DECL)
-         /* Already injected.  */;
-       else
-         pushdecl (t);
-      }
+           if (TREE_CODE (t) == TYPE_DECL)
+             /* Already injected.  */;
+           else
+             pushdecl (t);
+         }
+      } 
   }
 
   if (! uses_template_parms (type))