diff options
author | Tobias Burnus <burnus@net-b.de> | 2010-01-07 09:09:51 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2010-01-07 09:09:51 +0100 |
commit | 64b33a7e1eb495404a6a74b8b69368580b1ee874 (patch) | |
tree | f1a8315beebebdf1fc7c30f8ca16dd1af9944b99 | |
parent | 2e8e6a99ee156e8cd15b5e4b9a0eeaa49e2a970b (diff) | |
download | gcc-64b33a7e1eb495404a6a74b8b69368580b1ee874.zip gcc-64b33a7e1eb495404a6a74b8b69368580b1ee874.tar.gz gcc-64b33a7e1eb495404a6a74b8b69368580b1ee874.tar.bz2 |
re PR fortran/41872 (wrong-code: Issues with allocatable scalars)
2010-01-07 Tobias Burnus <burnus@net-b.de>
PR fortran/41872
* trans-decl.c (gfc_trans_deferred_vars): Don't initialize
allocatable scalars with SAVE attribute.
2010-01-07 Tobias Burnus <burnus@net-b.de>
PR fortran/41872
* gfortran.dg/allocatable_scalar_7.f90: New test.
From-SVN: r155687
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 57 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/allocatable_scalar_7.f90 | 26 |
4 files changed, 70 insertions, 26 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 7de1ba7..43a3af2 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2010-01-07 Tobias Burnus <burnus@net-b.de> + + PR fortran/41872 + * trans-decl.c (gfc_trans_deferred_vars): Don't initialize + allocatable scalars with SAVE attribute. + 2010-01-05 Tobias Burnus <burnus@net-b.de> PR fortran/42517 diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index ce33b2a..cf9bef3 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -3188,31 +3188,38 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody) || (sym->ts.type == BT_CLASS && sym->ts.u.derived->components->attr.allocatable)) { - /* Nullify and automatic deallocation of allocatable scalars. */ - tree tmp; - gfc_expr *e; - gfc_se se; - stmtblock_t block; - - e = gfc_lval_expr_from_sym (sym); - if (sym->ts.type == BT_CLASS) - gfc_add_component_ref (e, "$data"); - - gfc_init_se (&se, NULL); - se.want_pointer = 1; - gfc_conv_expr (&se, e); - gfc_free_expr (e); - - /* Nullify when entering the scope. */ - gfc_start_block (&block); - gfc_add_modify (&block, se.expr, fold_convert (TREE_TYPE (se.expr), - null_pointer_node)); - gfc_add_expr_to_block (&block, fnbody); - - /* Deallocate when leaving the scope. Nullifying is not needed. */ - tmp = gfc_deallocate_with_status (se.expr, NULL_TREE, true, NULL); - gfc_add_expr_to_block (&block, tmp); - fnbody = gfc_finish_block (&block); + if (!sym->attr.save) + { + /* Nullify and automatic deallocation of allocatable + scalars. */ + tree tmp; + gfc_expr *e; + gfc_se se; + stmtblock_t block; + + e = gfc_lval_expr_from_sym (sym); + if (sym->ts.type == BT_CLASS) + gfc_add_component_ref (e, "$data"); + + gfc_init_se (&se, NULL); + se.want_pointer = 1; + gfc_conv_expr (&se, e); + gfc_free_expr (e); + + /* Nullify when entering the scope. */ + gfc_start_block (&block); + gfc_add_modify (&block, se.expr, + fold_convert (TREE_TYPE (se.expr), + null_pointer_node)); + gfc_add_expr_to_block (&block, fnbody); + + /* Deallocate when leaving the scope. Nullifying is not + needed. */ + tmp = gfc_deallocate_with_status (se.expr, NULL_TREE, true, + NULL); + gfc_add_expr_to_block (&block, tmp); + fnbody = gfc_finish_block (&block); + } } else if (sym->ts.type == BT_CHARACTER) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ef879de..6e0a903 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,9 +1,14 @@ +2010-01-07 Tobias Burnus <burnus@net-b.de> + + PR fortran/41872 + * gfortran.dg/allocatable_scalar_7.f90: New test. + 2010-01-06 Richard Guenther <rguenther@suse.de> * gcc.c-torture/compile/pr42632.c: New testcase. 2010-01-05 H.J. Lu <hongjiu.lu@intel.com> - + PR target/42542 * gcc.target/i386/pr42542-4.c: New. * gcc.target/i386/pr42542-4a.c: Likewise. diff --git a/gcc/testsuite/gfortran.dg/allocatable_scalar_7.f90 b/gcc/testsuite/gfortran.dg/allocatable_scalar_7.f90 new file mode 100644 index 0000000..001dd24 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/allocatable_scalar_7.f90 @@ -0,0 +1,26 @@ +! { dg-do run } +! +! PR fortran/41872 +! +! Allocatable scalars with SAVE +! +program test + implicit none + call sub (0) + call sub (1) + call sub (2) +contains + subroutine sub (no) + integer, intent(in) :: no + integer, allocatable, save :: a + if (no == 0) then + if (allocated (a)) call abort () + allocate (a) + else if (no == 1) then + if (.not. allocated (a)) call abort () + deallocate (a) + else + if (allocated (a)) call abort () + end if + end subroutine sub +end program test |