diff options
| author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-12-31 18:48:19 +0000 |
|---|---|---|
| committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-12-31 18:48:19 +0000 |
| commit | efd34bd3f1ce435f08f244d04794280bb9be18d4 (patch) | |
| tree | 4ec975132a8af09b538f4237c4c4eea7dbf01842 | |
| parent | 59614c4ae3caf676c4c7393eeaea2d297e20d8b9 (diff) | |
| download | ppe42-gcc-efd34bd3f1ce435f08f244d04794280bb9be18d4.tar.gz ppe42-gcc-efd34bd3f1ce435f08f244d04794280bb9be18d4.zip | |
PR c++/9112
* parser.c (cp_parser_direct_declarator): Handle erroneous
parenthesized declarators correctly.
PR c++/9112
* g++.dg/parse/expr1.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@60706 138bc75d-0d04-0410-961f-82ee72b054a4
| -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 8a5483350ed..49b4ca11162 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 6c40d9db474..13876e529ba 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 b82d4f3eb2d..7fc0cd9444b 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 00000000000..2ef82185b89 --- /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 (); +} |

