Hello world, this (rather obvious) patch fixes array declarations in deeply nested BLOCKs.
Regression-tested. OK for trunk? Thomas 2015-05-16 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/66113 * expr.c (is_parent_of_current_ns): New function. (check_restricted): Use it. 2015-05-16 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/66113 * gfortran.dg/block_14.f90: New test.
Index: expr.c =================================================================== --- expr.c (Revision 223202) +++ expr.c (Arbeitskopie) @@ -2841,7 +2841,19 @@ check_references (gfc_ref* ref, bool (*checker) (g return check_references (ref->next, checker); } +/* Return true if ns is a parent of the current ns. */ +static bool +is_parent_of_current_ns (gfc_namespace *ns) +{ + gfc_namespace *p; + for (p = gfc_current_ns->parent; p; p = p->parent) + if (ns == p) + return true; + + return false; +} + /* Verify that an expression is a restricted expression. Like its cousin check_init_expr(), an error message is generated if we return false. */ @@ -2929,9 +2941,7 @@ check_restricted (gfc_expr *e) || sym->attr.dummy || sym->attr.implied_index || sym->attr.flavor == FL_PARAMETER - || (sym->ns && sym->ns == gfc_current_ns->parent) - || (sym->ns && gfc_current_ns->parent - && sym->ns == gfc_current_ns->parent->parent) + || is_parent_of_current_ns (sym->ns) || (sym->ns->proc_name != NULL && sym->ns->proc_name->attr.flavor == FL_MODULE) || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
! { dg-do run } ! PR 66113 - this used to ICE with deeply nested BLOCKS. program main integer :: n real :: s n = 3 block block block block block real, dimension(n) :: a a = 3. s = sum(a) end block end block end block end block end block if (s /= 9) call abort end program main