re PR fortran/89492 (Endless compilation of an invalid TRANSFER after r269177)
authorHarald Anlauf <anlauf@gmx.de>
Tue, 26 Feb 2019 20:03:08 +0000 (20:03 +0000)
committerHarald Anlauf <anlauf@gcc.gnu.org>
Tue, 26 Feb 2019 20:03:08 +0000 (20:03 +0000)
2019-02-26  Harald Anlauf  <anlauf@gmx.de>

PR fortran/89492
* check.c (gfc_calculate_transfer_sizes): Handle cases where
storage size of elements of MOLD is 0.

PR fortran/89492
* gfortran.dg/pr89492.f90: New test.

From-SVN: r269227

gcc/fortran/ChangeLog
gcc/fortran/check.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr89492.f90 [new file with mode: 0644]

index 2646608faae45b9c9034b53d875ec699489432c0..85ce5bce5604b6784e8344310e6c27538f61c5f5 100644 (file)
@@ -1,3 +1,9 @@
+2019-02-26  Harald Anlauf  <anlauf@gmx.de>
+
+       PR fortran/89492
+       * check.c (gfc_calculate_transfer_sizes): Handle cases where
+       storage size of elements of MOLD is 0.
+
 2019-02-26  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/89496
index 0367c92ed4b9d187017e23281c141f1797699d3e..c5f6ae300a7061ca45c32ede99645a7491076e3f 100644 (file)
@@ -5487,6 +5487,26 @@ gfc_calculate_transfer_sizes (gfc_expr *source, gfc_expr *mold, gfc_expr *size,
   if (!gfc_element_size (mold, &result_elt_size))
     return false;
 
+  if (result_elt_size == 0 && *source_size > 0)
+    {
+      gfc_error ("%<MOLD%> argument of %<TRANSFER%> intrinsic at %L "
+                 "shall not have storage size 0 when %<SOURCE%> "
+                "argument has size greater than 0", &mold->where);
+      return false;
+    }
+
+  /* If MOLD is a scalar and SIZE is absent, the result is a scalar.
+   * If MOLD is an array and SIZE is absent, the result is an array and of
+   * rank one. Its size is as small as possible such that its physical
+   * representation is not shorter than that of SOURCE.
+   */
+  if (result_elt_size == 0 && *source_size == 0 && !size)
+    {
+      *result_size = 0;
+      *result_length_p = 0;
+      return true;
+    }
+
   if ((result_elt_size > 0 && (mold->expr_type == EXPR_ARRAY || mold->rank))
       || size)
     {
index 2f700d73bba5df2a07123971dcd8fe35c7447974..c041ed6c090257c1e8fe7ded5e93738f30fdad9e 100644 (file)
@@ -1,3 +1,8 @@
+2019-02-26  Harald Anlauf  <anlauf@gmx.de>
+
+       PR fortran/89492
+       * gfortran.dg/pr89492.f90: New test.
+
 2019-02-26  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/89496
diff --git a/gcc/testsuite/gfortran.dg/pr89492.f90 b/gcc/testsuite/gfortran.dg/pr89492.f90
new file mode 100644 (file)
index 0000000..1a21f4a
--- /dev/null
@@ -0,0 +1,27 @@
+! { dg-do compile }
+!
+! PR fortran/89492 - Endless compilation of an invalid TRANSFER after r269177
+! Test error recovery for invalid uses of TRANSFER
+! Test proper simplification for MOLD with size 0
+!
+! Derived from original testcase by Dominique d'Humieres
+
+program bug4a
+  implicit none
+  type bug4
+! Intentionally left empty
+  end type bug4
+  integer, parameter :: k = size(transfer('',['']))  ! k = 0
+  integer, parameter :: i = len (transfer('',['']))  ! i = 0
+  integer, parameter :: l = len (transfer('', '' ))  ! l = 0
+  integer, parameter :: m(k) = k
+  integer, parameter :: j(i) = i
+  integer, parameter :: n(l) = l
+  print *, k,i,l,m,j,n
+  print *,      transfer(1,[''])                ! { dg-error "shall not have storage size 0" }
+  print *,      transfer(1, '' )                ! { dg-error "shall not have storage size 0" }
+  print *, size(transfer(1,['']))               ! { dg-error "shall not have storage size 0" }
+  print *, len (transfer(1, '' ))               ! { dg-error "shall not have storage size 0" }
+  print *, size(transfer([1],[bug4()]))         ! { dg-error "shall not have storage size 0" }
+  print *, transfer(transfer([1],[bug4()]),[1]) ! { dg-error "shall not have storage size 0" }
+end program bug4a