From df1a69f6a85e6c82e206388daa459f06d2e92876 Mon Sep 17 00:00:00 2001 From: Mikael Morin Date: Fri, 19 Aug 2011 00:42:38 +0200 Subject: [PATCH] re PR fortran/50071 (gfortran does not distinguish labels in different type scoping units) 2011-08-19 Mikael Morin 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 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 | 15 +++++++++++++++ gcc/fortran/gfortran.h | 4 ++-- gcc/fortran/parse.c | 14 ++++++++++++++ gcc/fortran/resolve.c | 5 +++-- gcc/fortran/st.c | 1 + gcc/fortran/trans.c | 1 + gcc/testsuite/ChangeLog | 6 ++++++ .../gfortran.dg/end_associate_label_1.f90 | 14 ++++++++++++++ gcc/testsuite/gfortran.dg/end_block_label_1.f90 | 14 ++++++++++++++ 9 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/end_associate_label_1.f90 create mode 100644 gcc/testsuite/gfortran.dg/end_block_label_1.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 85538ee50f5..b2f92622901 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,18 @@ +2011-08-19 Mikael Morin + + 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 PR fortran/50071 diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index b4a4f8593ee..ae0a138e7bd 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -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, diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index 0aaad90fca0..aab711cdaae 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -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; diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 53234fa5e39..ea184a23f0d 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -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: diff --git a/gcc/fortran/st.c b/gcc/fortran/st.c index c051d6a0c97..572baafc3e9 100644 --- a/gcc/fortran/st.c +++ b/gcc/fortran/st.c @@ -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: diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c index 4c97cfdc622..4a71c43fdcc 100644 --- a/gcc/fortran/trans.c +++ b/gcc/fortran/trans.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9ac1ed7b774..931400c4217 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-08-19 Mikael Morin + + 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 * 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 index 00000000000..0affc418740 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/end_associate_label_1.f90 @@ -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 + + 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 index 00000000000..feb12fcf8db --- /dev/null +++ b/gcc/testsuite/gfortran.dg/end_block_label_1.f90 @@ -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 + + block + goto 1 + print *, 'Hello' +1 end block +end +