public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/42647]  New: Missed initialization/dealloc of allocatable scalar DT with allocatable component
@ 2010-01-07 16:04 burnus at gcc dot gnu dot org
  2010-01-09 17:35 ` [Bug fortran/42647] " burnus at gcc dot gnu dot org
                   ` (10 more replies)
  0 siblings, 11 replies; 13+ messages in thread
From: burnus at gcc dot gnu dot org @ 2010-01-07 16:04 UTC (permalink / raw)
  To: gcc-bugs

Follow up to PR 41872.

The following program shows at run time:
  Fortran runtime error: Attempting to allocate already allocated array 'a'


  type t
    ! Any scalar/array allocatable component will do for the wrong-code
    integer, allocatable :: d
  end type
  type(t), allocatable :: a
  allocate(a)
end

As:
  struct t * a;
  {
     if (a == NULL) { ...} else { _gfortran_runtime_error_at ... }

There is missing a:
  a = NULL;

 * * *

Another issue: Assume that "a" is not allocated. Then the following will crash:

  if (a->d != 0B)
    {
      __builtin_free ((void *) a->d);
    }
  a->d = 0B;

 * * *

Third issue: There is no automatic deallocation of "a", only of its component
"a%d".


-- 
           Summary: Missed initialization/dealloc of allocatable scalar DT
                    with allocatable component
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: burnus at gcc dot gnu dot org
OtherBugsDependingO 42361
             nThis:


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42647


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Bug fortran/42647] Missed initialization/dealloc of allocatable scalar DT with allocatable component
  2010-01-07 16:04 [Bug fortran/42647] New: Missed initialization/dealloc of allocatable scalar DT with allocatable component burnus at gcc dot gnu dot org
@ 2010-01-09 17:35 ` burnus at gcc dot gnu dot org
  2010-01-09 21:29 ` burnus at gcc dot gnu dot org
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: burnus at gcc dot gnu dot org @ 2010-01-09 17:35 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #1 from burnus at gcc dot gnu dot org  2010-01-09 17:34 -------
Created an attachment (id=19524)
 --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=19524&action=view)
Patch - fixes also use-assoc sllocatable scalars


-- 

