pt.c (reduce_template_parm_level): Also build the TYPE_DECL for a template template...
authorJason Merrill <jason@redhat.com>
Mon, 6 Jul 2015 22:13:42 +0000 (18:13 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 6 Jul 2015 22:13:42 +0000 (18:13 -0400)
* pt.c (reduce_template_parm_level): Also build the TYPE_DECL
for a template template parameter.
(tsubst_decl) [TEMPLATE_DECL]: Use the TEMPLATE_DECL built
by reduce_template_parm_level.

From-SVN: r225495

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

index cb598776a506f80fd20d65e3647af279189f75c8..ee9402ee0d6ba17ea7ea2271ebcc30b1ce686f19 100644 (file)
@@ -1,5 +1,10 @@
 2015-07-06  Jason Merrill  <jason@redhat.com>
 
+       * pt.c (reduce_template_parm_level): Also build the TYPE_DECL
+       for a template template parameter.
+       (tsubst_decl) [TEMPLATE_DECL]: Use the TEMPLATE_DECL built
+       by reduce_template_parm_level.
+
        * pt.c (argument_pack_element_is_expansion_p): A decl pack is an
        expansion.
 
index 0302de1270d7ba40f4fb7ba23bf9ac53eca5c0cc..3cd7bac8ff075f292addb3bf1f3cecdb78ca2b9c 100644 (file)
@@ -3740,9 +3740,14 @@ reduce_template_parm_level (tree index, tree type, int levels, tree args,
 
        /* Template template parameters need this.  */
       if (TREE_CODE (decl) == TEMPLATE_DECL)
-       DECL_TEMPLATE_PARMS (decl) = tsubst_template_parms
-         (DECL_TEMPLATE_PARMS (TEMPLATE_PARM_DECL (index)),
-          args, complain);
+       {
+         DECL_TEMPLATE_RESULT (decl)
+           = build_decl (DECL_SOURCE_LOCATION (decl),
+                         TYPE_DECL, DECL_NAME (decl), type);
+         DECL_ARTIFICIAL (DECL_TEMPLATE_RESULT (decl)) = true;
+         DECL_TEMPLATE_PARMS (decl) = tsubst_template_parms
+           (DECL_TEMPLATE_PARMS (orig_decl), args, complain);
+       }
     }
 
   return TEMPLATE_PARM_DESCENDANTS (index);
@@ -10687,22 +10692,15 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
            /* Template template parameter is treated here.  */
            tree new_type = tsubst (TREE_TYPE (t), args, complain, in_decl);
            if (new_type == error_mark_node)
-             RETURN (error_mark_node);
+             r = error_mark_node;
            /* If we get a real template back, return it.  This can happen in
               the context of most_specialized_partial_spec.  */
-           if (TREE_CODE (new_type) == TEMPLATE_DECL)
-             return new_type;
-
-           r = copy_decl (t);
-           DECL_CHAIN (r) = NULL_TREE;
-           TREE_TYPE (r) = new_type;
-           DECL_TEMPLATE_RESULT (r)
-             = build_decl (DECL_SOURCE_LOCATION (decl),
-                           TYPE_DECL, DECL_NAME (decl), new_type);
-           DECL_TEMPLATE_PARMS (r)
-             = tsubst_template_parms (DECL_TEMPLATE_PARMS (t), args,
-                                      complain);
-           TYPE_NAME (new_type) = r;
+           else if (TREE_CODE (new_type) == TEMPLATE_DECL)
+             r = new_type;
+           else
+             /* The new TEMPLATE_DECL was built in
+                reduce_template_parm_level.  */
+             r = TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL (new_type);
            break;
          }