From: Mark Mitchell Date: Tue, 31 Dec 2002 18:48:19 +0000 (+0000) Subject: re PR c++/9112 (new C++ parser rejects code older parsers accepted) X-Git-Tag: releases/gcc-3.4.0~9705 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=abda8efedaa6fe00a1264fc0d022c789f4eb005b;p=thirdparty%2Fgcc.git re PR c++/9112 (new C++ parser rejects code older parsers accepted) PR c++/9112 * parser.c (cp_parser_direct_declarator): Handle erroneous parenthesized declarators correctly. PR c++/9112 * g++.dg/parse/expr1.C: New test. From-SVN: r60706 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8a5483350ed3..49b4ca11162a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2002-12-31 Mark Mitchell + + PR c++/9112 + * parser.c (cp_parser_direct_declarator): Handle erroneous + parenthesized declarators correctly. + 2002-12-31 Gabriel Dos Reis * cp-tree.h (pending_lang_change): Declare. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 6c40d9db4748..13876e529ba2 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -10023,6 +10023,8 @@ cp_parser_direct_declarator (parser, abstract_p, ctor_dtor_or_conv_p) declarator. */ if (token->type == CPP_OPEN_PAREN) { + bool error_p; + /* For an abstract declarator we do not know whether we are looking at the beginning of a parameter-declaration-clause, or at a parenthesized abstract declarator. For example, if @@ -10041,7 +10043,7 @@ cp_parser_direct_declarator (parser, abstract_p, ctor_dtor_or_conv_p) declarator = cp_parser_declarator (parser, abstract_p, ctor_dtor_or_conv_p); /* Expect a `)'. */ - cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'"); + error_p = !cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'"); /* If parsing a parenthesized abstract declarator didn't work, try a parameter-declaration-clause. */ @@ -10050,7 +10052,8 @@ cp_parser_direct_declarator (parser, abstract_p, ctor_dtor_or_conv_p) /* If we were not parsing an abstract declarator, but failed to find a satisfactory nested declarator, then an error has occurred. */ - else if (!abstract_p && declarator == error_mark_node) + else if (!abstract_p + && (declarator == error_mark_node || error_p)) return error_mark_node; /* Default args cannot appear in an abstract decl. */ parser->default_arg_ok_p = false; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b82d4f3eb2d1..7fc0cd9444be 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2002-12-31 Mark Mitchell + + PR c++/9112 + * g++.dg/parse/expr1.C: New test. + 2002-12-30 Daniel Jacobowitz * gcc.c-torture/compile/20021230-1.c: New test. diff --git a/gcc/testsuite/g++.dg/parse/expr1.C b/gcc/testsuite/g++.dg/parse/expr1.C new file mode 100644 index 000000000000..2ef82185b892 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/expr1.C @@ -0,0 +1,8 @@ +struct A { + A (int, int); + void f (); +}; + +void f (int a) { + A (a, a).f (); +}