aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2010-01-07 09:09:51 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2010-01-07 09:09:51 +0100
commit64b33a7e1eb495404a6a74b8b69368580b1ee874 (patch)
treef1a8315beebebdf1fc7c30f8ca16dd1af9944b99
parent2e8e6a99ee156e8cd15b5e4b9a0eeaa49e2a970b (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/fortran/trans-decl.c57
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/allocatable_scalar_7.f9026
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