(Class-) array finalization and initialization question
Salvatore Filippone
filippone.salvatore@gmail.com
Thu Feb 19 14:37:00 GMT 2015
On Cray: this runs
call ten_init(x_ten(::2, ::3))
!!$ call tee_init(x_tee(::2, ::3))
!!$ call tne_init(x_tne(::2, ::3))
call tnn_init(x_tnn(::2, ::3))
!!$ call tae_init(x_tae(::2, ::3))
call tan_init(x_tan(::2, ::3))
!!$ call tge_init(x_tge(::2, ::3))
call tgn_init(x_tgn(::2, ::3))
invoking any one of the commented subroutines makes the code segfault.
Salvatore
On Thu, Feb 19, 2015 at 1:00 PM, Andre Vehreschild <vehre@gmx.de> wrote:
> 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