From: Paul Thomas Date: Mon, 17 Sep 2018 11:22:27 +0000 (+0000) Subject: re PR fortran/64120 ([F03] Wrong handling of allocatable character string) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d44235fbe06e52cf670fccc7419a580bfedabec9;p=gcc.git re PR fortran/64120 ([F03] Wrong handling of allocatable character string) 2018-09-17 Paul Thomas PR fortran/64120 * trans-decl.c (gfc_get_symbol_decl): Flag allocatable, scalar characters with a variable length expression for deferred init. (gfc_trans_deferred_vars): Perform the assignment for these symbols by calling gfc_conv_string_length. 2018-09-17 Paul Thomas PR fortran/64120 * gfortran.dg/allocatable_scalar_14.f90 : New test. From-SVN: r264365 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 22435d3f0e0..3980146aef7 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2018-09-17 Paul Thomas + + PR fortran/64120 + * trans-decl.c (gfc_get_symbol_decl): Flag allocatable, scalar + characters with a variable length expression for deferred init. + (gfc_trans_deferred_vars): Perform the assignment for these + symbols by calling gfc_conv_string_length. + 2018-09-17 Paul Thomas PR fortran/85954 diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index e54d09817cc..06066eb93dd 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -1745,6 +1745,13 @@ gfc_get_symbol_decl (gfc_symbol * sym) && !(sym->attr.use_assoc && !intrinsic_array_parameter))) gfc_defer_symbol_init (sym); + if (sym->ts.type == BT_CHARACTER + && sym->attr.allocatable + && !sym->attr.dimension + && sym->ts.u.cl && sym->ts.u.cl->length + && sym->ts.u.cl->length->expr_type == EXPR_VARIABLE) + gfc_defer_symbol_init (sym); + /* Associate names can use the hidden string length variable of their associated target. */ if (sym->ts.type == BT_CHARACTER @@ -4603,6 +4610,13 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block) gfc_set_backend_locus (&sym->declared_at); gfc_start_block (&init); + if (sym->ts.type == BT_CHARACTER + && sym->attr.allocatable + && !sym->attr.dimension + && sym->ts.u.cl && sym->ts.u.cl->length + && sym->ts.u.cl->length->expr_type == EXPR_VARIABLE) + gfc_conv_string_length (sym->ts.u.cl, NULL, &init); + if (!sym->attr.pointer) { /* Nullify and automatic deallocation of allocatable diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bcb851a22c5..bf186057dc7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-09-17 Paul Thomas + + PR fortran/64120 + * gfortran.dg/allocatable_scalar_14.f90 : New test. + 2018-09-17 Richard Biener PR tree-optimization/87301 diff --git a/gcc/testsuite/gfortran.dg/allocatable_scalar_14.f90 b/gcc/testsuite/gfortran.dg/allocatable_scalar_14.f90 new file mode 100644 index 00000000000..23f6bbfffa5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/allocatable_scalar_14.f90 @@ -0,0 +1,17 @@ +! { dg-do run } +! +! Test the fix for PR64120 in which the initialisation of the +! string length of 's' was not being done. +! +! Contributed by Francois-Xavier Coudert +! + call g(1) + call g(2) +contains + subroutine g(x) + integer :: x + character(len=x), allocatable :: s + allocate(s) + if (len(s) .ne. x) stop x + end subroutine +end