re PR c++/37650 (ICE with broken default template parameter)

/cp
2008-10-14  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/37650
	* pt.c (push_template_decl_real): Check that current_template_parms
	is not null.
	(process_partial_specialization): Assert current_template_parms not
	null.

/testsuite
2008-10-14  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/37650
	* g++.dg/template/crash83.C: New.

From-SVN: r141115
This commit is contained in:
Paolo Carlini 2008-10-14 17:51:55 +00:00 committed by Paolo Carlini
parent c841843f9e
commit b17c40be65
4 changed files with 27 additions and 4 deletions

View File

@ -1,3 +1,11 @@
2008-10-14 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/37650
* pt.c (push_template_decl_real): Check that current_template_parms
is not null.
(process_partial_specialization): Assert current_template_parms not
null.
2008-10-13 Doug Evans <dje@google.com>
* cp-tree.h (DECL_MAIN_P): Fix parentheses around expression.

View File

@ -3292,15 +3292,20 @@ process_partial_specialization (tree decl)
tree maintmpl = CLASSTYPE_TI_TEMPLATE (type);
tree specargs = CLASSTYPE_TI_ARGS (type);
tree inner_args = INNERMOST_TEMPLATE_ARGS (specargs);
tree inner_parms = INNERMOST_TEMPLATE_PARMS (current_template_parms);
tree main_inner_parms = DECL_INNERMOST_TEMPLATE_PARMS (maintmpl);
tree inner_parms;
int nargs = TREE_VEC_LENGTH (inner_args);
int ntparms = TREE_VEC_LENGTH (inner_parms);
int ntparms;
int i;
int did_error_intro = 0;
struct template_parm_data tpd;
struct template_parm_data tpd2;
gcc_assert (current_template_parms);
inner_parms = INNERMOST_TEMPLATE_PARMS (current_template_parms);
ntparms = TREE_VEC_LENGTH (inner_parms);
/* We check that each of the template parameters given in the
partial specialization is used in the argument list to the
specialization. For example:
@ -3749,8 +3754,8 @@ push_template_decl_real (tree decl, bool is_friend)
[temp.mem]. */
bool member_template_p = false;
if (decl == error_mark_node)
return decl;
if (decl == error_mark_node || !current_template_parms)
return error_mark_node;
/* See if this is a partial specialization. */
is_partial = (DECL_IMPLICIT_TYPEDEF_P (decl)

View File

@ -1,3 +1,8 @@
2008-10-14 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/37650
* g++.dg/template/crash83.C: New.
2008-10-14 Douglas Gregor <doug.gregor@gmail.com>
PR c++/37553

View File

@ -0,0 +1,5 @@
// PR c++/37650
template<int> struct A {};
template<typename = class A<0>: > struct B {}; // { dg-error "explicit specialization|expected" }