diff options
author | Jason Merrill <jason@redhat.com> | 2014-01-27 23:31:14 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-01-27 23:31:14 -0500 |
commit | b25c2a2f3404797866e5c317c2b5d922452a1707 (patch) | |
tree | 8daf60fb6401304b094e290db8fd9615f29f3a9a | |
parent | 1b87c9918084cc4cefecb3b34b4001b01583df25 (diff) | |
download | gcc-b25c2a2f3404797866e5c317c2b5d922452a1707.zip gcc-b25c2a2f3404797866e5c317c2b5d922452a1707.tar.gz gcc-b25c2a2f3404797866e5c317c2b5d922452a1707.tar.bz2 |
re PR c++/58606 ([c++11] ICE with specialization in variadic template)
PR c++/58606
* pt.c (template_parm_to_arg): Call convert_from_reference.
(tsubst_template_arg): Don't strip reference refs.
From-SVN: r207167
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic146.C | 9 |
3 files changed, 14 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 99c00a2..68fa2b9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2014-01-27 Jason Merrill <jason@redhat.com> + PR c++/58606 + * pt.c (template_parm_to_arg): Call convert_from_reference. + (tsubst_template_arg): Don't strip reference refs. + PR c++/58639 * call.c (build_aggr_conv): Reject value-initialization of reference. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 4414e49..661143a 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -3854,6 +3854,7 @@ template_parm_to_arg (tree t) SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (vec, TREE_VEC_LENGTH (vec)); #endif + t = convert_from_reference (t); TREE_VEC_ELT (vec, 0) = make_pack_expansion (t); t = make_node (NONTYPE_ARGUMENT_PACK); @@ -9281,10 +9282,6 @@ tsubst_template_arg (tree t, tree args, tsubst_flags_t complain, tree in_decl) /*integral_constant_expression_p=*/true); if (!(complain & tf_warning)) --c_inhibit_evaluation_warnings; - /* Preserve the raw-reference nature of T. */ - if (TREE_TYPE (t) && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE - && REFERENCE_REF_P (r)) - r = TREE_OPERAND (r, 0); } return r; } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic146.C b/gcc/testsuite/g++.dg/cpp0x/variadic146.C new file mode 100644 index 0000000..0c91db5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic146.C @@ -0,0 +1,9 @@ +// PR c++/58606 +// { dg-require-effective-target c++11 } + +template<int&...I> struct A +{ + template<typename> struct B; + + template<typename T> struct B<T*> {}; +}; |