diff options
author | Erik Edelmann <eedelman@gcc.gnu.org> | 2006-04-02 17:00:39 +0000 |
---|---|---|
committer | Erik Edelmann <eedelman@gcc.gnu.org> | 2006-04-02 17:00:39 +0000 |
commit | 763ccd45373c3c60afee048d86ca073aa0e2e860 (patch) | |
tree | 7090a0a4e5cba66a5413fbfc2c0390b70ed6c1fc /gcc | |
parent | ace23abf021c2785afc2d66280b47b11aecd56ee (diff) | |
download | gcc-763ccd45373c3c60afee048d86ca073aa0e2e860.zip gcc-763ccd45373c3c60afee048d86ca073aa0e2e860.tar.gz gcc-763ccd45373c3c60afee048d86ca073aa0e2e860.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/fortran/trans-array.c | 10 | ||||
-rw-r--r-- | gcc/fortran/trans-array.h | 4 | ||||
-rw-r--r-- | gcc/fortran/trans-expr.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | 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 c7aa2a7..3743cbd 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 7136d1e..5ebec62 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 bc7cab5..6f57429 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 783583c..94921bc 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 a10cb4ed..66badc3 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 bfa9ced..9aba8b8 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 |