[Bug fortran/89492] [9 Regression] Endless compilation of an invalid TRANSFER after r269177

2019-03-03 Thread anlauf at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89492

anlauf at gcc dot gnu.org changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution|--- |FIXED

--- Comment #7 from anlauf at gcc dot gnu.org ---
Fixed on 9-trunk and 8-branch.

[Bug fortran/89492] [9 Regression] Endless compilation of an invalid TRANSFER after r269177

2019-03-02 Thread anlauf at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89492

--- Comment #6 from anlauf at gcc dot gnu.org ---
Author: anlauf
Date: Sat Mar  2 16:08:03 2019
New Revision: 269342

URL: https://gcc.gnu.org/viewcvs?rev=269342&root=gcc&view=rev
Log:
2019-03-02  Harald Anlauf  

Backport from trunk
PR fortran/89516
* check.c (gfc_calculate_transfer_sizes): Correct checks for cases
where storage size of elements of MOLD is 0.

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

PR fortran/89266
PR fortran/88326
* target-memory.c (gfc_element_size): Return false if element size
cannot be determined; element size is returned separately.
(gfc_target_expr_size): Return false if expression size cannot be
determined; expression size is returned separately.
* target-memory.h: Adjust prototypes.
* check.c (gfc_calculate_transfer_sizes): Adjust references to
gfc_target_expr_size, gfc_element_size.
* arith.c (hollerith2representation): Likewise.
* class.c (find_intrinsic_vtab): Likewise.
* simplify.c (gfc_simplify_sizeof): Likewise.

Backport from trunk
PR fortran/89516
* gfortran.dg/pr89492.f90: Adjust testcase.
* gfortran.dg/transfer_check_5.f90: New test.

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

PR fortran/89266
PR fortran/88326
* gfortran.dg/pr89266.f90: New test.
* gfortran.dg/pr88326.f90: New test.


Added:
branches/gcc-8-branch/gcc/testsuite/gfortran.dg/pr88326.f90
branches/gcc-8-branch/gcc/testsuite/gfortran.dg/pr89266.f90
branches/gcc-8-branch/gcc/testsuite/gfortran.dg/pr89492.f90
branches/gcc-8-branch/gcc/testsuite/gfortran.dg/transfer_check_5.f90
Modified:
branches/gcc-8-branch/gcc/fortran/ChangeLog
branches/gcc-8-branch/gcc/fortran/arith.c
branches/gcc-8-branch/gcc/fortran/check.c
branches/gcc-8-branch/gcc/fortran/class.c
branches/gcc-8-branch/gcc/fortran/simplify.c
branches/gcc-8-branch/gcc/fortran/target-memory.c
branches/gcc-8-branch/gcc/fortran/target-memory.h
branches/gcc-8-branch/gcc/testsuite/ChangeLog

[Bug fortran/89492] [9 Regression] Endless compilation of an invalid TRANSFER after r269177

2019-02-26 Thread anlauf at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89492

--- Comment #5 from anlauf at gcc dot gnu.org ---
Author: anlauf
Date: Tue Feb 26 20:03:08 2019
New Revision: 269227

URL: https://gcc.gnu.org/viewcvs?rev=269227&root=gcc&view=rev
Log:
2019-02-26  Harald Anlauf  

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.


Added:
trunk/gcc/testsuite/gfortran.dg/pr89492.f90
Modified:
trunk/gcc/fortran/ChangeLog
trunk/gcc/fortran/check.c
trunk/gcc/testsuite/ChangeLog

[Bug fortran/89492] [9 Regression] Endless compilation of an invalid TRANSFER after r269177

2019-02-25 Thread anlauf at gmx dot de
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89492

--- Comment #4 from Harald Anlauf  ---
Patch with slightly extended testcase posted here:

https://gcc.gnu.org/ml/fortran/2019-02/msg00218.html

[Bug fortran/89492] [9 Regression] Endless compilation of an invalid TRANSFER after r269177

2019-02-25 Thread anlauf at gmx dot de
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89492

--- Comment #3 from Harald Anlauf  ---
I found another issue for uses of transfer('',['']), so here's an updated
version with a clearer error message:

Index: gcc/fortran/check.c
===
--- gcc/fortran/check.c (revision 269177)
+++ gcc/fortran/check.c (working copy)
@@ -5487,6 +5487,26 @@
   if (!gfc_element_size (mold, &result_elt_size))
 return false;

+  if (result_elt_size == 0 && *source_size > 0)
+{
+  gfc_error ("% argument of % intrinsic at %L "
+ "shall not have storage size 0 when % "
+"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)
 {

Suggested testcase:

! { 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 :: m(k) = k
  print *,  transfer(1,[''])! { dg-error "shall not have
storage size 0" }
  print *, size(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

[Bug fortran/89492] [9 Regression] Endless compilation of an invalid TRANSFER after r269177

2019-02-25 Thread dominiq at lps dot ens.fr
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89492

--- Comment #2 from Dominique d'Humieres  ---
> Can you please verify that your testcases work?

With the patch I get

pr34202_red.f90:8:54:

8 |write(*,*) transfer(transfer([1],[bug4()]),[1],size[1])
  |  1
Error: Function 'size' requires an argument list at (1)
pr34202_red.f90:7:30:

7 |write(*,*) size(transfer(1,['']))
  |  1
Error: 'MOLD' argument of 'TRANSFER' intrinsic at (1) has storage size 0

Full test in progress. Thanks for the quick answer.

[Bug fortran/89492] [9 Regression] Endless compilation of an invalid TRANSFER after r269177

2019-02-25 Thread anlauf at gmx dot de
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89492

Harald Anlauf  changed:

   What|Removed |Added

 CC||anlauf at gmx dot de

--- Comment #1 from Harald Anlauf  ---
Potential patch:

Index: gcc/fortran/check.c
===
--- gcc/fortran/check.c (revision 269177)
+++ gcc/fortran/check.c (working copy)
@@ -5487,6 +5487,13 @@
   if (!gfc_element_size (mold, &result_elt_size))
 return false;

+  if (result_elt_size == 0 && *source_size > 0)
+{
+  gfc_error ("% argument of % intrinsic at %L "
+ "has storage size 0", &mold->where);
+  return false;
+}
+
   if ((result_elt_size > 0 && (mold->expr_type == EXPR_ARRAY || mold->rank))
   || size)
 {

Can you please verify that your testcases work?

[Bug fortran/89492] [9 Regression] Endless compilation of an invalid TRANSFER after r269177

2019-02-25 Thread dominiq at lps dot ens.fr
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89492

Dominique d'Humieres  changed:

   What|Removed |Added

   Priority|P3  |P4
 Status|UNCONFIRMED |NEW
  Known to work||7.4.0, 8.3.0
   Keywords||compile-time-hog,
   ||error-recovery
   Last reconfirmed||2019-02-25
 Blocks||31237
 Ever confirmed|0   |1
   Target Milestone|--- |9.0
  Known to fail||9.0


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=31237
[Bug 31237] [meta-bug] TRANSFER intrinsic