re PR fortran/44154 (initialization problem with allocatable scalars)
authorJanus Weil <janus@gcc.gnu.org>
Sat, 15 May 2010 22:03:09 +0000 (00:03 +0200)
committerJanus Weil <janus@gcc.gnu.org>
Sat, 15 May 2010 22:03:09 +0000 (00:03 +0200)
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.

From-SVN: r159445

gcc/fortran/ChangeLog
gcc/fortran/trans-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/allocatable_scalar_9.f90 [new file with mode: 0644]

index dd6d23fcd7db5cdb6475cf11b9596d31243625b0..2b2bc9bfb576dcb243682f930117ca45f293c670 100644 (file)
@@ -1,3 +1,10 @@
+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
index 4f0256ae87be9be748876c4caa8da9111def2be0..56c88bc69f88aaa9b312fe41a203b20b21c7f94f 100644 (file)
@@ -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);
index b41cfacc2de61dd82c65c9f114dc25bb4e463c83..ded582b196863e7afbfe872a0a00292c618bad68 100644 (file)
@@ -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 (file)
index 0000000..56e5a70
--- /dev/null
@@ -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" } }