aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2015-07-06 18:13:42 -0400
committerJason Merrill <jason@gcc.gnu.org>2015-07-06 18:13:42 -0400
commit4366e1c000be778d32e302c704ca98b16b95a589 (patch)
tree42ae186cbb7752e6a33e5021f16f6fac267e032e
parentd762287d87b36ae3ac0a6fc57969bd2f1d1c3a9c (diff)
downloadgcc-4366e1c000be778d32e302c704ca98b16b95a589.zip
gcc-4366e1c000be778d32e302c704ca98b16b95a589.tar.gz
gcc-4366e1c000be778d32e302c704ca98b16b95a589.tar.bz2
pt.c (reduce_template_parm_level): Also build the TYPE_DECL for a template template parameter.
* 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
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c32
2 files changed, 20 insertions, 17 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index cb59877..ee9402e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 0302de1..3cd7bac 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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;
}