(Class-) array finalization and initialization question

Paul Richard Thomas paul.richard.thomas@gmail.com
Thu Feb 19 19:53:00 GMT 2015


Dear Andre,

With my trunk, I had to make all the elemental subroutines impure to
get the testcase to compile; ie. same result as Salvatore.

ifort (IFORT) 13.0.1 20121010 bombs out in compilation so totally that
I cannot be troubled to sort out the reasons. To be fair, it is way,
way to old a version to be useful for this comparison.

Cheers

Paul

On 19 February 2015 at 12:43, 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



-- 
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.

Groucho Marx



More information about the Fortran mailing list