diff options
author | Mark Mitchell <mark@codesourcery.com> | 2002-12-31 18:48:19 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2002-12-31 18:48:19 +0000 |
commit | abda8efedaa6fe00a1264fc0d022c789f4eb005b (patch) | |
tree | 4ec975132a8af09b538f4237c4c4eea7dbf01842 | |
parent | 9e56a932f967a037cb38f8d939e5250736e39d68 (diff) | |
download | gcc-abda8efedaa6fe00a1264fc0d022c789f4eb005b.zip gcc-abda8efedaa6fe00a1264fc0d022c789f4eb005b.tar.gz gcc-abda8efedaa6fe00a1264fc0d022c789f4eb005b.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/expr1.C | 8 |
4 files changed, 24 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8a54833..49b4ca1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2002-12-31 Mark Mitchell <mark@codesourcery.com> + + PR c++/9112 + * parser.c (cp_parser_direct_declarator): Handle erroneous + parenthesized declarators correctly. + 2002-12-31 Gabriel Dos Reis <gdr@integrable-solutions.net> * cp-tree.h (pending_lang_change): Declare. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 6c40d9d..13876e5 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 b82d4f3..7fc0cd9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2002-12-31 Mark Mitchell <mark@codesourcery.com> + + PR c++/9112 + * g++.dg/parse/expr1.C: New test. + 2002-12-30 Daniel Jacobowitz <drow@mvista.com> * 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 0000000..2ef8218 --- /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 (); +} |