aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMikael Morin <mikael.morin@sfr.fr>2011-08-19 00:42:38 +0200
committerMikael Morin <mikael@gcc.gnu.org>2011-08-18 22:42:38 +0000
commitdf1a69f6a85e6c82e206388daa459f06d2e92876 (patch)
treecd909034298135072ec57ac3e175166acb6dba01 /gcc
parenta7ad08aef73fd2c4219a31a419e41ce2e5408a09 (diff)
downloadgcc-df1a69f6a85e6c82e206388daa459f06d2e92876.zip
gcc-df1a69f6a85e6c82e206388daa459f06d2e92876.tar.gz
gcc-df1a69f6a85e6c82e206388daa459f06d2e92876.tar.bz2
re PR fortran/50071 (gfortran does not distinguish labels in different type scoping units)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog15
-rw-r--r--gcc/fortran/gfortran.h4
-rw-r--r--gcc/fortran/parse.c14
-rw-r--r--gcc/fortran/resolve.c5
-rw-r--r--gcc/fortran/st.c1
-rw-r--r--gcc/fortran/trans.c1
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/end_associate_label_1.f9014
-rw-r--r--gcc/testsuite/gfortran.dg/end_block_label_1.f9014
9 files changed, 70 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 85538ee..b2f9262 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index b4a4f85..ae0a138 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 0aaad90..aab711c 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;
@@ -1627,6 +1629,18 @@ accept_statement (gfc_statement st)
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;
add_statement ();
}
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 53234fa..ea184a2 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 c051d6a..572baaf 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 4c97cfd..4a71c43 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 9ac1ed7..931400c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..0affc41
--- /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 <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
index 0000000..feb12fc
--- /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 <burnus@net-b.de>
+
+ block
+ goto 1
+ print *, 'Hello'
+1 end block
+end
+