diff options
author | Mikael Morin <mikael@gcc.gnu.org> | 2011-02-23 22:38:27 +0000 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2011-02-23 22:38:27 +0000 |
commit | 46b2c44027f8972329b6f602b57c9fdf1a8e4007 (patch) | |
tree | a4e7cb1e664ed6ae2b86798290fd00e26da7d19c /gcc/fortran/trans-array.c | |
parent | b14fad9dd817fb6f5bd33573a530e7e41131ee0c (diff) | |
download | gcc-46b2c44027f8972329b6f602b57c9fdf1a8e4007.zip gcc-46b2c44027f8972329b6f602b57c9fdf1a8e4007.tar.gz gcc-46b2c44027f8972329b6f602b57c9fdf1a8e4007.tar.bz2 |
re PR fortran/40850 (double free in nested types with allocatable components)
2011-02-23 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/40850
* trans.c (gfc_prepend_expr_to_block): New function.
* trans.h (gfc_prepend_expr_to_block): Declare.
* trans-array.c (gfc_conv_array_parameter): Replace
gfc_add_expr_to_block with gfc_prepend_expr_to_block.
2011-02-23 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/40850
* gfortran.dg/nested_allocatables_1.f90: New.
From-SVN: r170445
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 4e901f2..ac08c42 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -6097,10 +6097,11 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, gfc_ss * ss, bool g77, && expr->ts.u.derived->attr.alloc_comp && expr->expr_type != EXPR_VARIABLE) { - tmp = build_fold_indirect_ref_loc (input_location, - se->expr); + tmp = build_fold_indirect_ref_loc (input_location, se->expr); tmp = gfc_deallocate_alloc_comp (expr->ts.u.derived, tmp, expr->rank); - gfc_add_expr_to_block (&se->post, tmp); + + /* The components shall be deallocated before their containing entity. */ + gfc_prepend_expr_to_block (&se->post, tmp); } if (g77 || (fsym && fsym->attr.contiguous |