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
This commit is contained in:
Andre Vehreschild 2016-01-28 12:34:03 +01:00
parent 30480bcd79
commit 874108a905
4 changed files with 19 additions and 3 deletions

View File

@ -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

View File

@ -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;

View File

@ -1,3 +1,10 @@
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.
2016-01-28 Ilya Enkovich <enkovich.gnu@gmail.com>
* gcc.dg/declare-simd.c: New test.

View File

@ -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" }