re PR c++/84446 (ICE with broken lambda)
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 20 Feb 2018 09:02:12 +0000 (09:02 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 20 Feb 2018 09:02:12 +0000 (09:02 +0000)
/cp
2018-02-20  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/84446
* parser.c (cp_parser_init_declarator): Don't call start_lambda_scope
on error_mark_node.

/testsuite
2018-02-20  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/84446
* g++.dg/cpp0x/lambda/lambda-ice27.C: New.

From-SVN: r257841

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice27.C [new file with mode: 0644]

index 1e0f9eb321f88f94d35aa5b79c2e272ea1887cf3..f2bcce9784e1d5a79be67fc8ed02f98e4373d461 100644 (file)
@@ -1,3 +1,9 @@
+2018-02-20  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/84446
+       * parser.c (cp_parser_init_declarator): Don't call start_lambda_scope
+       on error_mark_node.
+
 2018-02-20  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/84445
index d8d788052ab130f6ebfeafca7dac47642c75a739..2bb0d2da5fec319e66747b9e4ecd14cf3a353dab 100644 (file)
@@ -19650,12 +19650,12 @@ cp_parser_init_declarator (cp_parser* parser,
             member templates.  The former involves deferring
             parsing of the initializer until end of class as with default
             arguments.  So right here we only handle the latter.  */
-         if (!member_p && processing_template_decl)
+         if (!member_p && processing_template_decl && decl != error_mark_node)
            start_lambda_scope (decl);
          initializer = cp_parser_initializer (parser,
                                               &is_direct_init,
                                               &is_non_constant_init);
-         if (!member_p && processing_template_decl)
+         if (!member_p && processing_template_decl && decl != error_mark_node)
            finish_lambda_scope ();
          if (initializer == error_mark_node)
            cp_parser_skip_to_end_of_statement (parser);
index 29157ac3c24d05cb4ad2063b3dc4093fa5089236..6a0c3bdcb5512d47e818c69a91379121d17679ce 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-20  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/84446
+       * g++.dg/cpp0x/lambda/lambda-ice27.C: New.
+
 2018-02-20  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/84445
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice27.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice27.C
new file mode 100644 (file)
index 0000000..04c44a3
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/84446
+// { dg-do compile { target c++11 } }
+
+template<int> void foo()
+{
+  int i,
+  i = [] { virtual }();  // { dg-error "redeclaration|expected" }
+}