[fortran] PR87239 - ICE in deferred-length string

Message ID CAGkQGiLP2xqqMhqvGcBuZLyCkMAEC3mGgU=_FGqbf_NDUg5dug@mail.gmail.com
State New
Headers show
Series
  • [fortran] PR87239 - ICE in deferred-length string
Related show

Commit Message

Paul Richard Thomas Sept. 18, 2018, 7:40 p.m.
This is sufficiently 'obvious'  that I have committed the patch to
trunk as revision 264409.

My inclination is to commit it to 8-branch as well since deferred
character bugs were one of the complaints in the fortran standards
survey. OK?

Paul

2018-09-18  Paul Thomas  <pault@gcc.gnu.org>

    PR fortran/87239
    * trans-expr.c (gfc_trans_assignment_1): The rse.pre for the
    assignment of deferred character elemental function results to
    a realocatable lhs must not be added to the exterior block but
    must go to the loop body.

2018-09-18  Paul Thomas  <pault@gcc.gnu.org>

    PR fortran/87239
    * gfortran.dg/elemental_function_2.f90 : New test.

Comments

Janne Blomqvist Sept. 19, 2018, 7:55 a.m. | #1
On Tue, Sep 18, 2018 at 10:41 PM Paul Richard Thomas <
paul.richard.thomas@gmail.com> wrote:

> This is sufficiently 'obvious'  that I have committed the patch to

> trunk as revision 264409.

>

> My inclination is to commit it to 8-branch as well since deferred

> character bugs were one of the complaints in the fortran standards

> survey. OK?

>


Ok, seems obvious enough.


-- 
Janne Blomqvist

Patch

Index: gcc/fortran/trans-expr.c
===================================================================
*** gcc/fortran/trans-expr.c	(revision 264406)
--- gcc/fortran/trans-expr.c	(working copy)
*************** gfc_trans_assignment_1 (gfc_expr * expr1
*** 10283,10290 ****
    if (flag_realloc_lhs
        && expr2->ts.type == BT_CHARACTER && expr1->ts.deferred
        && !(lss != gfc_ss_terminator
! 	   && ((expr2->expr_type == EXPR_OP
! 		&& expr2->value.op.op == INTRINSIC_CONCAT)
  	       || (expr2->expr_type == EXPR_FUNCTION
  		   && expr2->value.function.isym != NULL
  		   && expr2->value.function.isym->id == GFC_ISYM_CONVERSION))))
--- 10283,10293 ----
    if (flag_realloc_lhs
        && expr2->ts.type == BT_CHARACTER && expr1->ts.deferred
        && !(lss != gfc_ss_terminator
! 	   && ((expr2->expr_type == EXPR_FUNCTION
! 		&& expr2->value.function.esym != NULL
! 		   && expr2->value.function.esym->attr.elemental)
! 	       || (expr2->expr_type == EXPR_OP
! 		   && expr2->value.op.op == INTRINSIC_CONCAT)
  	       || (expr2->expr_type == EXPR_FUNCTION
  		   && expr2->value.function.isym != NULL
  		   && expr2->value.function.isym->id == GFC_ISYM_CONVERSION))))
Index: gcc/testsuite/gfortran.dg/elemental_function_2.f90
===================================================================
*** gcc/testsuite/gfortran.dg/elemental_function_2.f90	(nonexistent)
--- gcc/testsuite/gfortran.dg/elemental_function_2.f90	(working copy)
***************
*** 0 ****
--- 1,40 ----
+ ! { dg-do compile }
+ !
+ ! Test the fix for PR87239 in which the call to the elemental function
+ ! 'gettwo' was being added before the scalarization loop in the assignment.
+ ! Since the result temporary was being declared in the loop body, this
+ ! drove the gimplifier crazy. It is sufficient to compile this testcase
+ ! since it used to ICE.
+ !
+ ! Contributed by Juergen Reuter  <juergen.reuter@desy.de>
+ !
+ module test
+   implicit none
+ contains
+ 
+   elemental function gettwo( s ) result( res )
+     character(*), intent(in) :: s
+     character(len(s)) :: res
+ 
+     res = s( 1 : 2 )
+   endfunction gettwo
+ 
+ endmodule test
+ 
+ program main
+   use test
+   implicit none
+   character(10) :: inp( 5 )
+   integer :: i
+ 
+   ! character(10), allocatable :: out(:) ! this works
+   character(:), allocatable :: out(:) ! this was stuffed
+ 
+   inp = [ 'aaa', 'bbb', 'ccc', 'ddd', 'eee' ]
+ 
+   out = gettwo( inp )
+ 
+   do i = 1, size (out, 1)
+     if (trim (out(i)) .ne. inp(i)(1:2)) stop 1
+   end do
+ endprogram main