re PR c++/2513 (internal template template parameter causes ICE)
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Fri, 17 Oct 2003 15:41:46 +0000 (15:41 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Fri, 17 Oct 2003 15:41:46 +0000 (15:41 +0000)
PR c++/2513
* decl.c (make_typename_type): Use dependent_type_p.
(make_unbound_class_template): Likewise.
* pt.c (instantiate_class_template): Increment
processing_template_decl during substitution of template friend
function.  Preincrement processing_template_decl rather than
postincrement.
(get_mostly_instantiated_function_type): Increment
processing_template_decl during partial substitution of function
type.

* g++.dg/template/typename5.C: New test.

From-SVN: r72611

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/typename5.C [new file with mode: 0644]

index 81730210bdaacac546e26cbc5dce3a1d354aa621..b5cba3c7aaf1ef5d1be3a9729431bdb616a43dc0 100644 (file)
@@ -1,3 +1,16 @@
+2003-10-17  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/2513
+       * decl.c (make_typename_type): Use dependent_type_p.
+       (make_unbound_class_template): Likewise.
+       * pt.c (instantiate_class_template): Increment
+       processing_template_decl during substitution of template friend
+       function.  Preincrement processing_template_decl rather than
+       postincrement.
+       (get_mostly_instantiated_function_type): Increment
+       processing_template_decl during partial substitution of function
+       type.
+
 2003-10-15  Jan Hubicka  <jh@suse.cz>
 
        pr c++/12574
index 7b0f86847a01aeed2ef4dfc5cdc1d7f9f62beb90..227c773e1b34f14e4caf62e4a73d3d27b48f025f 100644 (file)
@@ -2604,7 +2604,7 @@ make_typename_type (tree context, tree name, tsubst_flags_t complain)
       return error_mark_node;
     }
 
-  if (! uses_template_parms (context)
+  if (!dependent_type_p (context)
       || currently_open_class (context))
     {
       if (TREE_CODE (fullname) == TEMPLATE_ID_EXPR)
@@ -2663,7 +2663,7 @@ make_typename_type (tree context, tree name, tsubst_flags_t complain)
 
   /* If the CONTEXT is not a template type, then either the field is
      there now or its never going to be.  */
-  if (!uses_template_parms (context))
+  if (!dependent_type_p (context))
     {
       if (complain & tf_error)
        error ("no type named `%#T' in `%#T'", name, context);
@@ -2692,7 +2692,7 @@ make_unbound_class_template (tree context, tree name, tsubst_flags_t complain)
   if (TREE_CODE (name) != IDENTIFIER_NODE)
     abort ();
 
-  if (!uses_template_parms (context)
+  if (!dependent_type_p (context)
       || currently_open_class (context))
     {
       tree tmpl = NULL_TREE;
index 909eede693d1fe10e83bafc3b3540bec98431759..ffc347c7a014220268d0312f2304d03cd28b1e9e 100644 (file)
@@ -5294,10 +5294,10 @@ instantiate_class_template (tree type)
              tree r;
              
              if (TREE_CODE (t) == TEMPLATE_DECL)
-               processing_template_decl++;
+               ++processing_template_decl;
              r = tsubst (t, args, tf_error, NULL_TREE);
              if (TREE_CODE (t) == TEMPLATE_DECL)
-               processing_template_decl--;
+               --processing_template_decl;
              set_current_access_from_decl (r);
              grok_special_member_properties (r);
              finish_member_declaration (r);
@@ -5317,10 +5317,10 @@ instantiate_class_template (tree type)
                  input_location = DECL_SOURCE_LOCATION (t);
 
                  if (TREE_CODE (t) == TEMPLATE_DECL)
-                   processing_template_decl++;
+                   ++processing_template_decl;
                  r = tsubst (t, args, tf_error | tf_warning, NULL_TREE);
                  if (TREE_CODE (t) == TEMPLATE_DECL)
-                   processing_template_decl--;
+                   --processing_template_decl;
                  if (TREE_CODE (r) == VAR_DECL)
                    {
                      tree init;
@@ -5412,9 +5412,17 @@ instantiate_class_template (tree type)
                --processing_template_decl;
            }
          else
-           /* Build new DECL_FRIENDLIST.  */
-           add_friend (type, tsubst_friend_function (t, args),
-                       /*complain=*/false);
+           {
+             /* Build new DECL_FRIENDLIST.  */
+             tree r;
+
+             if (TREE_CODE (t) == TEMPLATE_DECL)
+               ++processing_template_decl;
+             r = tsubst_friend_function (t, args);
+             if (TREE_CODE (t) == TEMPLATE_DECL)
+               --processing_template_decl;
+             add_friend (type, r, /*complain=*/false);
+           }
        }
     }
 
@@ -11246,9 +11254,11 @@ get_mostly_instantiated_function_type (tree decl)
         specialized or not.  */
       push_access_scope (decl);
 
+      ++processing_template_decl;
       /* Now, do the (partial) substitution to figure out the
         appropriate function type.  */
       fn_type = tsubst (fn_type, partial_args, tf_error, NULL_TREE);
+      --processing_template_decl;
 
       /* Substitute into the template parameters to obtain the real
         innermost set of parameters.  This step is important if the
index 3f00636946fbe3da4b752250ab2e61f79e11938b..5cfe1e48523132a3438ce551963a3afd9a160953 100644 (file)
@@ -1,3 +1,8 @@
+2003-10-17  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/2513
+       * g++.dg/template/typename5.C: New test.
+
 2003-10-17  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/12369
diff --git a/gcc/testsuite/g++.dg/template/typename5.C b/gcc/testsuite/g++.dg/template/typename5.C
new file mode 100644 (file)
index 0000000..2f72b5f
--- /dev/null
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Origin: ariels@compugen.co.il
+
+// PR c++/2513: typename handling when scope is dependent as
+// described in DR108.
+
+template <bool flag> struct Select {
+  typedef int Result;
+};
+
+template <template<class> class Pred> struct FindType {
+  typedef typename Select<true>::Result Result;
+};
+
+template <int bits> struct Int {
+  template<typename T> struct RightSize {};
+  typedef typename FindType<RightSize>::Result type;
+};