From ae9b2a481c0f6510271cf12f86cd3b6b86490a96 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sun, 8 Mar 2009 17:29:12 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/parser.c | 5 +++++ gcc/testsuite/ChangeLog | 10 ++++++++++ gcc/testsuite/g++.dg/other/new1.C | 2 +- gcc/testsuite/g++.dg/other/pr39060.C | 19 +++++++++++++++++++ gcc/testsuite/g++.dg/parse/crash40.C | 2 +- gcc/testsuite/g++.dg/parse/defarg12.C | 2 +- gcc/testsuite/g++.dg/template/error15.C | 2 +- 8 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/other/pr39060.C 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; -- 2.47.3