{Patch, fortran] PR86372 - [8/9 Regression] Segfault on ASSOCIATE statement with CHARACTER variable
diff mbox series

Message ID CAGkQGiKLv387__8J7c+i+p--=rHSQHOLBJz-0-jwh_q7WLp+TA@mail.gmail.com
State New
Headers show
Series
  • {Patch, fortran] PR86372 - [8/9 Regression] Segfault on ASSOCIATE statement with CHARACTER variable
Related show

Commit Message

Paul Richard Thomas Oct. 8, 2018, 1:14 p.m. UTC
I have fixed this as 'obvious' on 8-branch(r264925) and trunk(r264915).

Paul

2018-10-08  Paul Thomas  <pault@gcc.gnu.org>

    Backport from trunk
    PR fortran/86372
    * trans-stmt.c (trans_associate_var): Character associate names
    with variable string length do not have to be deferred length
    for the string length to be set, if variable.

2018-10-08  Paul Thomas  <pault@gcc.gnu.org>

    Backport from trunk
    PR fortran/86372
    * gfortran.dg/associate_41.f90: New test.

Patch
diff mbox series

Index: gcc/fortran/trans-stmt.c
===================================================================
*** gcc/fortran/trans-stmt.c	(revision 264912)
--- gcc/fortran/trans-stmt.c	(working copy)
*************** trans_associate_var (gfc_symbol *sym, gf
*** 1885,1891 ****
  	}
  
        if (sym->ts.type == BT_CHARACTER
- 	  && sym->ts.deferred
  	  && !sym->attr.select_type_temporary
  	  && VAR_P (sym->ts.u.cl->backend_decl)
  	  && se.string_length != sym->ts.u.cl->backend_decl)
--- 1885,1890 ----
Index: gcc/testsuite/gfortran.dg/associate_41.f90
===================================================================
*** gcc/testsuite/gfortran.dg/associate_41.f90	(nonexistent)
--- gcc/testsuite/gfortran.dg/associate_41.f90	(working copy)
***************
*** 0 ****
--- 1,25 ----
+ ! { dg-do run }
+ !
+ ! Test the fix for PR86372 in which the associate name string length was
+ ! not being set, thereby causing a segfault.
+ !
+ ! Contributed by Janus Weil  <janus@gcc.gnu.org>
+ !
+ program xxx
+ 
+    character(len=50) :: s
+ 
+    s = repeat ('*', len(s))
+    call sub(s)
+    if (s .ne. '**'//'123'//repeat ('*', len(s) - 5)) stop 1
+ 
+ contains
+ 
+    subroutine sub(str)
+       character(len=*), intent(inout) :: str
+       associate (substr => str(3:5))
+          substr = '123'
+       end associate
+    end subroutine
+ 
+ end