summaryrefslogtreecommitdiff
path: root/gcc/fortran/parse.c
diff options
context:
space:
mode:
authormikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4>2011-08-18 22:42:38 +0000
committermikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4>2011-08-18 22:42:38 +0000
commit045b8fbbe3bc8c6698d44381d8d4553b9cf28f6f (patch)
treecd909034298135072ec57ac3e175166acb6dba01 /gcc/fortran/parse.c
parentd76fd211d897409e82abbbcaf0df9b208f4f2964 (diff)
downloadgcc-045b8fbbe3bc8c6698d44381d8d4553b9cf28f6f.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177885 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/parse.c')
-rw-r--r--gcc/fortran/parse.c14
1 files changed, 14 insertions, 0 deletions
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;
@@ -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 ();
}