aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/simplify.c24
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr68227.f9023
-rw-r--r--gcc/testsuite/gfortran.dg/simplify_cshift_3.f907
5 files changed, 47 insertions, 17 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 0c81201..adc39bb 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,8 @@
+2015-11-24 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/68486
+ * simplify.c (gfc_simplify_cshift): Allow all EXPR_*.
+
2015-11-22 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/68486
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index b9c4039..c699aed 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -1805,23 +1805,13 @@ gfc_simplify_cshift (gfc_expr *array, gfc_expr *shift, gfc_expr *dim)
else
dm = 1;
- /* Copy array into 'a', simplify it, and then test for a constant array.
- An unexpected expr_type causes an ICE. */
- switch (array->expr_type)
- {
- case EXPR_VARIABLE:
- case EXPR_ARRAY:
- case EXPR_OP:
- a = gfc_copy_expr (array);
- gfc_simplify_expr (a, 0);
- if (!is_constant_array_expr (a))
- {
- gfc_free_expr (a);
- return NULL;
- }
- break;
- default:
- gcc_unreachable ();
+ /* Copy array into 'a', simplify it, and then test for a constant array. */
+ a = gfc_copy_expr (array);
+ gfc_simplify_expr (a, 0);
+ if (!is_constant_array_expr (a))
+ {
+ gfc_free_expr (a);
+ return NULL;
}
if (a->rank == 1)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 65a14e1..5c229ce 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-11-24 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/68486
+ * gfortran.dg/simplify_cshift_3.f90
+
2015-11-24 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/68278
diff --git a/gcc/testsuite/gfortran.dg/pr68227.f90 b/gcc/testsuite/gfortran.dg/pr68227.f90
new file mode 100644
index 0000000..204b123
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr68227.f90
@@ -0,0 +1,23 @@
+! { dg-do compile }
+! PR fortran/68227
+! Original code contributed by Gerhard Steinmetz
+! <gerhard dot steinmetz dot fortran at t-online dot de >
+!
+program p
+
+ type t
+ end type
+
+ type t2
+ type(t), pointer :: a
+ end type
+
+ type(t), target :: x
+ type(t2), pointer :: y(:)
+ integer :: i
+ integer :: n = 2
+
+ allocate (y(n))
+ forall (i=1:n) y(i)%a = x
+
+end program p
diff --git a/gcc/testsuite/gfortran.dg/simplify_cshift_3.f90 b/gcc/testsuite/gfortran.dg/simplify_cshift_3.f90
new file mode 100644
index 0000000..26f54c5
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/simplify_cshift_3.f90
@@ -0,0 +1,7 @@
+! { dg-do compile }
+subroutine foo ()
+ real(4), allocatable, save :: tmp (:, :)
+ real(4), pointer, save :: arr (:, :, :)
+ integer :: l, m, n
+ tmp = (cshift(cshift(arr (:,:,l),m,2),n,1))
+end subroutine foo