[Bug fortran/89492] [9 Regression] Endless compilation of an invalid TRANSFER after r269177
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
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
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
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
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
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
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
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