[Bug fortran/69298] Array finalisers seem to be given the wrong array when the array is a member variable.

pault at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Oct 24 19:22:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69298

Paul Thomas <pault at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |pault at gcc dot gnu.org

--- Comment #4 from Paul Thomas <pault at gcc dot gnu.org> ---
(In reply to Dominique d'Humieres from comment #3)
> > Created attachment 37448 [details]
> > Self-contained variant
> 
> With n=3, the output of the attached test is
> 
> Initialising stuff_type 4
> Finalising stuff_type 0
> ...
> ---
> Initialising test_type
> Initialising stuff_type 4
> Finalising stuff_type 0
> Copy initialiser 4 4
> Initialising stuff_type 1
> Finalising stuff_type 0
> Copy initialiser 1 1
> Initialising stuff_type 2
> Finalising stuff_type 0
> Copy initialiser 2 2
> Initialising stuff_type 3
> Finalising stuff_type 0
> Copy initialiser 3 3
> Finalising stuff_type 4
> Copy initialiser 4 4
> thing 10
> Finalising stuff_type 4
> 
> Program received signal SIGSEGV: Segmentation fault - invalid memory
> reference.
> 
> Changing 'n' to 2 or 4, gives respectively
> 
> ...
> ---
> Initialising test_type
> Initialising stuff_type 4
> Finalising stuff_type 1342972320
> Copy initialiser 4 4
> Initialising stuff_type 1
> Finalising stuff_type 32767
> Copy initialiser 1 1
> Initialising stuff_type 2
> Finalising stuff_type 263453344
> Copy initialiser 2 2
> Finalising stuff_type 4
> Copy initialiser 4 4
> thing 7
> Finalising stuff_type 4
> 
> Program received signal SIGSEGV: Segmentation fault - invalid memory
> reference.
> 
> and
> 
> ...
> Initialising test_type
> Initialising stuff_type 4
> Finalising stuff_type 107478528
> Copy initialiser 4 4
> Initialising stuff_type 1
> Finalising stuff_type 1
> Copy initialiser 1 1
> Initialising stuff_type 2
> Finalising stuff_type 5120
> Copy initialiser 2 2
> Initialising stuff_type 3
> Finalising stuff_type 0
> Copy initialiser 3 3
> Initialising stuff_type 4
> Finalising stuff_type 1501114256
> Copy initialiser 4 4
> Finalising stuff_type 4
> Copy initialiser 4 4
> thing 14
> Finalising stuff_type 4
> 
> where the nonzero values changed between different runs.

For the record, since I have spent an hour or two investigating this tonight:

__final_test_mod_Test_type has, towards the end....


                {
                  struct array0_stuff_type desc.32;

                  desc.32.dtype = 296;
                  desc.32.data = (void * restrict) &ptr2->thing;
                  __final_stuff_mod_Stuff_type (&desc.32);
                }
                {
                  struct array1_stuff_type parm.33;

                  parm.33.dtype = 297;
                  parm.33.dim[0].lbound = 1;
                  parm.33.dim[0].ubound = 3;
                  parm.33.dim[0].stride = 1;
                  parm.33.data = (void *) &ptr2->things[0];
                  parm.33.offset = -1;
                  __final_stuff_mod_Stuff_type (&parm.33);
                }

whereas the prototype for the 'stuff' finalization is

__final_stuff_mod_Stuff_type (struct array7_stuff_type & restrict array,
integer(kind=8) byte_stride, logical(kind=1) fini_coarray)


That is to say that two actual arguments are missing.

Since this contains
          if (byte_stride == 4)
            {
              {
                static integer(kind=8) C.3513 = 4;

                stuff_1d_finaliser ((struct array7_stuff_type *) array,
&C.3513);
              }
            }

It seems difficult to understand how stuff_1d_finaliser is getting called at
all!

I'll come back to this when I can.

Paul


More information about the Gcc-bugs mailing list