re PR c++/38646 (ICE with invalid specialization of variadic template)

gcc/cp/

2009-11-20  Simon Martin  <simartin@users.sourceforge.net>

	PR c++/38646
	* pt.c (process_partial_specialization): Do not turn wrongly located
	parameter pack arguments into error_mark_node.
	Split too long lines into two.

gcc/testsuite/

2009-11-20  Simon Martin  <simartin@users.sourceforge.net>

	PR c++/38646
	* g++.dg/cpp0x/pr38646.C: New test.

From-SVN: r154378
This commit is contained in:
Simon Martin 2009-11-20 21:37:23 +00:00 committed by Simon Martin
parent 70826946ea
commit 2282976b05
4 changed files with 28 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2009-11-20 Simon Martin <simartin@users.sourceforge.net>
PR c++/38646
* pt.c (process_partial_specialization): Do not turn wrongly located
parameter pack arguments into error_mark_node.
Split too long lines into two.
2009-11-20 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/42060

View File

@ -3795,12 +3795,11 @@ process_partial_specialization (tree decl)
|| (!packed_args && i < nargs - 1))
{
if (TREE_CODE (arg) == EXPR_PACK_EXPANSION)
error ("parameter pack argument %qE must be at the end of the template argument list", arg);
error ("parameter pack argument %qE must be at the "
"end of the template argument list", arg);
else
error ("parameter pack argument %qT must be at the end of the template argument list", arg);
if (packed_args)
TREE_VEC_ELT (packed_args, j) = error_mark_node;
error ("parameter pack argument %qT must be at the "
"end of the template argument list", arg);
}
}

View File

@ -1,3 +1,8 @@
2009-11-20 Simon Martin <simartin@users.sourceforge.net>
PR c++/38646
* g++.dg/cpp0x/pr38646.C: New test.
2009-11-20 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* gcc.dg/c99-stdint-6.c: Set dg-options for alpha*-dec-osf5*.

View File

@ -0,0 +1,12 @@
/* PR c++/38646 */
/* { dg-do "compile" } */
/* { dg-options "-std=c++0x" } */
template<int...> struct A;
template<int... N> struct A<N..., N...> /* { dg-error "must be at the end" } */
{
template<typename> struct B;
template<typename T> struct B<T*> {};
};