burnus at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         AssignedTo|unassigned at gcc dot gnu   |burnus at gcc dot gnu dot
                   |dot org                     |org
             Status|UNCONFIRMED                 |ASSIGNED


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42647


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Bug fortran/42647] Missed initialization/dealloc of allocatable scalar DT with allocatable component
  2010-01-07 16:04 [Bug fortran/42647] New: Missed initialization/dealloc of allocatable scalar DT with allocatable component burnus at gcc dot gnu dot org
  2010-01-09 17:35 ` [Bug fortran/42647] " burnus at gcc dot gnu dot org
@ 2010-01-09 21:29 ` burnus at gcc dot gnu dot org
  2010-01-09 21:30 ` burnus at gcc dot gnu dot org
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: burnus at gcc dot gnu dot org @ 2010-01-09 21:29 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #2 from burnus at gcc dot gnu dot org  2010-01-09 21:29 -------
And of cause it still does not work:

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


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42647


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Bug fortran/42647] Missed initialization/dealloc of allocatable scalar DT with allocatable component
  2010-01-07 16:04 [Bug fortran/42647] New: Missed initialization/dealloc of allocatable scalar DT with allocatable component burnus at gcc dot gnu dot org
  2010-01-09 17:35 ` [Bug fortran/42647] " burnus at gcc dot gnu dot org
  2010-01-09 21:29 ` burnus at gcc dot gnu dot org
@ 2010-01-09 21:30 ` burnus at gcc dot gnu dot org
  2010-01-10 15:37 ` dominiq at lps dot ens dot fr
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: burnus at gcc dot gnu dot org @ 2010-01-09 21:30 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #3 from burnus at gcc dot gnu dot org  2010-01-09 21:30 -------
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


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42647


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Bug fortran/42647] Missed initialization/dealloc of allocatable scalar DT with allocatable component
  2010-01-07 16:04 [Bug fortran/42647] New: Missed initialization/dealloc of allocatable scalar DT with allocatable component burnus at gcc dot gnu dot org
                   ` (2 preceding siblings ...)
  2010-01-09 21:30 ` burnus at gcc dot gnu dot org
@ 2010-01-10 15:37 ` dominiq at lps dot ens dot fr
  2010-01-27 10:48 ` burnus at gcc dot gnu dot org
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: dominiq at lps dot ens dot fr @ 2010-01-10 15:37 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #4 from dominiq at lps dot ens dot fr  2010-01-10 15:36 -------
The patch in comment #1 fixes the test in comment#0, bootstrapped, regtested,
and passed my tests.

I have split the tests in comment#2 and #3 in two:

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 t3
  type(at), allocatable :: b3
end type t3
end module m

use m
type(t1) :: na1, a1, aa1(:)
type(t3) :: na3, a3, aa3(:)
allocatable :: a1, a3, aa1, aa3

if(allocated(a1)) call abort()
if(allocated(a3)) call abort()
if(allocated(aa1)) call abort()
if(allocated(aa3)) call abort()

if(allocated(na1%b1)) call abort()
if(allocated(na3%b3)) call abort()

print *, 'end'
end

and

module m                                                                        
type st                                                                         
  integer , allocatable :: a1                                                   
end type st                                                                     
type at                                                                         
  integer , allocatable :: a2(:)                                                
end type at                                                                     

type t2
  type(st), allocatable :: b2(:)
end type t2
type t4
  type(at), allocatable :: b4(:)
end type t4
end module m

use m
type(t2) :: na2, a2, aa2(:)
type(t4) :: na4, a4, aa4(:)
allocatable :: a2, a4, aa2, aa4

!if(allocated(a2)) call abort()
!if(allocated(a4)) call abort()
if(allocated(aa2)) call abort()
if(allocated(aa4)) call abort()

if(allocated(na2%b2)) call abort()
if(allocated(na4%b4)) call abort()

print *, 'end'
end

As such, both pass with the patch, while the first one gives a "Segmentation
fault" before the print without the patch (the second pass). If I remove one of
the '!', the test fails with  "Segmentation fault" AFTER the print with or
without the patch.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42647


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Bug fortran/42647] Missed initialization/dealloc of allocatable scalar DT with allocatable component
  2010-01-07 16:04 [Bug fortran/42647] New: Missed initialization/dealloc of allocatable scalar DT with allocatable component burnus at gcc dot gnu dot org
                   ` (3 preceding siblings ...)
  2010-01-10 15:37 ` dominiq at lps dot ens dot fr
@ 2010-01-27 10:48 ` burnus at gcc dot gnu dot org
  2010-05-15 21:25 ` dominiq at lps dot ens dot fr
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: burnus at gcc dot gnu dot org @ 2010-01-27 10:48 UTC (permalink / raw)
  To: gcc-bugs



-- 

burnus at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         AssignedTo|burnus at gcc dot gnu dot   |unassigned at gcc dot gnu
                   |org                         |dot org
             Status|ASSIGNED                    |UNCONFIRMED


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42647


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Bug fortran/42647] Missed initialization/dealloc of allocatable scalar DT with allocatable component
  2010-01-07 16:04 [Bug fortran/42647] New: Missed initialization/dealloc of allocatable scalar DT with allocatable component burnus at gcc dot gnu dot org
                   ` (4 preceding siblings ...)
  2010-01-27 10:48 ` burnus at gcc dot gnu dot org
@ 2010-05-15 21:25 ` dominiq at lps dot ens dot fr
  2010-05-15 22:03 ` janus at gcc dot gnu dot org
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: dominiq at lps dot ens dot fr @ 2010-05-15 21:25 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #5 from dominiq at lps dot ens dot fr  2010-05-15 21:25 -------
See also pr44154.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42647


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Bug fortran/42647] Missed initialization/dealloc of allocatable scalar DT with allocatable component
  2010-01-07 16:04 [Bug fortran/42647] New: Missed initialization/dealloc of allocatable scalar DT with allocatable component burnus at gcc dot gnu dot org
                   ` (5 preceding siblings ...)
  2010-05-15 21:25 ` dominiq at lps dot ens dot fr
@ 2010-05-15 22:03 ` janus at gcc dot gnu dot org
  2010-05-15 22:17 ` janus at gcc dot gnu dot org
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: janus at gcc dot gnu dot org @ 2010-05-15 22:03 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #6 from janus at gcc dot gnu dot org  2010-05-15 22:03 -------
Subject: Bug 42647

Author: janus
Date: Sat May 15 22:03:09 2010
New Revision: 159445

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=159445
Log:
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.

Added:
    trunk/gcc/testsuite/gfortran.dg/allocatable_scalar_9.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/trans-decl.c
    trunk/gcc/testsuite/ChangeLog


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42647


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Bug fortran/42647] Missed initialization/dealloc of allocatable scalar DT with allocatable component
  2010-01-07 16:04 [Bug fortran/42647] New: Missed initialization/dealloc of allocatable scalar DT with allocatable component burnus at gcc dot gnu dot org
                   ` (6 preceding siblings ...)
  2010-05-15 22:03 ` janus at gcc dot gnu dot org
@ 2010-05-15 22:17 ` janus at gcc dot gnu dot org
  2010-05-15 22:29 ` janus at gcc dot gnu dot org
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: janus at gcc dot gnu dot org @ 2010-05-15 22:17 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #7 from janus at gcc dot gnu dot org  2010-05-15 22:16 -------
r159445 should fix all the initialization trouble. Comment #2/#3 has been
included as a test case.


For the automatic deallocation there is be a problem remaining:

In comment #0, "a" itself is now automatically deallocated, but not "a%d" any
more.


-- 

janus at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever Confirmed|0                           |1
   Last reconfirmed|0000-00-00 00:00:00         |2010-05-15 22:16:55
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42647


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Bug fortran/42647] Missed initialization/dealloc of allocatable scalar DT with allocatable component
  2010-01-07 16:04 [Bug fortran/42647] New: Missed initialization/dealloc of allocatable scalar DT with allocatable component burnus at gcc dot gnu dot org
                   ` (7 preceding siblings ...)
  2010-05-15 22:17 ` janus at gcc dot gnu dot org
@ 2010-05-15 22:29 ` janus at gcc dot gnu dot org
  2010-05-16 14:40 ` dominiq at lps dot ens dot fr
  2010-09-02 14:49 ` dominiq at lps dot ens dot fr
  10 siblings, 0 replies; 13+ messages in thread
