From ef4b1d6de554112c5716aff60e6b8b56d32328e4 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 1 Jun 2012 17:19:22 -0400 Subject: [PATCH] re PR c++/52725 (error: "capture of non-variable" for new-expression incorrectly parsed as lambda-expression) PR c++/52725 * parser.c (cp_parser_binary_expression): Bail early if we're parsing tentatively and the LHS has a parse error. From-SVN: r188127 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/parser.c | 3 +++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/parse/new6.C | 10 ++++++++++ .../g++.dg/template/sizeof-template-argument.C | 4 ++-- 5 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/new6.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 781f7501394..ba5937acb45 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2012-06-01 Jason Merrill + PR c++/52725 + * parser.c (cp_parser_binary_expression): Bail early if we're parsing + tentatively and the LHS has a parse error. + PR c++/53137 * pt.c (instantiate_class_template_1): Set LAMBDA_EXPR_THIS_CAPTURE. (instantiate_decl): Don't push_to_top_level for local class methods. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 547f9e21438..7f9a94b5c06 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -7246,6 +7246,9 @@ cp_parser_binary_expression (cp_parser* parser, bool cast_p, current.lhs_type = ERROR_MARK; current.prec = prec; + if (cp_parser_error_occurred (parser)) + return error_mark_node; + for (;;) { /* Get an operator token. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 76e4e6b0fe8..dd1c651a357 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-06-01 Jason Merrill + + PR c++/52725 + * g++.dg/parse/new6.C: New. + * g++.dg/template/sizeof-template-argument.C: Adjust error message. + 2012-06-01 Eric Botcazou * c-c++-common/restrict-2.c: Revert previous change. diff --git a/gcc/testsuite/g++.dg/parse/new6.C b/gcc/testsuite/g++.dg/parse/new6.C new file mode 100644 index 00000000000..213837c3a3e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/new6.C @@ -0,0 +1,10 @@ +// PR c++/52725 + +struct A { }; + +const int n = 42; + +void f() +{ + A** p = new (A*[n]); +} diff --git a/gcc/testsuite/g++.dg/template/sizeof-template-argument.C b/gcc/testsuite/g++.dg/template/sizeof-template-argument.C index 2cdc328598e..31aeeec9bfc 100644 --- a/gcc/testsuite/g++.dg/template/sizeof-template-argument.C +++ b/gcc/testsuite/g++.dg/template/sizeof-template-argument.C @@ -3,9 +3,9 @@ template struct A {}; -template struct B : A {}; /* { dg-error "parse error in template argument list" } */ +template struct B : A {}; /* { dg-error "template argument" } */ -template struct C : A {}; /* { dg-error "parse error in template argument list" } */ +template struct C : A {}; /* { dg-error "template argument" } */ int a; -- 2.30.2