re PR c++/34272 (ICE with invalid template specialization)

/cp
2010-05-11  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/34272
	PR c++/43630
	PR c++/34491
	* pt.c (process_partial_specialization): Return error_mark_node
	in case of unused template parameters in partial specialization.

/testsuite
2010-05-11  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/34272
	PR c++/43630
	PR c++/34491
	* g++.dg/template/crash97.C: New.
	* g++.dg/template/crash98.C: Likewise.
	* g++.dg/template/crash99.C: Likewise.
	* g++.dg/cpp0x/pr31439.C: Adjust.
	* g++.dg/template/crash95.C: Likewise.

From-SVN: r159295
This commit is contained in:
Paolo Carlini 2010-05-11 20:53:36 +00:00 committed by Paolo Carlini
parent 9d000e8300
commit aac73a6d78
8 changed files with 66 additions and 6 deletions

View File

@ -1,3 +1,11 @@
2010-05-11 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/34272
PR c++/43630
PR c++/34491
* pt.c (process_partial_specialization): Return error_mark_node
in case of unused template parameters in partial specialization.
2010-05-11 Jakub Jelinek <jakub@redhat.com>
PR c++/44062

View File

@ -1,6 +1,6 @@
/* Handle parameterized types (templates) for GNU C++.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing.
Rewritten by Jason Merrill (jason@cygnus.com).
@ -3837,7 +3837,7 @@ process_partial_specialization (tree decl)
int nargs = TREE_VEC_LENGTH (inner_args);
int ntparms;
int i;
int did_error_intro = 0;
bool did_error_intro = false;
struct template_parm_data tpd;
struct template_parm_data tpd2;
@ -3899,12 +3899,15 @@ process_partial_specialization (tree decl)
if (!did_error_intro)
{
error ("template parameters not used in partial specialization:");
did_error_intro = 1;
did_error_intro = true;
}
error (" %qD", TREE_VALUE (TREE_VEC_ELT (inner_parms, i)));
}
if (did_error_intro)
return error_mark_node;
/* [temp.class.spec]
The argument list of the specialization shall not be identical to

View File

@ -1,3 +1,14 @@
2010-05-11 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/34272
PR c++/43630
PR c++/34491
* g++.dg/template/crash97.C: New.
* g++.dg/template/crash98.C: Likewise.
* g++.dg/template/crash99.C: Likewise.
* g++.dg/cpp0x/pr31439.C: Adjust.
* g++.dg/template/crash95.C: Likewise.
2010-05-11 Jakub Jelinek <jakub@redhat.com>
PR middle-end/44071

View File

@ -1,8 +1,8 @@
// { dg-options "-std=c++0x" }
template<typename...> struct A;
template<typename...> struct A; // { dg-error "declaration" }
template<char> struct A<> {}; // { dg-error "not used in partial specialization|anonymous" }
template<typename T, typename... U> struct A<T, U...> : A<U...> {};
template<typename T, typename... U> struct A<T, U...> : A<U...> {}; // { dg-error "incomplete type" }
A<int> a;

View File

@ -8,4 +8,4 @@ template < typename > struct S
};
};
S < int > s(0);
S < int > s(0); // { dg-error "incomplete type" }

View File

@ -0,0 +1,14 @@
// PR c++/34272
template<typename> struct A {};
template<typename> struct A<int> // { dg-error "not used|template\\-parameter" }
{
template<int> void foo();
};
void bar()
{
A<int> a; // { dg-error "incomplete type" }
a.foo<0>(); // { dg-error "expected" }
}

View File

@ -0,0 +1,14 @@
// PR c++/43630
template < typename > struct A; // { dg-error "declaration" }
template < typename > struct A < int > // { dg-error "not used|template\\-parameter" }
{
int i;
int f ();
};
int A < int >::f () // { dg-error "incomplete type" }
{
return i;
}

View File

@ -0,0 +1,10 @@
// PR c++/34491
template<typename> struct A;
template<0> struct A<int> // { dg-error "expected|template|anonymous" }
{
static const int i = 0;
};
int n = A<int>::i; // { dg-error "incomplete type" }