2015-11-24 Steven G. Kargl <kargl@gcc.gnu.org>
authorkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 Nov 2015 18:58:28 +0000 (18:58 +0000)
committerkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 Nov 2015 18:58:28 +0000 (18:58 +0000)
PR fortran/68486
* simplify.c (gfc_simplify_cshift): Allow all EXPR_*.

2015-11-24  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/68486
* gfortran.dg/simplify_cshift_3.f90

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230832 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/simplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr68227.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/simplify_cshift_3.f90 [new file with mode: 0644]

index 0c81201..adc39bb 100644 (file)
@@ -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
index b9c4039..c699aed 100644 (file)
@@ -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)
index 65a14e1..5c229ce 100644 (file)
@@ -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 (file)
index 0000000..204b123
--- /dev/null
@@ -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 (file)
index 0000000..26f54c5
--- /dev/null
@@ -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