Commit 0cab6b73 by Thomas Koenig

re PR fortran/50627 (Error recovery: ICE in gfc_free_namespace after diagnosing…

re PR fortran/50627 (Error recovery: ICE in gfc_free_namespace after diagnosing missing end of construct)

2013-02-02  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/50627
	PR fortran/56054
	* decl.c (gfc_match_end):  Remove half-ready namespace
	from parent if the end of a block is missing.
	* parse.c (parse_module):  Do not put namespace into
	gsymbol on error.

2013-02-02  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/50627
	PR fortran/56054
	* gfortran.dg/block_12.f90:  New test.
	* gfortran.dg/module_error_1.f90:  New test.

From-SVN: r195684
parent 18d2405e
2013-02-02 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/50627
PR fortran/56054
* decl.c (gfc_match_end): Remove half-ready namespace
from parent if the end of a block is missing.
* parse.c (parse_module): Do not put namespace into
gsymbol on error.
2012-01-30 Tobias Burnus <burnus@net-b.de> 2012-01-30 Tobias Burnus <burnus@net-b.de>
PR fortran/56138 PR fortran/56138
......
...@@ -5955,6 +5955,8 @@ gfc_match_end (gfc_statement *st) ...@@ -5955,6 +5955,8 @@ gfc_match_end (gfc_statement *st)
const char *target; const char *target;
int eos_ok; int eos_ok;
match m; match m;
gfc_namespace *parent_ns, *ns, *prev_ns;
gfc_namespace **nsp;
old_loc = gfc_current_locus; old_loc = gfc_current_locus;
if (gfc_match ("end") != MATCH_YES) if (gfc_match ("end") != MATCH_YES)
...@@ -6180,6 +6182,35 @@ syntax: ...@@ -6180,6 +6182,35 @@ syntax:
cleanup: cleanup:
gfc_current_locus = old_loc; gfc_current_locus = old_loc;
/* If we are missing an END BLOCK, we created a half-ready namespace.
Remove it from the parent namespace's sibling list. */
if (state == COMP_BLOCK)
{
parent_ns = gfc_current_ns->parent;
nsp = &(gfc_state_stack->previous->tail->ext.block.ns);
prev_ns = NULL;
ns = *nsp;
while (ns)
{
if (ns == gfc_current_ns)
{
if (prev_ns == NULL)
*nsp = NULL;
else
prev_ns->sibling = ns->sibling;
}
prev_ns = ns;
ns = ns->sibling;
}
gfc_free_namespace (gfc_current_ns);
gfc_current_ns = parent_ns;
}
return MATCH_ERROR; return MATCH_ERROR;
} }
......
...@@ -4291,6 +4291,7 @@ parse_module (void) ...@@ -4291,6 +4291,7 @@ parse_module (void)
{ {
gfc_statement st; gfc_statement st;
gfc_gsymbol *s; gfc_gsymbol *s;
bool error;
s = gfc_get_gsymbol (gfc_new_block->name); s = gfc_get_gsymbol (gfc_new_block->name);
if (s->defined || (s->type != GSYM_UNKNOWN && s->type != GSYM_MODULE)) if (s->defined || (s->type != GSYM_UNKNOWN && s->type != GSYM_MODULE))
...@@ -4304,6 +4305,7 @@ parse_module (void) ...@@ -4304,6 +4305,7 @@ parse_module (void)
st = parse_spec (ST_NONE); st = parse_spec (ST_NONE);
error = false;
loop: loop:
switch (st) switch (st)
{ {
...@@ -4322,11 +4324,14 @@ loop: ...@@ -4322,11 +4324,14 @@ loop:
gfc_error ("Unexpected %s statement in MODULE at %C", gfc_error ("Unexpected %s statement in MODULE at %C",
gfc_ascii_statement (st)); gfc_ascii_statement (st));
error = true;
reject_statement (); reject_statement ();
st = next_statement (); st = next_statement ();
goto loop; goto loop;
} }
/* Make sure not to free the namespace twice on error. */
if (!error)
s->ns = gfc_current_ns; s->ns = gfc_current_ns;
} }
......
2013-02-02 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/50627
PR fortran/56054
* gfortran.dg/block_12.f90: New test.
* gfortran.dg/module_error_1.f90: New test.
2013-02-02 Richard Sandiford <rdsandiford@googlemail.com> 2013-02-02 Richard Sandiford <rdsandiford@googlemail.com>
* lib/target-supports.exp (check_effective_target_vect_float) * lib/target-supports.exp (check_effective_target_vect_float)
......
! { dg-do compile }
! PR 50627 - this used to free a namespace twice.
program main
block
end program main ! { dg-error "END BLOCK" }
! { dg-prune-output "Unexpected end of file" }
! { dg-do compile }
! PR fortran/50627
module kernels
select type (args) ! { dg-error "Unexpected SELECT TYPE" }
end module kernels
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment