(Class-) array finalization and initialization question

Andre Vehreschild vehre@gmx.de
Thu Feb 19 11:23:00 GMT 2015


Hi all,

I have compiled a small test-program to catch all cases of this topic and check
what other compilers do in these cases (see attachment). 

I am now looking for volunteers with access to third party fortran2008
compilers to compile and run the attached program. Please post the full output
and the compiler you used. When you needed to modify the test program, please
attach the modified version, too, enabling me to analyze the output correctly.

Thank you for all your help.

Regards,
	Andre

On Wed, 18 Feb 2015 17:07:44 +0100
Salvatore Filippone <filippone.salvatore@gmail.com> wrote:

> Hmm.
> I am sorry, you appear to be right, and the Cray compiler actually
> agrees with you. I was too hasty :(
> 
> 
> On Wed, Feb 18, 2015 at 5:03 PM, Andre Vehreschild <vehre@gmx.de> wrote:
> > Hi Salvatore,
> >
> > thanks for the quick reply.
> >
> > The cited F2008 standard at the position given says, that any subcomponent
> > provided with a default-initializer is default-initialized. IMHO this does
> > conflict with what you tell me. Or do I misinterpret this fragment:
> >
> > "The INTENT (OUT) attribute for a nonpointer dummy argument specifies that
> > the dummy argument becomes undefined on invocation of the procedure, except
> > for any subcomponents that are default-initialized (4.5.4.6)." (F2008,
> > 5.3.10, §3)
> >
> > and it means that the dummy arguments become undefined, besides all
> > arguments that have subcomponents that are default-initialized don't become
> > undefined. Those remain defined, but are not re-default-initialized? I
> > don't hope the standard is to be interpreted like that. That would be quite
> > unexpected. Which user of Fortran is to understand that, and what is the
> > higher use of it?
> >
> > Regards,
> >         Andre
> >
> > On Wed, 18 Feb 2015 16:05:34 +0100
> > Salvatore Filippone <filippone.salvatore@gmail.com> wrote:
> >
> >> >Note the intent(out) here, which is the second crucial point and in
> >> >combination with the call to init() in the main program:
> >> >
> >>  > type(t1), allocatable :: x(:,:)
> >>   >allocate(t1 :: x(5,5))
> >>   >x%i = 1
> >>   >call init(x(::2, ::3))
> >> >
> >> >one gets the remarkable result, that now x%i is -13 for the entries
> >> >selected by the strides. My question now is: why are those values -13 and
> >> >not 42 as I would expect from the default initializer? The array elements
> >> >selected by the strides have been undefined when calling init() as of
> >> >F2008 5.3.10 Â3 (first sentence) hence calling the finalizer. But from
> >> >that same sentence I would expect the default-initializer to be set for
> >> >the values instead.
> >>
> >> Because the default inizializer is called when you invoke ALLOCATE,
> >> whereas the finalizer is invoked at the time you enter the INIT
> >> routine since it has an INTENT(OUT) dummy argument.
> >> Since within INIT you do not touch the X argument anymore, the output
> >> is consistent with the rules.
> >>
> >> Saying it again, the default initializer is only invoked when you
> >> create a new variable instance by an ALLOCATION, or (as in the
> >> attached example) by using an automatic array of the correct type
> >> module type_mod
> >> type t1
> >>     integer :: i = 42
> >>   contains
> >>     final :: fin
> >>   end type t1
> >> contains
> >>   elemental subroutine fin(x)
> >>     type(t1), intent(inout) :: x
> >>     x%i = -13 * x%i
> >>   end subroutine fin
> >> end module type_mod
> >>
> >> module init_mod
> >>   use type_mod
> >> contains
> >>   subroutine init(x)
> >>     type(t1), intent(out) :: x(:,:)
> >>     type(t1) :: a(size(x,1),size(x,2))
> >>     x = a
> >>   end subroutine init
> >> end module init_mod
> >>
> >> program tryfin
> >>   use init_mod
> >>
> >>
> >>   type(t1), allocatable :: x(:,:)
> >>   allocate(t1 :: x(5,5))
> >>   x%i = 1
> >>   call init(x(::2, ::3))
> >>
> >>   write(*,*) x%i
> >> end program tryfin
> >>
> >>
> >> which produces
> >> [sfilippo@localhost PSBLAS_V3]$ ./tryfin
> >>           42           1          42           1          42
> >> 1           1           1           1           1           1
> >>  1           1           1           1          42           1
> >>  42           1          42           1           1           1
> >>    1           1
> >>
> >>
> >> because the initializer is called when you instantiate the local variable
> >> A.
> >>
> >> Salvatore
> >
> >
> > --
> > Andre Vehreschild * Email: vehre ad gmx dot de


-- 
Andre Vehreschild * Email: vehre ad gmx dot de 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fintest.f08
Type: application/octet-stream
Size: 5687 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/fortran/attachments/20150219/46507e28/attachment.obj>


More information about the Fortran mailing list