summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>2010-05-15 22:03:09 +0000
committerjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>2010-05-15 22:03:09 +0000
commitfabc1fc908262e3106beb0c472fa4da03b792680 (patch)
tree9cb27b789683b1330655a5c58c75ef45724a2ba9 /gcc
parent7c1a227e939a117df96b4a092d8e42c22de8f1ba (diff)
downloadgcc-fabc1fc908262e3106beb0c472fa4da03b792680.tar.gz
2010-05-15 Janus Weil <janus@gcc.gnu.org>
PR fortran/44154 PR fortran/42647 * trans-decl.c (gfc_trans_deferred_vars): Modify ordering of if branches. 2010-05-15 Janus Weil <janus@gcc.gnu.org> PR fortran/44154 PR fortran/42647 * gfortran.dg/allocatable_scalar_9.f90: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159445 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/trans-decl.c4
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/allocatable_scalar_9.f9051
4 files changed, 66 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index dd6d23fcd7d..2b2bc9bfb57 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,12 @@
2010-05-15 Janus Weil <janus@gcc.gnu.org>
+ PR fortran/44154
+ PR fortran/42647
+ * trans-decl.c (gfc_trans_deferred_vars): Modify ordering of
+ if branches.
+
+2010-05-15 Janus Weil <janus@gcc.gnu.org>
+
PR fortran/43207
PR fortran/43969
* gfortran.h (gfc_class_null_initializer): New prototype.
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 4f0256ae87b..56c88bc69f8 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -3259,8 +3259,6 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody)
if (sym_has_alloc_comp && !seen_trans_deferred_array)
fnbody = gfc_trans_deferred_array (sym, fnbody);
}
- else if (sym_has_alloc_comp)
- fnbody = gfc_trans_deferred_array (sym, fnbody);
else if (sym->attr.allocatable
|| (sym->ts.type == BT_CLASS
&& sym->ts.u.derived->components->attr.allocatable))
@@ -3298,6 +3296,8 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody)
fnbody = gfc_finish_block (&block);
}
}
+ else if (sym_has_alloc_comp)
+ fnbody = gfc_trans_deferred_array (sym, fnbody);
else if (sym->ts.type == BT_CHARACTER)
{
gfc_get_backend_locus (&loc);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b41cfacc2de..ded582b1968 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2010-05-15 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/44154
+ PR fortran/42647
+ * gfortran.dg/allocatable_scalar_9.f90: New.
+
2010-05-15 Jakub Jelinek <jakub@redhat.com>
PR c++/44148
diff --git a/gcc/testsuite/gfortran.dg/allocatable_scalar_9.f90 b/gcc/testsuite/gfortran.dg/allocatable_scalar_9.f90
new file mode 100644
index 00000000000..56e5a7089fa
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/allocatable_scalar_9.f90
@@ -0,0 +1,51 @@
+! { dg-do run }
+!
+! PR 42647: Missed initialization/dealloc of allocatable scalar DT with allocatable component
+!
+! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+
+module m
+type st
+ integer , allocatable :: a1
+end type st
+type at
+ integer , allocatable :: a2(:)
+end type at
+
+type t1
+ type(st), allocatable :: b1
+end type t1
+type t2
+ type(st), allocatable :: b2(:)
+end type t2
+type t3
+ type(at), allocatable :: b3
+end type t3
+type t4
+ type(at), allocatable :: b4(:)
+end type t4
+end module m
+
+use m
+type(t1) :: na1, a1, aa1(:)
+type(t2) :: na2, a2, aa2(:)
+type(t3) :: na3, a3, aa3(:)
+type(t4) :: na4, a4, aa4(:)
+allocatable :: a1, a2, a3, a4, aa1, aa2, aa3,aa4
+
+if(allocated(a1)) call abort()
+if(allocated(a2)) call abort()
+if(allocated(a3)) call abort()
+if(allocated(a4)) call abort()
+if(allocated(aa1)) call abort()
+if(allocated(aa2)) call abort()
+if(allocated(aa3)) call abort()
+if(allocated(aa4)) call abort()
+
+if(allocated(na1%b1)) call abort()
+if(allocated(na2%b2)) call abort()
+if(allocated(na3%b3)) call abort()
+if(allocated(na4%b4)) call abort()
+end
+
+! { dg-final { cleanup-modules "m" } }