Dear All,

The attached fixes this problem, bootstraps and regtests on FC21/x86_64.

OK for 6-branch and trunk?

Paul

2016-08-24  Paul Thomas  <pa...@gcc.gnu.org>

    PR fortran/77358

    * resolve.c (resolve_fl_procedure): Use the correct gfc_charlen
    for deferred character length module procedures.

2016-08-24  Paul Thomas  <pa...@gcc.gnu.org>

    PR fortran/77358
    * gfortran.dg/submodule_17.f08: New test.
Index: gcc/fortran/resolve.c
===================================================================
*** gcc/fortran/resolve.c       (revision 238840)
--- gcc/fortran/resolve.c       (working copy)
*************** resolve_fl_procedure (gfc_symbol *sym, i
*** 11961,11966 ****
--- 11961,11973 ----
        iface = sym->ts.interface;
        sym->ts.interface = NULL;
  
+       /* Make sure that the result uses the correct charlen for deferred
+        length results.  */
+       if (iface && sym->result
+         && iface->ts.type == BT_CHARACTER
+         && iface->ts.deferred)
+       sym->result->ts.u.cl = iface->ts.u.cl;
+ 
        if (iface == NULL)
        goto check_formal;
  
Index: gcc/testsuite/gfortran.dg/submodule_17.f08
===================================================================
*** gcc/testsuite/gfortran.dg/submodule_17.f08  (revision 0)
--- gcc/testsuite/gfortran.dg/submodule_17.f08  (working copy)
***************
*** 0 ****
--- 1,27 ----
+ ! { dg-do run }
+ !
+ ! Tests the fix for PR77358, in which the wrong gfc_charlen was
+ ! being used for the result of 'get'.
+ !
+ ! Contributed by Damian Rouson  <dam...@sourceryinstitute.org>
+ !
+ module hello_interface
+   character(len=13) :: string="Hello, world!"
+   interface
+     module function get() result(result_string)
+       character(:), allocatable :: result_string
+     end function
+   end interface
+ end module
+ 
+ submodule(hello_interface) hello_implementation
+ contains
+   module function get() result(result_string)
+     character(:), allocatable :: result_string
+     result_string = string
+   end function
+ end submodule
+ 
+   use hello_interface
+   if (get() .ne. string) call abort
+ end

Reply via email to