diff options
| -rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
| -rw-r--r-- | gcc/fortran/resolve.c | 7 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/gfortran.dg/submodule_17.f08 | 27 |
4 files changed, 45 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 6dc44e6..93eb48a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-08-24 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/77358 + * resolve.c (resolve_fl_procedure): Use the correct gfc_charlen + for deferred character length module procedures. + 2016-08-23 Fritz Reese <fritzoreese@gmail.com> * decl.c (gfc_match_structure_decl): Make gfc_structure_id static. diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index b7036a8..0a92efe 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -11884,6 +11884,13 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag) 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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2393eb5..527f201 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-08-24 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/77358 + * gfortran.dg/submodule_17.f08: New test. + 2016-08-24 Michael Collison <michael.collison@linaro.org> Michael Collison <michael.collison@arm.com> diff --git a/gcc/testsuite/gfortran.dg/submodule_17.f08 b/gcc/testsuite/gfortran.dg/submodule_17.f08 new file mode 100644 index 0000000..8effef4 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/submodule_17.f08 @@ -0,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 <damian@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 |
