]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR fortran/77420 (gfortran and equivalence produces internal compiler...
authorSteven G. Kargl <kargl@gcc.gnu.org>
Thu, 29 Sep 2016 22:09:42 +0000 (22:09 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Thu, 29 Sep 2016 22:09:42 +0000 (22:09 +0000)
2016-09-29  Steven G. Kargl  <kargl@gcc.gnu.org>

Backport from trunk

PR fortran/77420
* trans-common.c:  Handle array elements in equivalence when
the lower and upper bounds of array spec are NULL.

PR fortran/77460
* simplify.c (simplify_transformation_to_scalar):  On error, result
may be NULL, simply return.

2016-09-29  Steven G. Kargl  <kargl@gcc.gnu.org>

Backport from trunk

PR fortran/77420
* gfortran.dg/pr77420_1.f90: New test.
* gfortran.dg/pr77420_2.f90: Ditto.
* gfortran.dg/pr77420_3.f90: New test. Requires ...
* gfortran.dg/pr77420_4.f90: this file.

PR fortran/77460
* gfortran.dg/pr77460.f90: New test.

From-SVN: r240640

gcc/fortran/ChangeLog
gcc/fortran/simplify.c
gcc/fortran/trans-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr77420_1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr77420_2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr77420_3.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr77420_4.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr77460.f90 [new file with mode: 0644]

index 4fa70563718b8610402bc2ca56cbf5c7580e7c01..4895cfc2d26938e3e68e5b61d30649493fcf3452 100644 (file)
@@ -1,3 +1,15 @@
+2016-09-29  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       Backport from trunk
+
+       PR fortran/77420
+       * trans-common.c:  Handle array elements in equivalence when
+       the lower and upper bounds of array spec are NULL.
+
+       PR fortran/77460
+       * simplify.c (simplify_transformation_to_scalar):  On error, result
+       may be NULL, simply return.
+
 2016-09-29  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        Backport from trunk
index 4fe528f0e27c4b565cab53b8a3ad562b7079e621..62c12664a79dcd3b49b7c3ed4ded945b7521c3b5 100644 (file)
@@ -490,6 +490,8 @@ simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *
        }
 
       result = op (result, gfc_copy_expr (a));
+      if (!result)
+       return result;
     }
 
   return result;
index 8064d89187097675c3b24ff2e61c2d710517a873..509f18bf6390d7b73c23bead62714bdea4ea1d5d 100644 (file)
@@ -810,13 +810,21 @@ element_number (gfc_array_ref *ar)
       if (ar->dimen_type[i] != DIMEN_ELEMENT)
         gfc_internal_error ("element_number(): Bad dimension type");
 
-      mpz_sub (n, *get_mpz (ar->start[i]), *get_mpz (as->lower[i]));
+      if (as && as->lower[i])
+       mpz_sub (n, *get_mpz (ar->start[i]), *get_mpz (as->lower[i]));
+      else
+       mpz_sub_ui (n, *get_mpz (ar->start[i]), 1);
  
       mpz_mul (n, n, multiplier);
       mpz_add (offset, offset, n);
  
-      mpz_sub (extent, *get_mpz (as->upper[i]), *get_mpz (as->lower[i]));
-      mpz_add_ui (extent, extent, 1);
+      if (as && as->upper[i] && as->lower[i])
+       {
+         mpz_sub (extent, *get_mpz (as->upper[i]), *get_mpz (as->lower[i]));
+         mpz_add_ui (extent, extent, 1);
+       }
+      else
+       mpz_set_ui (extent, 0);
  
       if (mpz_sgn (extent) < 0)
         mpz_set_ui (extent, 0);
index d8599ae2c942479b4ed4e89e3a21a6eb263b2740..ee9d5f5869d351f553f6696b65af23723b0b81d2 100644 (file)
@@ -1,3 +1,16 @@
+2016-09-29  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       Backport from trunk
+
+       PR fortran/77420
+       * gfortran.dg/pr77420_1.f90: New test.
+       * gfortran.dg/pr77420_2.f90: Ditto.
+       * gfortran.dg/pr77420_3.f90: New test. Requires ...
+       * gfortran.dg/pr77420_4.f90: this file.
+
+       PR fortran/77460
+       * gfortran.dg/pr77460.f90: New test.
+
 2016-09-29  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        Backport from trunk
diff --git a/gcc/testsuite/gfortran.dg/pr77420_1.f90 b/gcc/testsuite/gfortran.dg/pr77420_1.f90
new file mode 100644 (file)
index 0000000..7652d69
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do compile }
+module test_equivalence
+  real, private :: array1(100)
+  real, private :: array2(100)
+  equivalence(array1(3),array2(3))
+end module test_equivalence
+
+module mymodule
+  use test_equivalence
+  real, dimension(:), allocatable :: array1
+end module mymodule
+
+program test
+  use mymodule
+end program test
diff --git a/gcc/testsuite/gfortran.dg/pr77420_2.f90 b/gcc/testsuite/gfortran.dg/pr77420_2.f90
new file mode 100644 (file)
index 0000000..4826801
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do compile }
+module test_equivalence
+  real, private :: array1(100)
+  real, private :: array2(100)
+  equivalence(array1,array2)
+end module test_equivalence
+
+module mymodule
+  use test_equivalence
+  real, dimension(:), allocatable :: array1
+end module mymodule
+
+program test
+  use mymodule
+end program test
diff --git a/gcc/testsuite/gfortran.dg/pr77420_3.f90 b/gcc/testsuite/gfortran.dg/pr77420_3.f90
new file mode 100644 (file)
index 0000000..cf95ac0
--- /dev/null
@@ -0,0 +1,9 @@
+! { dg-do link }
+! { dg-additional-sources pr77420_4.f90 }
+!
+module h5global
+  implicit none
+  integer :: h5p_default_f, h5p_flags
+  equivalence(h5p_flags, h5p_default_f)
+end module h5global
+! { dg-final { cleanup-modules "h5global" } }
diff --git a/gcc/testsuite/gfortran.dg/pr77420_4.f90 b/gcc/testsuite/gfortran.dg/pr77420_4.f90
new file mode 100644 (file)
index 0000000..8a60878
--- /dev/null
@@ -0,0 +1,10 @@
+! { dg-do compile { target { ! *-*-* } } }
+!
+program bug
+  use H5GLOBAL
+  implicit none
+  integer :: i
+  i=H5P_DEFAULT_F
+end program bug
+
+
diff --git a/gcc/testsuite/gfortran.dg/pr77460.f90 b/gcc/testsuite/gfortran.dg/pr77460.f90
new file mode 100644 (file)
index 0000000..5e28a99
--- /dev/null
@@ -0,0 +1,7 @@
+! { dg-do compile }
+  double precision, parameter :: x = huge(1d0)
+  print*, sum((/x,-x/))
+  print*, sum((/x,x,-x,-x/))  ! { dg-error "overflow" }
+  print*, sum((/x,-x,1d0/))
+  print*, sum((/1d0,x,-x/))
+end