This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: PATCH: PR c++/39060: [4.4 regression] ICE with lots of invalid member functions
On Sat, Mar 07, 2009 at 08:25:20PM -0500, Jason Merrill wrote:
> OK, thanks.
>
This is the patch I am checking in. I adjusted some testcases.
Thanks.
H.J.
----
gcc/cp/
2009-03-08 H.J. Lu <hongjiu.lu@intel.com>
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 <hongjiu.lu@intel.com>
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.
--- gcc/cp/parser.c.pr39060 2009-03-05 07:09:25.000000000 -0800
+++ gcc/cp/parser.c 2009-03-08 07:57:21.000000000 -0700
@@ -18291,6 +18291,11 @@ cp_parser_late_parsing_default_args (cp_
/* 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);
--- gcc/testsuite/g++.dg/other/new1.C.pr39060 2006-11-18 06:24:10.000000000 -0800
+++ gcc/testsuite/g++.dg/other/new1.C 2009-03-08 10:07:43.000000000 -0700
@@ -10,5 +10,5 @@ struct A
void foo()
{
- new A;
+ new A; // { dg-error "default argument" }
}
--- gcc/testsuite/g++.dg/other/pr39060.C.pr39060 2009-03-08 07:57:21.000000000 -0700
+++ gcc/testsuite/g++.dg/other/pr39060.C 2009-03-08 07:57:21.000000000 -0700
@@ -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" }
--- gcc/testsuite/g++.dg/parse/crash40.C.pr39060 2007-12-11 14:42:24.000000000 -0800
+++ gcc/testsuite/g++.dg/parse/crash40.C 2009-03-08 10:13:58.000000000 -0700
@@ -37,6 +37,6 @@ void bar()
int i;
i.C::foo<0>(); /* { dg-error "which is of non-class type" } */
- S<false> s;
+ S<false> s; /* { dg-error "default argument" } */
SS<false> ss; /* { dg-error "within this context" } */
}
--- gcc/testsuite/g++.dg/parse/defarg12.C.pr39060 2007-01-29 09:09:39.000000000 -0800
+++ gcc/testsuite/g++.dg/parse/defarg12.C 2009-03-08 10:15:18.000000000 -0700
@@ -9,5 +9,5 @@ struct A
void foo()
{
- A().i;
+ A().i; /* { dg-error "default argument" } */
}
--- gcc/testsuite/g++.dg/template/error15.C.pr39060 2006-11-18 06:24:41.000000000 -0800
+++ gcc/testsuite/g++.dg/template/error15.C 2009-03-08 10:16:32.000000000 -0700
@@ -18,7 +18,7 @@ protected:
template <class T>
void B<T>::g(void) {
- f();
+ f(); // { dg-error "default argument" }
}
template class B<long>;