aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2002-12-31 18:48:19 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2002-12-31 18:48:19 +0000
commitabda8efedaa6fe00a1264fc0d022c789f4eb005b (patch)
tree4ec975132a8af09b538f4237c4c4eea7dbf01842
parent9e56a932f967a037cb38f8d939e5250736e39d68 (diff)
downloadgcc-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/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 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 ();
+}