Commit aac73a6d by Paolo Carlini Committed by Paolo Carlini

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
parent 9d000e83
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
......
/* 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
......
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
......
// { 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;
......@@ -8,4 +8,4 @@ template < typename > struct S
};
};
S < int > s(0);
S < int > s(0); // { dg-error "incomplete type" }
// 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" }
}
// 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;
}
// 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" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment