diff options
-rw-r--r-- | gcc/fortran/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fortran/simplify.c | 24 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr68227.f90 | 23 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/simplify_cshift_3.f90 | 7 |
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 |