re PR fortran/41781 ([OOP] bogus undefined label error with SELECT TYPE.)
2009-10-22 Janus Weil <janus@gcc.gnu.org> PR fortran/41781 * resolve.c (resolve_codes): Don't clear 'cs_base' for BLOCK constructs, to make sure labels are treated correctly. * symbol.c (gfc_get_st_label): Create labels in the right namespace. For BLOCK constructs go into the parent namespace. 2009-10-22 Janus Weil <janus@gcc.gnu.org> PR fortran/41781 * gfortran.dg/goto_8.f90: New test case. From-SVN: r153446
This commit is contained in:
parent
7e1e7d4cc6
commit
76d02e9fa7
@ -1,3 +1,11 @@
|
||||
2009-10-22 Janus Weil <janus@gcc.gnu.org>
|
||||
|
||||
PR fortran/41781
|
||||
* resolve.c (resolve_codes): Don't clear 'cs_base' for BLOCK constructs,
|
||||
to make sure labels are treated correctly.
|
||||
* symbol.c (gfc_get_st_label): Create labels in the right namespace.
|
||||
For BLOCK constructs go into the parent namespace.
|
||||
|
||||
2009-10-21 Janus Weil <janus@gcc.gnu.org>
|
||||
|
||||
PR fortran/41706
|
||||
|
@ -12053,7 +12053,11 @@ resolve_codes (gfc_namespace *ns)
|
||||
resolve_codes (n);
|
||||
|
||||
gfc_current_ns = ns;
|
||||
|
||||
/* Don't clear 'cs_base' if this is the namespace of a BLOCK construct. */
|
||||
if (!(ns->proc_name && ns->proc_name->attr.flavor == FL_LABEL))
|
||||
cs_base = NULL;
|
||||
|
||||
/* Set to an out of range value. */
|
||||
current_entry_id = -1;
|
||||
|
||||
|
@ -2030,9 +2030,16 @@ gfc_st_label *
|
||||
gfc_get_st_label (int labelno)
|
||||
{
|
||||
gfc_st_label *lp;
|
||||
gfc_namespace *ns;
|
||||
|
||||
/* Find the namespace of the scoping unit:
|
||||
If we're in a BLOCK construct, jump to the parent namespace. */
|
||||
ns = gfc_current_ns;
|
||||
while (ns->proc_name && ns->proc_name->attr.flavor == FL_LABEL)
|
||||
ns = ns->parent;
|
||||
|
||||
/* First see if the label is already in this namespace. */
|
||||
lp = gfc_current_ns->st_labels;
|
||||
lp = ns->st_labels;
|
||||
while (lp)
|
||||
{
|
||||
if (lp->value == labelno)
|
||||
@ -2050,7 +2057,7 @@ gfc_get_st_label (int labelno)
|
||||
lp->defined = ST_LABEL_UNKNOWN;
|
||||
lp->referenced = ST_LABEL_UNKNOWN;
|
||||
|
||||
gfc_insert_bbt (&gfc_current_ns->st_labels, lp, compare_st_labels);
|
||||
gfc_insert_bbt (&ns->st_labels, lp, compare_st_labels);
|
||||
|
||||
return lp;
|
||||
}
|
||||
|
@ -1,3 +1,8 @@
|
||||
2009-10-22 Janus Weil <janus@gcc.gnu.org>
|
||||
|
||||
PR fortran/41781
|
||||
* gfortran.dg/goto_8.f90: New test case.
|
||||
|
||||
2009-10-21 Sebastian Pop <sebastian.pop@amd.com>
|
||||
|
||||
PR tree-optimization/41497
|
||||
|
31
gcc/testsuite/gfortran.dg/goto_8.f90
Normal file
31
gcc/testsuite/gfortran.dg/goto_8.f90
Normal file
@ -0,0 +1,31 @@
|
||||
! { dg-do compile }
|
||||
!
|
||||
! PR 41781: [OOP] bogus undefined label error with SELECT TYPE.
|
||||
!
|
||||
! Contributed by Salvatore Filippone <sfilippone@uniroma2.it>
|
||||
! and Tobias Burnus >burnus@gcc.gnu.org>
|
||||
|
||||
! 1st example: jumping out of SELECT TYPE (valid)
|
||||
type bar
|
||||
integer :: i
|
||||
end type bar
|
||||
class(bar), pointer :: var
|
||||
select type(var)
|
||||
class default
|
||||
goto 9999
|
||||
end select
|
||||
9999 continue
|
||||
|
||||
! 2nd example: jumping out of BLOCK (valid)
|
||||
block
|
||||
goto 88
|
||||
end block
|
||||
88 continue
|
||||
|
||||
! 3rd example: jumping into BLOCK (invalid)
|
||||
goto 99 ! { dg-error "is not in the same block" }
|
||||
block
|
||||
99 continue ! { dg-error "is not in the same block" }
|
||||
end block
|
||||
|
||||
end
|
Loading…
Reference in New Issue
Block a user