diff options
author | Andre Vehreschild <vehre@gcc.gnu.org> | 2016-01-28 12:34:03 +0100 |
---|---|---|
committer | Andre Vehreschild <vehre@gcc.gnu.org> | 2016-01-28 12:34:03 +0100 |
commit | 874108a9050af162504c3769020d40fd498a4be1 (patch) | |
tree | 202e6b9c3587ff2377f83624c9407a69f6045c68 /gcc/fortran | |
parent | 30480bcd794f8a0d4e489b8eb3f043b2ab72e7e8 (diff) | |
download | gcc-874108a9050af162504c3769020d40fd498a4be1.zip gcc-874108a9050af162504c3769020d40fd498a4be1.tar.gz gcc-874108a9050af162504c3769020d40fd498a4be1.tar.bz2 |
re PR fortran/62536 (ICE (segfault) for invalid END BLOCK statement)
gcc/fortran/ChangeLog:
2016-01-28 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/62536
* decl.c (gfc_match_end): Only unnest and remove BLOCK namespaces
when the END encountered does not match a BLOCK's end.
gcc/testsuite/ChangeLog:
2016-01-28 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/62536
* gfortran.dg/block_15.f08: New test.
* gfortran.dg/block_end_error_1.f90: Need to catch additional error
on incorrectly closed BLOCK.
From-SVN: r232919
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 7 |
2 files changed, 11 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 1ea9d29..386bd42 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-01-28 Andre Vehreschild <vehre@gcc.gnu.org> + + PR fortran/62536 + * decl.c (gfc_match_end): Only unnest and remove BLOCK namespaces + when the END encountered does not match a BLOCK's end. + 2016-01-27 Janus Weil <janus@gcc.gnu.org> PR fortran/69484 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 7c0e011..df81369 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -6327,6 +6327,7 @@ gfc_match_end (gfc_statement *st) gfc_namespace *parent_ns, *ns, *prev_ns; gfc_namespace **nsp; bool abreviated_modproc_decl; + bool got_matching_end = false; old_loc = gfc_current_locus; if (gfc_match ("end") != MATCH_YES) @@ -6510,6 +6511,8 @@ gfc_match_end (gfc_statement *st) ? "END PROCEDURE" : gfc_ascii_statement(*st), &old_loc); goto cleanup; } + else + got_matching_end = true; old_loc = gfc_current_locus; /* If we're at the end, make sure a block name wasn't required. */ @@ -6581,7 +6584,7 @@ cleanup: /* If we are missing an END BLOCK, we created a half-ready namespace. Remove it from the parent namespace's sibling list. */ - while (state == COMP_BLOCK) + while (state == COMP_BLOCK && !got_matching_end) { parent_ns = gfc_current_ns->parent; @@ -6601,7 +6604,7 @@ cleanup: prev_ns = ns; ns = ns->sibling; } - + gfc_free_namespace (gfc_current_ns); gfc_current_ns = parent_ns; gfc_state_stack = gfc_state_stack->previous; |