This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch, fortran] Fix PR 66113 error with deeply nested blocks
- From: Thomas Koenig <tkoenig at netcologne dot de>
- To: "fortran at gcc dot gnu dot org" <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Sat, 16 May 2015 12:35:56 +0200
- Subject: [patch, fortran] Fix PR 66113 error with deeply nested blocks
- Authentication-results: sourceware.org; auth=none
Hello world,
this (rather obvious) patch fixes array declarations in deeply nested
BLOCKs.
Regression-tested. OK for trunk?
Thomas
2015-05-16 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/66113
* expr.c (is_parent_of_current_ns): New function.
(check_restricted): Use it.
2015-05-16 Thomas Koenig <tkoenig@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