(Class-) array finalization and initialization question
Andre Vehreschild
vehre@gmx.de
Thu Feb 19 12:00:00 GMT 2015
Hi Salvatore,
thanks for the test. Can you narrow where the cray-compiled executable
segfaults? May be by compiling with -g and running in a debugger/valgrind to
get a line number?
On compiling with GCC 5: My last pull is some days ago. And with that version it
compiled just fine. Now updating to the most recent state and trying again. I
remember there was some traffic on this list about pure/impure routines, may be
this has corrected that issue. I will adapt the source soon.
Regards,
Andre
On Thu, 19 Feb 2015 12:43:22 +0100
Salvatore Filippone <filippone.salvatore@gmail.com> wrote:
> Compiling and running with Cray I get a segfault.
> With GNU 5.0 it does not compil:
>
> [sfilippo@localhost Scaricati]$ gfortran -o fintest fintest.f08
> fintest.f08:139:33:
>
> elemental subroutine tae_init(x)
> 1
> Error: INTENT(OUT) argument 'x' of pure procedure 'tae_init' at (1)
> may not be polymorphic
>
> On Thu, Feb 19, 2015 at 12:23 PM, Andre Vehreschild <vehre@gmx.de> wrote:
> > 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
--
Andre Vehreschild * Email: vehre ad gmx dot de
More information about the Fortran
mailing list