PR c++/8389
authorlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 9 Nov 2002 11:53:18 +0000 (11:53 +0000)
committerlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 9 Nov 2002 11:53:18 +0000 (11:53 +0000)
* pt.c (instantiate_template): Push class scope for member
functions.
(get_mostly_instantiated_function_type): Likewise.  Don't call
tsubst on context.  Remove CONTEXTP and TPARMSP parameters.
* cp-tree.h (get_mostly_instantiated_function_type): Adjust.
* mangle.c (write_encoding, write_unqualified_name): Adjust.

PR c++/8389
* g++.dg/template/access6.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58950 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/mangle.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/access6.C [new file with mode: 0644]

index 224c590..0b5b670 100644 (file)
@@ -1,3 +1,13 @@
+2002-11-09  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/8389
+       * pt.c (instantiate_template): Push class scope for member
+       functions.
+       (get_mostly_instantiated_function_type): Likewise.  Don't call
+       tsubst on context.  Remove CONTEXTP and TPARMSP parameters.
+       * cp-tree.h (get_mostly_instantiated_function_type): Adjust.
+       * mangle.c (write_encoding, write_unqualified_name): Adjust.
+
 2002-11-07  Mark Mitchell  <mark@codesourcery.com>
 
        * class.c (add_vcall_offset_vtbl_entries_1): Correct ordering of
index ad88103..262f6a1 100644 (file)
@@ -4013,7 +4013,7 @@ extern void print_candidates                    PARAMS ((tree));
 extern int instantiate_pending_templates        PARAMS ((void));
 extern tree tsubst_default_argument             PARAMS ((tree, tree, tree));
 extern tree most_general_template              PARAMS ((tree));
-extern tree get_mostly_instantiated_function_type PARAMS ((tree, tree *, tree *));
+extern tree get_mostly_instantiated_function_type PARAMS ((tree));
 extern int problematic_instantiation_changed    PARAMS ((void));
 extern void record_last_problematic_instantiation PARAMS ((void));
 extern tree current_instantiation               PARAMS ((void));
index bc7e970..523db85 100644 (file)
@@ -656,7 +656,7 @@ write_encoding (decl)
       tree fn_type;
 
       if (decl_is_template_id (decl, NULL))
-       fn_type = get_mostly_instantiated_function_type (decl, NULL, NULL);
+       fn_type = get_mostly_instantiated_function_type (decl);
       else
        fn_type = TREE_TYPE (decl);
 
@@ -1011,8 +1011,7 @@ write_unqualified_name (decl)
       tree type;
       if (decl_is_template_id (decl, NULL))
        {
-         tree fn_type = get_mostly_instantiated_function_type (decl, NULL,
-                                                               NULL);
+         tree fn_type = get_mostly_instantiated_function_type (decl);
          type = TREE_TYPE (fn_type);
        }
       else
index 62eef7a..db8e33f 100644 (file)
@@ -7786,9 +7786,19 @@ instantiate_template (tmpl, targ_ptr)
        }
     }
 
+  /* Make sure that we can see identifiers, and compute access
+     correctly.  */
+  if (DECL_CLASS_SCOPE_P (gen_tmpl))
+    pushclass (tsubst (DECL_CONTEXT (gen_tmpl), targ_ptr, tf_error,
+                      gen_tmpl), 1);
+
   /* substitute template parameters */
   fndecl = tsubst (DECL_TEMPLATE_RESULT (gen_tmpl),
                   targ_ptr, tf_error, gen_tmpl);
+
+  if (DECL_CLASS_SCOPE_P (gen_tmpl))
+    popclass ();
+
   /* The DECL_TI_TEMPLATE should always be the immediate parent
      template, not the most general template.  */
   DECL_TI_TEMPLATE (fndecl) = tmpl;
@@ -10414,18 +10424,12 @@ tsubst_enum (tag, newtag, args)
 /* DECL is a FUNCTION_DECL that is a template specialization.  Return
    its type -- but without substituting the innermost set of template
    arguments.  So, innermost set of template parameters will appear in
-   the type.  If CONTEXTP is non-NULL, then the partially substituted
-   DECL_CONTEXT (if any) will also be filled in.  Similarly, TPARMSP
-   will be filled in with the substituted template parameters, if it
-   is non-NULL.  */
+   the type.  */
 
 tree 
-get_mostly_instantiated_function_type (decl, contextp, tparmsp)
+get_mostly_instantiated_function_type (decl)
      tree decl;
-     tree *contextp;
-     tree *tparmsp;
 {
-  tree context = NULL_TREE;
   tree fn_type;
   tree tmpl;
   tree targs;
@@ -10442,8 +10446,6 @@ get_mostly_instantiated_function_type (decl, contextp, tparmsp)
   my_friendly_assert (parm_depth == TMPL_ARGS_DEPTH (targs), 0);
 
   fn_type = TREE_TYPE (tmpl);
-  if (DECL_STATIC_FUNCTION_P (decl))
-    context = DECL_CONTEXT (decl);
 
   if (parm_depth == 1)
     /* No substitution is necessary.  */
@@ -10463,11 +10465,17 @@ get_mostly_instantiated_function_type (decl, contextp, tparmsp)
                           TMPL_ARGS_DEPTH (targs),
                           make_tree_vec (DECL_NTPARMS (tmpl)));
 
+      /* Make sure that we can see identifiers, and compute access
+        correctly.  We can just use the context of DECL for the
+        partial substitution here.  It depends only on outer template
+        parameters, regardless of whether the innermost level is
+        specialized or not.  */
+      if (DECL_CLASS_SCOPE_P (decl))
+       pushclass (DECL_CONTEXT (decl), 1);
+
       /* Now, do the (partial) substitution to figure out the
         appropriate function type.  */
       fn_type = tsubst (fn_type, partial_args, tf_error, NULL_TREE);
-      if (DECL_STATIC_FUNCTION_P (decl))
-       context = tsubst (context, partial_args, tf_error, NULL_TREE);
 
       /* Substitute into the template parameters to obtain the real
         innermost set of parameters.  This step is important if the
@@ -10475,12 +10483,10 @@ get_mostly_instantiated_function_type (decl, contextp, tparmsp)
         parameters whose types depend on outer template parameters.  */
       TREE_VEC_LENGTH (partial_args)--;
       tparms = tsubst_template_parms (tparms, partial_args, tf_error);
-    }
 
-  if (contextp)
-    *contextp = context;
-  if (tparmsp)
-    *tparmsp = tparms;
+      if (DECL_CLASS_SCOPE_P (decl))
+       popclass ();
+    }
 
   return fn_type;
 }
index 2aa18e3..97b80de 100644 (file)
@@ -1,3 +1,8 @@
+2002-11-09  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/8389
+       * g++.dg/template/access6.C: New test.
+
 Fri Nov  8 10:52:15 CET 2002  Jan Hubicka  <jh@suse.cz>
 
        * gcc.c-torture/compile/20021108-1.c: New testcase for x86-64 failure.
diff --git a/gcc/testsuite/g++.dg/template/access6.C b/gcc/testsuite/g++.dg/template/access6.C
new file mode 100644 (file)
index 0000000..fc80402
--- /dev/null
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// Origin: Detlef Vollmann <dv@vollmann.ch>
+
+// PR c++/8389
+// Access control ICE for typename during instantiation and name mangling
+
+template <class> class Base {
+  protected:
+    typedef int Type;
+};
+    
+template <class T> struct Derived : public Base<T> {
+  typedef typename Base<T>::Type Type;
+  template <class Arg> void f(Type = Type()) {};
+};
+    
+template void Derived<char>::f<int> (Type);