re PR fortran/50071 (gfortran does not distinguish labels in different type scoping...
authorMikael Morin <mikael.morin@sfr.fr>
Thu, 18 Aug 2011 22:42:38 +0000 (00:42 +0200)
committerMikael Morin <mikael@gcc.gnu.org>
Thu, 18 Aug 2011 22:42:38 +0000 (22:42 +0000)
2011-08-19  Mikael Morin  <mikael.morin@sfr.fr>

PR fortran/50071
* gfortran.h (gfc_exec_op): New constant EXEC_END_NESTED_BLOCK.
* parse.c (check_statement_label): Accept ST_END_BLOCK and
ST_END_ASSOCIATE as valid branch target.
(accept_statement): Change EXEC_END_BLOCK to EXEC_END_NESTED_BLOCK.
Add EXEC_END_BLOCK code in the ST_END_BLOCK and ST_END_ASSOCIATE cases.
* resolve.c (find_reachable_labels): Change EXEC_END_BLOCK to
EXEC_END_NESTED_BLOCK.
(resolve_branch): Ditto.
(resolve_code): Add EXEC_END_NESTED_BLOCK case.
* st.c (gfc_free_statement): Ditto.
* trans.c (trans_code): Ditto.

2011-08-19  Mikael Morin  <mikael.morin@sfr.fr>

PR fortran/50071
* gfortran.dg/end_block_label_1.f90: New test.
* gfortran.dg/end_associate_label_1.f90: New test.

From-SVN: r177885

gcc/fortran/ChangeLog
gcc/fortran/gfortran.h
gcc/fortran/parse.c
gcc/fortran/resolve.c
gcc/fortran/st.c
gcc/fortran/trans.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/end_associate_label_1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/end_block_label_1.f90 [new file with mode: 0644]

index 85538ee50f59396daaa1fdcb8b92461c0f5d3e4e..b2f92622901e14bd8b2198e9a22d570e49b9242c 100644 (file)
@@ -1,3 +1,18 @@
+2011-08-19  Mikael Morin  <mikael.morin@sfr.fr>
+
+       PR fortran/50071
+       * gfortran.h (gfc_exec_op): New constant EXEC_END_NESTED_BLOCK.
+       * parse.c (check_statement_label): Accept ST_END_BLOCK and
+       ST_END_ASSOCIATE as valid branch target.
+       (accept_statement): Change EXEC_END_BLOCK to EXEC_END_NESTED_BLOCK.
+       Add EXEC_END_BLOCK code in the ST_END_BLOCK and ST_END_ASSOCIATE cases.
+       * resolve.c (find_reachable_labels): Change EXEC_END_BLOCK to
+       EXEC_END_NESTED_BLOCK.
+       (resolve_branch): Ditto.
+       (resolve_code): Add EXEC_END_NESTED_BLOCK case.
+       * st.c (gfc_free_statement): Ditto.
+       * trans.c (trans_code): Ditto.
+
 2011-08-18  Mikael Morin  <mikael.morin@sfr.fr>
 
        PR fortran/50071
index b4a4f8593ee43e900dbcdbc624e1d7d68a3941fc..ae0a138e7bdaae9db6bea316c15a495784b2a3cd 100644 (file)
@@ -2048,8 +2048,8 @@ gfc_association_list;
 /* Executable statements that fill gfc_code structures.  */
 typedef enum
 {
-  EXEC_NOP = 1, EXEC_END_BLOCK, EXEC_ASSIGN, EXEC_LABEL_ASSIGN,
-  EXEC_POINTER_ASSIGN, EXEC_CRITICAL, EXEC_ERROR_STOP,
+  EXEC_NOP = 1, EXEC_END_NESTED_BLOCK, EXEC_END_BLOCK, EXEC_ASSIGN,
+  EXEC_LABEL_ASSIGN, EXEC_POINTER_ASSIGN, EXEC_CRITICAL, EXEC_ERROR_STOP,
   EXEC_GOTO, EXEC_CALL, EXEC_COMPCALL, EXEC_ASSIGN_CALL, EXEC_RETURN,
   EXEC_ENTRY, EXEC_PAUSE, EXEC_STOP, EXEC_CONTINUE, EXEC_INIT_ASSIGN,
   EXEC_IF, EXEC_ARITHMETIC_IF, EXEC_DO, EXEC_DO_WHILE, EXEC_SELECT, EXEC_BLOCK,
index 0aaad90fca031068c59bb054677611a1461a2ab7..aab711cdaae534a47347e2b2e9199e4ad2977be4 100644 (file)
@@ -1115,6 +1115,8 @@ check_statement_label (gfc_statement st)
     case ST_ENDIF:
     case ST_END_SELECT:
     case ST_END_CRITICAL:
+    case ST_END_BLOCK:
+    case ST_END_ASSOCIATE:
     case_executable:
     case_exec_markers:
       type = ST_LABEL_TARGET;
@@ -1625,6 +1627,18 @@ accept_statement (gfc_statement st)
     case ST_ENDIF:
     case ST_END_SELECT:
     case ST_END_CRITICAL:
+      if (gfc_statement_label != NULL)
+       {
+         new_st.op = EXEC_END_NESTED_BLOCK;
+         add_statement ();
+       }
+      break;
+
+      /* In the case of BLOCK and ASSOCIATE blocks, there cannot be more than
+        one parallel block.  Thus, we add the special code to the nested block
+        itself, instead of the parent one.  */
+    case ST_END_BLOCK:
+    case ST_END_ASSOCIATE:
       if (gfc_statement_label != NULL)
        {
          new_st.op = EXEC_END_BLOCK;
index 53234fa5e3990f7a36fda20fa23b25cc85f7ce92..ea184a23f0db7ccb048324bdd038b6d1e40d1558 100644 (file)
@@ -8202,7 +8202,7 @@ find_reachable_labels (gfc_code *block)
      up through the code_stack.  */
   for (c = block; c; c = c->next)
     {
-      if (c->here && c->op != EXEC_END_BLOCK)
+      if (c->here && c->op != EXEC_END_NESTED_BLOCK)
        bitmap_set_bit (cs_base->reachable_labels, c->here->value);
     }
 
@@ -8381,7 +8381,7 @@ resolve_branch (gfc_st_label *label, gfc_code *code)
 
   if (stack)
     {
-      gcc_assert (stack->current->next->op == EXEC_END_BLOCK);
+      gcc_assert (stack->current->next->op == EXEC_END_NESTED_BLOCK);
       return;
     }
 
@@ -9117,6 +9117,7 @@ resolve_code (gfc_code *code, gfc_namespace *ns)
        {
        case EXEC_NOP:
        case EXEC_END_BLOCK:
+       case EXEC_END_NESTED_BLOCK:
        case EXEC_CYCLE:
        case EXEC_PAUSE:
        case EXEC_STOP:
index c051d6a0c97a3afe47350523d345f1abe67d4462..572baafc3e99951cc3cfb71c8d8a627d1c9c87f4 100644 (file)
@@ -89,6 +89,7 @@ gfc_free_statement (gfc_code *p)
     {
     case EXEC_NOP:
     case EXEC_END_BLOCK:
+    case EXEC_END_NESTED_BLOCK:
     case EXEC_ASSIGN:
     case EXEC_INIT_ASSIGN:
     case EXEC_GOTO:
index 4c97cfdc6223b2076b8b7c247e68106e782bb318..4a71c43fdcc57c9f4d26f556d92905dc03ee19fa 100644 (file)
@@ -1188,6 +1188,7 @@ trans_code (gfc_code * code, tree cond)
        {
        case EXEC_NOP:
        case EXEC_END_BLOCK:
+       case EXEC_END_NESTED_BLOCK:
        case EXEC_END_PROCEDURE:
          res = NULL_TREE;
          break;
index 9ac1ed7b77422b070fd3fdb80e47cff5e4919604..931400c42176d36bbc11d57ebf4bdf8960d676e8 100644 (file)
@@ -1,3 +1,9 @@
+2011-08-19  Mikael Morin  <mikael.morin@sfr.fr>
+
+       PR fortran/50071
+       * gfortran.dg/end_block_label_1.f90: New test.
+       * gfortran.dg/end_associate_label_1.f90: New test.
+
 2011-08-18  Joseph Myers  <joseph@codesourcery.com>
 
        * gcc.dg/c1x-pointer-float-1.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/end_associate_label_1.f90 b/gcc/testsuite/gfortran.dg/end_associate_label_1.f90
new file mode 100644 (file)
index 0000000..0affc41
--- /dev/null
@@ -0,0 +1,14 @@
+! { dg-do compile }
+!
+! PR fortran/50071
+! A label in an END ASSOCIATE statement was ignored; as a result, a GOTO
+! to such a label was rejected.
+!
+! Contributed by Tobias Burnus <burnus@net-b.de>
+
+   integer :: i
+   associate (j => i)
+     goto 1
+     print *, 'Hello'
+1  end associate
+end
diff --git a/gcc/testsuite/gfortran.dg/end_block_label_1.f90 b/gcc/testsuite/gfortran.dg/end_block_label_1.f90
new file mode 100644 (file)
index 0000000..feb12fc
--- /dev/null
@@ -0,0 +1,14 @@
+! { dg-do compile }
+!
+! PR fortran/50071
+! A label in an END BLOCK statement was ignored; as a result, a GOTO
+! to such a label was rejected.
+!
+! Contributed by Tobias Burnus <burnus@net-b.de>
+
+   block
+      goto 1
+      print *, 'Hello'
+1  end block
+end
+