Hi Tobias,

The problem is with the way in which extends_type_of is organised.  It
takes the _vptr directly.  Unless it is null for undefined pointers, a
segfault is triggered.  I guess that I could achieve the same thing
with the default initialization.

Initialization of class(*) pointers appears to be stuffed, as you
point out.  I'll try to figure it out tomorrow night.

Cheers

Paul



On 16 December 2012 20:19, Tobias Burnus <bur...@net-b.de> wrote:
> Paul Richard Thomas wrote:
>>>
>>> +  /* Unlimited polymorphic pointers should have their vptr nullified.
>>> */
>>> >+  if (UNLIMITED_POLY (sym) && CLASS_DATA (sym)->attr.pointer)
>>> >+    gfc_defer_symbol_init (sym);
>>> >
>>> >
>>> >Why? If the pointer has never been pointer-associated, one shouldn't
>>> > access
>>
>> It's so that SAME_TYPE_AS and EXTENDS_TYPE_OF do the right thing with
>> unassociated pointers.  I am not sure that I understand your concern
>> if the code is needed.
>
>
> It's not really a concern. I just see it as missed code-size/performance
> optimization as I believe that it is not needed.
>
> Adding
>   ptr->_vptr = NULL
> directly after declaration of a local pointer variable is pointless. Such a
> variable has an undefined pointer association status. And for same_type_as
> and extends_type_of the argument may not be such a pointer. Only
> unassociated pointers are allowed. In order to create such a pointer, one
> either needs an initialization like in
>   class(*), pointer :: ptr => null()
> or has to explicitly call "ptr=>null()" or nullify(ptr)". That's not
> different to other pointers and in particular not different to CLASS(<name>)
> types.
>
> In other words, the following program is invalid as "ptr" has an undefined
> pointer association status:
>
> type(t), target :: x
> class(*), pointer :: ptr
> print *, same_type_as (ptr, x)  ! <<< invalid: "foo" is an undefined pointer
>
> while the following code is valid (and causes an ICE):
>
> type(t), target :: x
> class(*), pointer :: ptr => NULL()  ! pointer initialization
> print *, same_type_as (ptr, x)
>
> as is
>
> type(t), target :: x
> class(*), pointer :: ptr
> ! ptr => x  ! optionally
> ptr => NULL()
> print *, same_type_as (ptr, x)
>
>  * * *
>
> By the way, the following code also causes an ICE. I think it is valid since
> Fortran 2008:
>
> type t
> end type t
> type(t), target :: x
> class(*), pointer :: ptr => x
> print *, same_type_as (ptr, x)
> end
>
> Namely:
>
> "R442   component-initialization is   [...]  or   => initial-data-target"
> "C460 (R442) If initial-data-target appears, component-name shall be
> data-pointer-initialization compatible with it."
> "If initial-data-target appears for a data pointer component, that component
> in any object of the type is initially associated with the target or becomes
> associated with the target as speci ed in 16.5.2.3."
>
> Tobias



-- 
The knack of flying is learning how to throw yourself at the ground and miss.
       --Hitchhikers Guide to the Galaxy

Reply via email to