diff options
author | Jason Merrill <jason@redhat.com> | 2015-07-06 18:13:42 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2015-07-06 18:13:42 -0400 |
commit | 4366e1c000be778d32e302c704ca98b16b95a589 (patch) | |
tree | 42ae186cbb7752e6a33e5021f16f6fac267e032e /gcc/cp | |
parent | d762287d87b36ae3ac0a6fc57969bd2f1d1c3a9c (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 32 |
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; } |