summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2002-12-31 18:48:19 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2002-12-31 18:48:19 +0000
commitefd34bd3f1ce435f08f244d04794280bb9be18d4 (patch)
tree4ec975132a8af09b538f4237c4c4eea7dbf01842
parent59614c4ae3caf676c4c7393eeaea2d297e20d8b9 (diff)
downloadppe42-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/ChangeLog6
-rw-r--r--gcc/cp/parser.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/parse/expr1.C8
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 ();
+}
OpenPOWER on IntegriCloud