diff options
author | Tobias Schlüter <tobi@gcc.gnu.org> | 2009-03-29 19:15:48 +0200 |
---|---|---|
committer | Tobias Schlüter <tobi@gcc.gnu.org> | 2009-03-29 19:15:48 +0200 |
commit | d80c695ff0da09ebbb0d7b4370396e36d4e58180 (patch) | |
tree | 932f0cbc2ec95ee8d7f4af821c8414255f18bcaa /gcc/fortran/parse.c | |
parent | eeae74a1a98590abc9eda18b198ff92f473f2e36 (diff) | |
download | gcc-d80c695ff0da09ebbb0d7b4370396e36d4e58180.zip gcc-d80c695ff0da09ebbb0d7b4370396e36d4e58180.tar.gz gcc-d80c695ff0da09ebbb0d7b4370396e36d4e58180.tar.bz2 |
re PR fortran/38507 (Bogus Warning: Deleted feature: GOTO jumps to END of construct)
fortran/
PR fortran/38507
* gfortran.h (gfc_st_label): Fix comment.
(gfc_exec_op): Add statement code EXEC_END_BLOCK for end of block.
* parse.c (accept_statement): Use EXEC_END_BLOCK for END IF and
END SELECT with labels.
(check_do_closure): Fix formatting.
(parse_do_block): Fix typo in error message.
* resolve.c (code_stack): Remove tail member. Update comment to
new use of reachable_labels.
(reachable_labels): Rename to ...
(find_reachable_labels): ... this. Overhaul. Update preceding
comment.
(resolve_branch): Fix comment preceding function. Rewrite.
(resolve_code): Update call to find_reachable_labels. Add code to
deal with EXEC_END_BLOCK.
* st.c (gfc_free_statement): Add code to deal with EXEC_END_BLOCK.
* trans.c (gfc_trans_code): Likewise.
testsuite/
* do_4.f: New.
* goto_2.f90: Correct expected warnings.
* goto_4.f90: Likewise.
* goto_5.f90: New.
From-SVN: r145245
Diffstat (limited to 'gcc/fortran/parse.c')
-rw-r--r-- | gcc/fortran/parse.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index 1bf13e2..0800fc1 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -1465,16 +1465,23 @@ accept_statement (gfc_statement st) /* If the statement is the end of a block, lay down a special code that allows a branch to the end of the block from within the - construct. */ + construct. IF and SELECT are treated differently from DO + (where EXEC_NOP is added inside the loop) for two + reasons: + 1. END DO has a meaning in the sense that after a GOTO to + it, the loop counter must be increased. + 2. IF blocks and SELECT blocks can consist of multiple + parallel blocks (IF ... ELSE IF ... ELSE ... END IF). + Putting the label before the END IF would make the jump + from, say, the ELSE IF block to the END IF illegal. */ case ST_ENDIF: case ST_END_SELECT: if (gfc_statement_label != NULL) { - new_st.op = EXEC_NOP; + new_st.op = EXEC_END_BLOCK; add_statement (); } - break; /* The end-of-program unit statements do not get the special @@ -2817,7 +2824,6 @@ check_do_closure (void) if (p->ext.end_do_label == gfc_statement_label) { - if (p == gfc_state_stack) return 1; @@ -2895,7 +2901,7 @@ loop: name, but in that case we must have seen ST_ENDDO first). We only complain about this in pedantic mode. */ if (gfc_current_block () != NULL) - gfc_error_now ("named block DO at %L requires matching ENDDO name", + gfc_error_now ("Named block DO at %L requires matching ENDDO name", &gfc_current_block()->declared_at); break; |