From: janus at gcc dot gnu dot org @ 2010-05-15 22:29 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #8 from janus at gcc dot gnu dot org  2010-05-15 22:29 -------
(In reply to comment #7)
> For the automatic deallocation there is be a problem remaining:
> 
> In comment #0, "a" itself is now automatically deallocated, but not "a%d" any
> more.

This is fixed by this patchlet (which is part of patch in comment #1):

Index: gcc/fortran/trans-decl.c
===================================================================
--- gcc/fortran/trans-decl.c    (revision 159445)
+++ gcc/fortran/trans-decl.c    (working copy)
@@ -3272,6 +3272,9 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, tr
              gfc_se se;
              stmtblock_t block;

+             if (sym_has_alloc_comp)
+               fnbody = gfc_trans_deferred_array (sym, fnbody);
+
              e = gfc_lval_expr_from_sym (sym);
              if (sym->ts.type == BT_CLASS)
                gfc_add_component_ref (e, "$data");


Also the use-association issue still needs to be taken care of.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42647


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Bug fortran/42647] Missed initialization/dealloc of allocatable scalar DT with allocatable component
  2010-01-07 16:04 [Bug fortran/42647] New: Missed initialization/dealloc of allocatable scalar DT with allocatable component burnus at gcc dot gnu dot org
                   ` (8 preceding siblings ...)
  2010-05-15 22:29 ` janus at gcc dot gnu dot org
@ 2010-05-16 14:40 ` dominiq at lps dot ens dot fr
  2010-09-02 14:49 ` dominiq at lps dot ens dot fr
  10 siblings, 0 replies; 13+ messages in thread
From: dominiq at lps dot ens dot fr @ 2010-05-16 14:40 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #9 from dominiq at lps dot ens dot fr  2010-05-16 14:40 -------
(In reply to comment #8)
> This is fixed by this patchlet (which is part of patch in comment #1):

This patch breaks gfortran.dg/allocatable_scalar_9.f90 (Segmentation fault) and
some variants I have in my tests.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42647


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Bug fortran/42647] Missed initialization/dealloc of allocatable scalar DT with allocatable component
  2010-01-07 16:04 [Bug fortran/42647] New: Missed initialization/dealloc of allocatable scalar DT with allocatable component burnus at gcc dot gnu dot org
                   ` (9 preceding siblings ...)
  2010-05-16 14:40 ` dominiq at lps dot ens dot fr
@ 2010-09-02 14:49 ` dominiq at lps dot ens dot fr
  10 siblings, 0 replies; 13+ messages in thread
From: dominiq at lps dot ens dot fr @ 2010-09-02 14:49 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #10 from dominiq at lps dot ens dot fr  2010-09-02 14:49 -------
The tests in the different comments seem to pass since some time. 
The behavior of the derived test

module m                                                                        
type st                                                                         
  integer , allocatable :: c1
end type st
type t1
  type(st), allocatable :: b1
end type t1
end module m

use m
type(t1) :: a1, aa1(:)
allocatable :: a1, aa1

if(allocated(a1)) call abort()
if(allocated(aa1)) call abort()

print *, 'now allocate'

allocate(a1, a1%b1, a1%b1%c1)
print *, allocated(a1), allocated(a1%b1), allocated(a1%b1%c1)
a1%b1%c1 = 1
print *, a1%b1%c1
deallocate(a1%b1%c1)
print *, allocated(a1), allocated(a1%b1), allocated(a1%b1%c1)
deallocate(a1%b1)
end

has changed with r163744. Before one got

[macbook] f90/bug% a.out
 now allocate
Segmentation fault

Now I get:

[macbook] f90/bug% a.out
 now allocate
 T T T
           1
 T T F
At line 25 of file pr42647_1_pass_1_red_1.f90
Fortran runtime error: Attempt to DEALLOCATE unallocated 'a1'


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42647


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Bug fortran/42647] Missed initialization/dealloc of allocatable scalar DT with allocatable component
       [not found] <bug-42647-4@http.gcc.gnu.org/bugzilla/>
@ 2010-10-13 13:22 ` burnus at gcc dot gnu.org
  0 siblings, 0 replies; 13+ messages in thread
From: burnus at gcc dot gnu.org @ 2010-10-13 13:22 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42647

--- Comment #11 from Tobias Burnus <burnus at gcc dot gnu.org> 2010-10-13 13:21:40 UTC ---
(In reply to comment #10)
> allocate(a1, a1%b1, a1%b1%c1)

This ALLOCATE statement is INVALID! It violates the following:

"An allocate-object [...] shall not depend [...] on the [...] allocation status
[...] of any allocate-object in the same ALLOCATE statement."

(F2008, "6.7.1 ALLOCATE statement" first paragraph after C644.)

Solution: Write it as
  allocate(a1)
  allocate(a1%b1)
  allocate(a1%b1%c1)

The test case still fails: For the DEALLOCATE statement one wrongly gets the
error that the variable is not allocated.

 * * *

Cf. also Janus' patch for this PR (which does not yet fix this DEALLOCATE
issue):
  http://gcc.gnu.org/ml/fortran/2010-10/msg00155.html


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2010-10-13 13:22 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-01-07 16:04 [Bug fortran/42647] New: Missed initialization/dealloc of allocatable scalar DT with allocatable component burnus at gcc dot gnu dot org
2010-01-09 17:35 ` [Bug fortran/42647] " burnus at gcc dot gnu dot org
2010-01-09 21:29 ` burnus at gcc dot gnu dot org
2010-01-09 21:30 ` burnus at gcc dot gnu dot org
2010-01-10 15:37 ` dominiq at lps dot ens dot fr
2010-01-27 10:48 ` burnus at gcc dot gnu dot org
2010-05-15 21:25 ` dominiq at lps dot ens dot fr
2010-05-15 22:03 ` janus at gcc dot gnu dot org
2010-05-15 22:17 ` janus at gcc dot gnu dot org
2010-05-15 22:29 ` janus at gcc dot gnu dot org
2010-05-16 14:40 ` dominiq at lps dot ens dot fr
2010-09-02 14:49 ` dominiq at lps dot ens dot fr
     [not found] <bug-42647-4@http.gcc.gnu.org/bugzilla/>
2010-10-13 13:22 ` burnus at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).