[J3] Question on parent component naming
John Reid
john.reid9 at talktalk.net
Tue Apr 9 11:02:18 UTC 2024
Reinhold,
Let's go into private mode. I don't like arguing in public, specially
with Malcolm.
Malcolm said "Renaming does not change the name of the components. It
just adds a local name for the remote name." This is not relevant. The
only component accessed in your original example is p. In any case, the
standard is already clear -- 14.2.2 para 2 says "The USE statement
provides the means by which a scoping unit accesses named data objects,
nonintrinsic types, procedures, abstract interfaces, generic
identifiers, and namelist groups in a module."
I just do not see any need for an interp. (but there is a bug in the Nag
compiler, IMHO).
Or is it that your original example does not illustrate the problem that
you see?
Cheers,
John.
Bader, Reinhold via J3 wrote:
> OK, so John's citing of 14.2.2 is not relevant for component specs because
> all entities covered according to 14.2.2 para 2 are of class(1)?
>
> Here is a variant of the program that, given Malcolm's view, should compile:
>
> MODULE mod
> TYPE :: t
> REAL, POINTER :: p(:) => null()
> END TYPE
>
> END MODULE
> MODULE mod_ext
> USE mod, my_t => t
>
> TYPE, EXTENDS(my_t) :: td
> REAL :: data(3)
> END TYPE
> END MODULE
> PROGRAM ref_parent
> USE mod
> USE mod_ext, ONLY : td
>
> TYPE(td), TARGET :: o_my_t
>
> o_my_t%t = t(o_my_t%data)
>
> o_my_t%data = [ 1., 2., 3. ]
>
> IF ( all(o_my_t%p == o_my_t%data) ) THEN
> WRITE(*,*) 'OK'
> ELSE
> WRITE(*,*) 'FAIL'
> END IF
> END PROGRAM
>
> It would, however, be nice if the standard had some explicit statement (maybe in 9.4.2?)
> concerning the use of the type name as a class(1) versus a class(2) entity.
> Also, 7.5.7.2 para 2 should be more clearly worded.
>
> Since there currently exists a portability issue, should this be an interp request?
>
> Regards
> Reinhold
>
>> -----Ursprüngliche Nachricht-----
>> Von: J3 <j3-bounces at mailman.j3-fortran.org> Im Auftrag von Malcolm
>> Cohen via J3
>> Gesendet: Dienstag, 9. April 2024 01:52
>> An: 'General J3 interest list' <j3 at mailman.j3-fortran.org>
>> Cc: Malcolm Cohen <malcolm at nag-j.co.jp>
>> Betreff: Re: [J3] Question on parent component naming
>>
>> Oops, I forgot to say that it is always the name of the type given in the type
>> definition that is used in other contexts where the name matters, e.g.
>> in type equivalence.
>>
>> Cheers,
>> --
>> ..............Malcolm Cohen, NAG Oxford/Tokyo.
>>
>> -----Original Message-----
>> From: J3 <j3-bounces at mailman.j3-fortran.org> On Behalf Of John Reid via J3
>> Sent: Tuesday, April 9, 2024 12:51 AM
>> To: General J3 interest list <j3 at mailman.j3-fortran.org>
>> Cc: John Reid <john.reid9 at talktalk.net>
>> Subject: Re: [J3] Question on parent component naming
>>
>> Reinhold,
>>
>> I believe that your program is standard-conforming. 14.2.2, para 7 says
>>
>> An accessible entity in the referenced module is associated with one or more
>> accessed entities, each with its own identifier. These identifiers are
>> . the identifier of the entity in the referenced module if that identifier
>> appears as an only-use-name or as the defined-operator of a generic-spec in
>> any only for that module, . each of the local-names or local-defined-
>> operators that the entity is given in any rename for that module, and . the
>> identifier of the entity in the referenced module if that identifier does not
>> appear as a use-name or use-defined-operator in any rename for that
>> module.
>>
>> This is saying that rename really does renaming. The entity is known by its
>> new name and is not known by its original name. So your code behaves like
>> this code
>>
>> PROGRAM ref_parent
>>
>>
>> TYPE :: my_t
>>
>> REAL, POINTER :: p(:) => null()
>>
>> END TYPE
>>
>> TYPE, EXTENDS(my_t) :: td
>>
>> REAL :: data(3)
>>
>> END TYPE
>>
>> TYPE(td), TARGET :: o_my_t
>>
>> o_my_t%my_t = my_t(o_my_t%data) ! (x)
>>
>> ! o_my_t%t = my_t(o_my_t%data) ! (y)
>>
>> END PROGRAM
>>
>> which looks good to me, but not if you replace (x) by (y).
>>
>> I think NOTE 1 in 7.5.7.1 is just doing what notes do - clarifying what has
>> already been defined normatively.
>>
>> Cheers,
>>
>> John.
>>
>>
>>
>>
>> Bader, Reinhold via J3 wrote:
>>> Dear J3,
>>>
>>> consider the following program:
>>>
>>> MODULE mod
>>>
>>> TYPE :: t
>>>
>>> REAL, POINTER :: p(:) => null()
>>>
>>> END TYPE
>>>
>>> END MODULE
>>>
>>> PROGRAM ref_parent
>>>
>>> USE mod, my_t => t
>>>
>>> TYPE, EXTENDS(my_t) :: td
>>>
>>> REAL :: data(3)
>>>
>>> END TYPE
>>>
>>> TYPE(td), TARGET :: o_my_t
>>>
>>> o_my_t%my_t = my_t(o_my_t%data) ! (x)
>>>
>>> ! o_my_t%t = my_t(o_my_t%data) ! (y)
>>>
>>> END PROGRAM
>>>
>>> Two compilers accept this code. Two other compilers tell me that my_t
>>> is not a parent component of o_my_t, at (x)
>>>
>>> One of those two others accepts the variant statement (y), the other
>>> one crashes when (y) is used.
>>>
>>> I tend to believe that the above is conforming, but this is based on
>>> non-normative evidence (NOTE 1 in 7.5.7.1 of 24-007).
>>>
>>> Any opinions?
>>>
>>> Regards
>>>
>>> Reinhold
>>>
More information about the J3
mailing list