aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2015-05-16 12:33:01 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2015-05-16 12:33:01 +0000
commit1aae3f05473e1e6bbfb80a9adfbc8cff4a61e310 (patch)
tree03c12b7dcd2d7bed40f9e13094e8f4ed26459a10
parent2a2703a2bd0046ed60a2054df1f4f3ba5c793062 (diff)
downloadgcc-1aae3f05473e1e6bbfb80a9adfbc8cff4a61e310.zip
gcc-1aae3f05473e1e6bbfb80a9adfbc8cff4a61e310.tar.gz
gcc-1aae3f05473e1e6bbfb80a9adfbc8cff4a61e310.tar.bz2
re PR fortran/66113 (Variable n cannot appear in the expression with nested blocks)
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. From-SVN: r223238
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/expr.c16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/block_14.f9021
4 files changed, 46 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 7cff476..002a147 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+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 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR fortran/44054
@@ -28,7 +34,7 @@
(gfc_diagnostics_init): Initialize caret_chars array.
(gfc_diagnostics_finish): Reset caret_chars array to default.
-2015-05-16 Mikael Morin <mikael@gcc.gnu.org
+2015-05-16 Mikael Morin <mikael@gcc.gnu.org>
Paul Thomas <pault@gcc.gnu.org>
PR fortran/65792
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index c34be90..aa79243 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -2841,6 +2841,18 @@ check_references (gfc_ref* ref, bool (*checker) (gfc_expr*))
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
@@ -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)))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7260828..b3aa87c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-05-16 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/66113
+ * gfortran.dg/block_14.f90: New test.
+
2015-05-16 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR fortran/44054
diff --git a/gcc/testsuite/gfortran.dg/block_14.f90 b/gcc/testsuite/gfortran.dg/block_14.f90
new file mode 100644
index 0000000..50e6568
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/block_14.f90
@@ -0,0 +1,21 @@
+! { 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