aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2016-07-21 02:05:58 -0400
committerJason Merrill <jason@gcc.gnu.org>2016-07-21 02:05:58 -0400
commit172f0e1311f23be40aeb4816f77793dc1317612d (patch)
tree014a54747e8583208709b6c6070f0a7219e2cf58 /gcc
parentdd5dda561e34151f0145d0c0ceabf4d4a14509a3 (diff)
downloadgcc-172f0e1311f23be40aeb4816f77793dc1317612d.zip
gcc-172f0e1311f23be40aeb4816f77793dc1317612d.tar.gz
gcc-172f0e1311f23be40aeb4816f77793dc1317612d.tar.bz2
PR c++/70781 - ICE on ill-formed lambda.
* parser.c (cp_parser_lambda_expression): Unset OK if there was an error parsing the lambda-declarator. From-SVN: r238563
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/parser.c6
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice16.C8
3 files changed, 16 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 78487ea..2e8877f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2016-07-21 Jason Merrill <jason@redhat.com>
+ PR c++/70781
+ * parser.c (cp_parser_lambda_expression): Unset OK if there was an
+ error parsing the lambda-declarator.
+
PR c++/71896
* constexpr.c (cxx_eval_binary_expression): Handle comparison
between lowered and unlowered PTRMEM_CST.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 9bdb108..b71b9e5a 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -9771,10 +9771,12 @@ cp_parser_lambda_expression (cp_parser* parser)
ok &= cp_parser_lambda_declarator_opt (parser, lambda_expr);
+ if (ok && cp_parser_error_occurred (parser))
+ ok = false;
+
if (ok)
{
- if (!cp_parser_error_occurred (parser)
- && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)
+ if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)
&& cp_parser_start_tentative_firewall (parser))
start = token;
cp_parser_lambda_body (parser, lambda_expr);
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice16.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice16.C
new file mode 100644
index 0000000..e94a0b6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice16.C
@@ -0,0 +1,8 @@
+// PR c++/70781
+// { dg-do compile { target c++11 } }
+
+template < typename T >
+void foo ()
+{
+ T ([=] (S) { [=] {}; }); // { dg-error "" }
+}