From: Jason Merrill Date: Fri, 1 Jun 2012 21:19:22 +0000 (-0400) Subject: re PR c++/52725 (error: "capture of non-variable" for new-expression incorrectly... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ef4b1d6de554112c5716aff60e6b8b56d32328e4;p=gcc.git 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 --- 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;