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/trans-expr.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/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 82fe424..add0d69 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -8826,7 +8826,9 @@ gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts, gfc_trans_string_copy (&block, llen, lse->expr, ts.kind, rlen, rse->expr, ts.kind); } - else if (gfc_bt_struct (ts.type) && ts.u.derived->attr.alloc_comp) + else if (gfc_bt_struct (ts.type) + && (ts.u.derived->attr.alloc_comp + || (deep_copy && ts.u.derived->attr.pdt_type))) { tree tmp_var = NULL_TREE; cond = NULL_TREE; |