From 763ccd45373c3c60afee048d86ca073aa0e2e860 Mon Sep 17 00:00:00 2001 From: Erik Edelmann <eedelman@gcc.gnu.org> Date: Sun, 2 Apr 2006 17:00:39 +0000 Subject: [PATCH] trans-array.c (gfc_trans_dealloc_allocated): Take a tree representation of the array to be deallocated as argument instead... 2006-04-02 Erik Edelmann <eedelman@gcc.gnu.org> * trans-array.c (gfc_trans_dealloc_allocated): Take a tree representation of the array to be deallocated as argument instead of its gfc_symbol. (gfc_trans_deferred_array): Update call to gfc_trans_dealloc_allocated. * trans-array.h (gfc_trans_dealloc_allocated): Update prototype. * trans-expr.c (gfc_conv_function_call): Update call to gfc_trans_dealloc_allocated, get indirect reference to dummy arguments. 2006-04-02 Erik Edelmann <eedelman@gcc.gnu.org> * gfortran.dg/allocatable_dummy_1.f90: Also check that allocatable dummy arguments work when the actual argument is itself a dummy argument of the caller. From-SVN: r112625 --- gcc/fortran/ChangeLog | 13 +++++++++++++ gcc/fortran/trans-array.c | 10 +++------- gcc/fortran/trans-array.h | 4 ++-- gcc/fortran/trans-expr.c | 5 ++++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gfortran.dg/allocatable_dummy_1.f90 | 2 +- 6 files changed, 29 insertions(+), 11 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index c7aa2a79a55a..3743cbdbd1b5 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,16 @@ +2006-04-02 Erik Edelmann <eedelman@gcc.gnu.org> + + * trans-array.c (gfc_trans_dealloc_allocated): Take a + tree representation of the array to be deallocated as argument + instead of its gfc_symbol. + (gfc_trans_deferred_array): Update call to + gfc_trans_dealloc_allocated. + * trans-array.h (gfc_trans_dealloc_allocated): Update + prototype. + * trans-expr.c (gfc_conv_function_call): Update call to + gfc_trans_dealloc_allocated, get indirect reference to dummy + arguments. + 2006-04-01 Roger Sayle <roger@eyesopen.com> PR fortran/25270 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 7136d1efbd6f..5ebec62772b3 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -4308,20 +4308,16 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, gfc_ss * ss, int g77) } -/* Generate code to deallocate the symbol 'sym', if it is allocated. */ +/* Generate code to deallocate an array, if it is allocated. */ tree -gfc_trans_dealloc_allocated (gfc_symbol * sym) +gfc_trans_dealloc_allocated (tree descriptor) { tree tmp; - tree descriptor; tree deallocate; stmtblock_t block; - gcc_assert (sym->attr.allocatable); - gfc_start_block (&block); - descriptor = sym->backend_decl; deallocate = gfc_array_deallocate (descriptor, null_pointer_node); tmp = gfc_conv_descriptor_data_get (descriptor); @@ -4396,7 +4392,7 @@ gfc_trans_deferred_array (gfc_symbol * sym, tree body) /* Allocatable arrays need to be freed when they go out of scope. */ if (sym->attr.allocatable) { - tmp = gfc_trans_dealloc_allocated (sym); + tmp = gfc_trans_dealloc_allocated (sym->backend_decl); gfc_add_expr_to_block (&fnblock, tmp); } diff --git a/gcc/fortran/trans-array.h b/gcc/fortran/trans-array.h index bc7cab54db32..6f57429ae3c7 100644 --- a/gcc/fortran/trans-array.h +++ b/gcc/fortran/trans-array.h @@ -41,8 +41,8 @@ tree gfc_trans_auto_array_allocation (tree, gfc_symbol *, tree); tree gfc_trans_dummy_array_bias (gfc_symbol *, tree, tree); /* Generate entry and exit code for g77 calling convention arrays. */ tree gfc_trans_g77_array (gfc_symbol *, tree); -/* Generate code to deallocate the symbol 'sym', if it is allocated. */ -tree gfc_trans_dealloc_allocated (gfc_symbol * sym); +/* Generate code to deallocate an array, if it is allocated. */ +tree gfc_trans_dealloc_allocated (tree); /* Add initialization for deferred arrays. */ tree gfc_trans_deferred_array (gfc_symbol *, tree); /* Generate an initializer for a static pointer or allocatable array. */ diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 783583caac87..94921bc1138e 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1920,7 +1920,10 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym, if (formal && formal->sym->attr.allocatable && formal->sym->attr.intent == INTENT_OUT) { - tmp = gfc_trans_dealloc_allocated (arg->expr->symtree->n.sym); + tmp = arg->expr->symtree->n.sym->backend_decl; + if (arg->expr->symtree->n.sym->attr.dummy) + tmp = build_fold_indirect_ref (tmp); + tmp = gfc_trans_dealloc_allocated (tmp); gfc_add_expr_to_block (&se->pre, tmp); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a10cb4edfc4f..66badc350ce9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-04-02 Erik Edelmann <eedelman@gcc.gnu.org> + + * gfortran.dg/allocatable_dummy_1.f90: Also check that allocatable + dummy arguments work when the actual argument is itself a dummy + argument of the caller. + 2006-04-01 Eric Botcazou <ebotcazou@libertysurf.fr> PR libfortran/24685 diff --git a/gcc/testsuite/gfortran.dg/allocatable_dummy_1.f90 b/gcc/testsuite/gfortran.dg/allocatable_dummy_1.f90 index bfa9ced010f1..9aba8b8fc6dc 100644 --- a/gcc/testsuite/gfortran.dg/allocatable_dummy_1.f90 +++ b/gcc/testsuite/gfortran.dg/allocatable_dummy_1.f90 @@ -33,7 +33,7 @@ contains integer, allocatable, intent(in) :: x(:) integer, allocatable, intent(out) :: y(:) if (allocated(y)) call abort() - allocate (y(3)) + call init(y) y = x end subroutine useit -- GitLab