From cc7124a6358668c08152b1938d3f1ce8f55a8897 Mon Sep 17 00:00:00 2001 From: vehre Date: Thu, 28 Jan 2016 11:34:03 +0000 Subject: gcc/fortran/ChangeLog: 2016-01-28 Andre Vehreschild 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 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@232919 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/decl.c | 7 +++++-- gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/gfortran.dg/block_end_error_1.f90 | 2 +- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 1ea9d29a2ec..386bd420281 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-01-28 Andre Vehreschild + + 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 PR fortran/69484 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 7c0e01124ac..df813697a02 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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fb29f731b2a..63b4b1ff13f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-01-28 Andre Vehreschild + + 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. + 2016-01-28 Ilya Enkovich * gcc.dg/declare-simd.c: New test. diff --git a/gcc/testsuite/gfortran.dg/block_end_error_1.f90 b/gcc/testsuite/gfortran.dg/block_end_error_1.f90 index e7dcdfa966d..4bbe89bba72 100644 --- a/gcc/testsuite/gfortran.dg/block_end_error_1.f90 +++ b/gcc/testsuite/gfortran.dg/block_end_error_1.f90 @@ -6,5 +6,5 @@ subroutine s block end block named ! { dg-error "Syntax error in END BLOCK statement" } return -endsubroutine +endsubroutine ! { dg-error "Expecting END BLOCK statement" } ! { dg-prune-output "Unexpected end of file" } -- cgit v1.2.1