From: H.J. Lu Date: Sun, 8 Mar 2009 17:29:12 +0000 (+0000) Subject: re PR c++/39060 (ICE with lots of invalid member functions) X-Git-Tag: releases/gcc-4.4.0~328 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae9b2a481c0f6510271cf12f86cd3b6b86490a96;p=thirdparty%2Fgcc.git re PR c++/39060 (ICE with lots of invalid member functions) gcc/cp/ 2009-03-08 H.J. Lu PR c++/39060 * parser.c (cp_parser_late_parsing_default_args): Continue the loop when cp_parser_assignment_expression returns error_mark_node. gcc/testsuite/ 2009-03-08 H.J. Lu PR c++/39060 * g++.dg/other/new1.C: Adjusted. * g++.dg/parse/crash40.C: Likewise. * g++.dg/parse/defarg12.C: Likewise. * g++.dg/template/error15.C: Likewise. * g++.dg/other/pr39060.C: New. From-SVN: r144710 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 368843fd3a03..c4b151b79a8f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2009-03-08 H.J. Lu + + PR c++/39060 + * parser.c (cp_parser_late_parsing_default_args): Continue + the loop when cp_parser_assignment_expression returns + error_mark_node. + 2009-03-07 Jason Merrill PR c++/39367 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 5c5c912b5879..4c6fd4a78c59 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -18291,6 +18291,11 @@ cp_parser_late_parsing_default_args (cp_parser *parser, tree fn) /* Parse the assignment-expression. */ parsed_arg = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL); + if (parsed_arg == error_mark_node) + { + cp_parser_pop_lexer (parser); + continue; + } if (!processing_template_decl) parsed_arg = check_default_argument (TREE_VALUE (parm), parsed_arg); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1b7a69d10e16..3d44d641c247 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2009-03-08 H.J. Lu + + PR c++/39060 + * g++.dg/other/new1.C: Adjusted. + * g++.dg/parse/crash40.C: Likewise. + * g++.dg/parse/defarg12.C: Likewise. + * g++.dg/template/error15.C: Likewise. + + * g++.dg/other/pr39060.C: New. + 2009-03-07 Jason Merrill PR c++/39367 diff --git a/gcc/testsuite/g++.dg/other/new1.C b/gcc/testsuite/g++.dg/other/new1.C index 30b651326aa3..71383706ea4e 100644 --- a/gcc/testsuite/g++.dg/other/new1.C +++ b/gcc/testsuite/g++.dg/other/new1.C @@ -10,5 +10,5 @@ struct A void foo() { - new A; + new A; // { dg-error "default argument" } } diff --git a/gcc/testsuite/g++.dg/other/pr39060.C b/gcc/testsuite/g++.dg/other/pr39060.C new file mode 100644 index 000000000000..a625aea108e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr39060.C @@ -0,0 +1,19 @@ +// PR c++/39060 +// { dg-do compile } + +struct A +{ + A(void* i=); // { dg-error "with|specification" } + A(void* i=); // { dg-error "overloaded" } + A(void* i=); // { dg-error "overloaded" } + + void operator+ (void* i=); // { dg-error "arguments" } + + virtual void foo1(=); // { dg-error "identifier" } + void foo2(=); // { dg-error "identifier" } + void foo3(=); // { dg-error "identifier" } + void foo4(=); // { dg-error "identifier" } + void foo5(=); // { dg-error "identifier" } +}; // { dg-error "primary-expression" } + +A::A (void* i=) {} // { dg-error "primary-expression|argument" } diff --git a/gcc/testsuite/g++.dg/parse/crash40.C b/gcc/testsuite/g++.dg/parse/crash40.C index af44fdb695ca..6a15228c0632 100644 --- a/gcc/testsuite/g++.dg/parse/crash40.C +++ b/gcc/testsuite/g++.dg/parse/crash40.C @@ -37,6 +37,6 @@ void bar() int i; i.C::foo<0>(); /* { dg-error "which is of non-class type" } */ - S s; + S s; /* { dg-error "default argument" } */ SS ss; /* { dg-error "within this context" } */ } diff --git a/gcc/testsuite/g++.dg/parse/defarg12.C b/gcc/testsuite/g++.dg/parse/defarg12.C index 3717ad5db7de..80ef5c38e1fc 100644 --- a/gcc/testsuite/g++.dg/parse/defarg12.C +++ b/gcc/testsuite/g++.dg/parse/defarg12.C @@ -9,5 +9,5 @@ struct A void foo() { - A().i; + A().i; /* { dg-error "default argument" } */ } diff --git a/gcc/testsuite/g++.dg/template/error15.C b/gcc/testsuite/g++.dg/template/error15.C index 6bd1f77e874b..b7c7bc8ca47d 100644 --- a/gcc/testsuite/g++.dg/template/error15.C +++ b/gcc/testsuite/g++.dg/template/error15.C @@ -18,7 +18,7 @@ protected: template void B::g(void) { - f(); + f(); // { dg-error "default argument" } } template class B;