re PR c++/32080 (Can goto a function try-block)
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 24 May 2012 14:47:06 +0000 (14:47 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 24 May 2012 14:47:06 +0000 (14:47 +0000)
/cp
2012-05-24  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/32080
* parser.c (cp_parser_ctor_initializer_opt_and_function_body,
cp_parser_function_body): Add a bool parameter, true when parsing
a function-try-block.
(cp_parser_function_try_block): Pass true to the above.
(cp_parser_function_definition_after_declarator,
cp_parser_function_transaction): Adjust.

/testsuite
2012-05-24  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/32080
* g++.dg/eh/goto2.C: New.

From-SVN: r187837

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/eh/goto2.C [new file with mode: 0644]

index c3d98418316b57f34136cf0c015245d1e73a5104..4da78b850cb1bd0e642b18aadd3ab88964dfdeb5 100644 (file)
@@ -1,3 +1,13 @@
+2012-05-24  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/32080
+       * parser.c (cp_parser_ctor_initializer_opt_and_function_body,
+       cp_parser_function_body): Add a bool parameter, true when parsing
+       a function-try-block.
+       (cp_parser_function_try_block): Pass true to the above.
+       (cp_parser_function_definition_after_declarator,
+       cp_parser_function_transaction): Adjust.
+
 2012-05-23  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/29185
index 56e54634a4eacd3186b692c22de56e03e034c42b..165fdc2c4e6a886c165da2d2bde8658754da6406 100644 (file)
@@ -1989,7 +1989,7 @@ static cp_parameter_declarator *cp_parser_parameter_declaration
 static tree cp_parser_default_argument 
   (cp_parser *, bool);
 static void cp_parser_function_body
-  (cp_parser *);
+  (cp_parser *, bool);
 static tree cp_parser_initializer
   (cp_parser *, bool *, bool *);
 static tree cp_parser_initializer_clause
@@ -2000,7 +2000,7 @@ static VEC(constructor_elt,gc) *cp_parser_initializer_list
   (cp_parser *, bool *);
 
 static bool cp_parser_ctor_initializer_opt_and_function_body
-  (cp_parser *);
+  (cp_parser *, bool);
 
 /* Classes [gram.class] */
 
@@ -17395,16 +17395,18 @@ cp_parser_default_argument (cp_parser *parser, bool template_parm_p)
      compound_statement  */
 
 static void
-cp_parser_function_body (cp_parser *parser)
+cp_parser_function_body (cp_parser *parser, bool in_function_try_block)
 {
-  cp_parser_compound_statement (parser, NULL, false, true);
+  cp_parser_compound_statement (parser, NULL, in_function_try_block, true);
 }
 
 /* Parse a ctor-initializer-opt followed by a function-body.  Return
-   true if a ctor-initializer was present.  */
+   true if a ctor-initializer was present.  When IN_FUNCTION_TRY_BLOCK
+   is true we are parsing a function-try-block.  */
 
 static bool
-cp_parser_ctor_initializer_opt_and_function_body (cp_parser *parser)
+cp_parser_ctor_initializer_opt_and_function_body (cp_parser *parser,
+                                                 bool in_function_try_block)
 {
   tree body, list;
   bool ctor_initializer_p;
@@ -17431,7 +17433,7 @@ cp_parser_ctor_initializer_opt_and_function_body (cp_parser *parser)
        last = STATEMENT_LIST_TAIL (list)->stmt;
     }
   /* Parse the function-body.  */
-  cp_parser_function_body (parser);
+  cp_parser_function_body (parser, in_function_try_block);
   if (check_body_p)
     check_constexpr_ctor_body (last, list);
   /* Finish the function body.  */
@@ -19707,8 +19709,8 @@ cp_parser_function_try_block (cp_parser* parser)
   /* Let the rest of the front end know where we are.  */
   try_block = begin_function_try_block (&compound_stmt);
   /* Parse the function-body.  */
-  ctor_initializer_p
-    = cp_parser_ctor_initializer_opt_and_function_body (parser);
+  ctor_initializer_p = cp_parser_ctor_initializer_opt_and_function_body
+    (parser, /*in_function_try_block=*/true);
   /* We're done with the `try' part.  */
   finish_function_try_block (try_block);
   /* Parse the handlers.  */
@@ -21048,8 +21050,8 @@ cp_parser_function_definition_after_declarator (cp_parser* parser,
   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
     ctor_initializer_p = cp_parser_function_try_block (parser);
   else
-    ctor_initializer_p
-      = cp_parser_ctor_initializer_opt_and_function_body (parser);
+    ctor_initializer_p = cp_parser_ctor_initializer_opt_and_function_body
+      (parser, /*in_function_try_block=*/false);
 
   finish_lambda_scope ();
 
@@ -27224,8 +27226,8 @@ cp_parser_function_transaction (cp_parser *parser, enum rid keyword)
   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
     ctor_initializer_p = cp_parser_function_try_block (parser);
   else
-    ctor_initializer_p
-      = cp_parser_ctor_initializer_opt_and_function_body (parser);
+    ctor_initializer_p = cp_parser_ctor_initializer_opt_and_function_body
+      (parser, /*in_function_try_block=*/false);
 
   parser->in_transaction = old_in;
 
index eeeb8e21f5508fd3b67166e330c12ea22c701961..c00557ece63690cd162a23c53d96a97a1dda8353 100644 (file)
@@ -1,3 +1,8 @@
+2012-05-24  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/32080
+       * g++.dg/eh/goto2.C: New.
+
 2012-05-24  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/53460
diff --git a/gcc/testsuite/g++.dg/eh/goto2.C b/gcc/testsuite/g++.dg/eh/goto2.C
new file mode 100644 (file)
index 0000000..de06d50
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/32080
+
+void f()
+try
+  {
+    goto l2;       // { dg-error "from here" }
+  l1: ;            // { dg-error "jump to label 'l1'" }
+  } catch (...)
+  {
+  l2: ;            // { dg-error "jump to label 'l2'|enters catch block" }
+    goto l1;       // { dg-error "from here|enters try block" }
+  }