diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2018-01-08 11:20:33 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2018-01-08 11:20:33 +0000 |
commit | 0b627b58443b42408247a6d810d84594a259c377 (patch) | |
tree | 0a0943697205f58503baa1da74a60f0afcde7e67 /gcc/fortran/decl.c | |
parent | efcc2e303fe5f0daff889c66dff59cfefe3859a1 (diff) | |
download | gcc-0b627b58443b42408247a6d810d84594a259c377.zip gcc-0b627b58443b42408247a6d810d84594a259c377.tar.gz gcc-0b627b58443b42408247a6d810d84594a259c377.tar.bz2 |
re PR fortran/83611 ([PDT] Assignment of parameterized types causes double free error in runtime)
2018-01-08 Paul Thomas <pault@gcc.gnu.org>
PR fortran/83611
* decl.c (gfc_get_pdt_instance): If parameterized arrays have
an initializer, convert the kind parameters and add to the
component if the instance.
* trans-array.c (structure_alloc_comps): Add 'is_pdt_type' and
use it with case COPY_ALLOC_COMP. Call 'duplicate_allocatable'
for parameterized arrays. Clean up typos in comments. Convert
parameterized array initializers and copy into the array.
* trans-expr.c (gfc_trans_scalar_assign): Do a deep copy for
parameterized types.
*trans-stmt.c (trans_associate_var): Deallocate associate vars
as necessary, when they are PDT function results for example.
PR fortran/83731
* trans-array.c (structure_alloc_comps): Only compare len parms
when they are declared explicitly.
2018-01-08 Paul Thomas <pault@gcc.gnu.org>
PR fortran/83611
* gfortran.dg/pdt_15.f03 : Bump count of 'n.data = 0B' to 8.
* gfortran.dg/pdt_26.f03 : Bump count of '_malloc' to 9.
* gfortran.dg/pdt_27.f03 : New test.
PR fortran/83731
* gfortran.dg/pdt_28.f03 : New test.
From-SVN: r256335
Diffstat (limited to 'gcc/fortran/decl.c')
-rw-r--r-- | gcc/fortran/decl.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index a944e4f..cb23534 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -3562,6 +3562,12 @@ gfc_get_pdt_instance (gfc_actual_arglist *param_list, gfc_symbol **sym, c2->as->upper[i] = e; } c2->attr.pdt_array = pdt_array ? 1 : c2->attr.pdt_string; + if (c1->initializer) + { + c2->initializer = gfc_copy_expr (c1->initializer); + gfc_insert_kind_parameter_exprs (c2->initializer); + gfc_simplify_expr (c2->initializer, 1); + } } /* Recurse into this function for PDT components. */ |