[J3] type definitions

Malcolm Cohen malcolm at nag-j.co.jp
Sun Aug 14 01:09:42 UTC 2022


Van is correct.

 

Component names are class (3), Variable names are class (1), so there is no conflict – our rules permit this.

 

A structure component name is never “bare”, it is always preceded by a percent sign.

 

A “bare” type component name can appear only

1.	as the name of the component being defined by a component definition statement;
2.	as a keyword in a structure constructor for that type.

 

So, no conflict and no ambiguity.

 

Cheers,

-- 

..............Malcolm Cohen, NAG Oxford/Tokyo.

 

From: J3 <j3-bounces at mailman.j3-fortran.org> On Behalf Of Van Snyder via J3
Sent: Sunday, August 14, 2022 5:47 AM
To: j3 at mailman.j3-fortran.org
Cc: Van Snyder <van.snyder at sbcglobal.net>
Subject: Re: [J3] type definitions

 

On Sat, 2022-08-13 at 14:38 -0500, Kurt W Hirchert via J3 wrote:

On 8/10/2022 5:18 PM, Robert Corbett via J3 wrote:

 

Is the program

 

      PROGRAM MAIN
        TYPE T
          REAL(KIND=KIND(X)) Y
        END TYPE T
      END

standard conformant?

What about the program

      PROGRAM MAIN
        DOUBLE PRECISION X
        TYPE T
          REAL(KIND=KIND(X)) X
        END TYPE T
      END

?

Some of the text in the Fortran 2008

standard and Corrigendum 1 that

applies to these programs seems to

be missing in the Fortran 2018 

standard and the 2023 draft.


Robert Corbett

 

Several people have said thought that both programs conform.  I come to a different conclusion, so I would appreciate it if people could point out where they disagree with my reasoning.  (It's been nearly two decades since I was on the committee, so my grasp of the fine details of the standard may not be what it used to be.)

I see the first program as conforming, independent of the question of the "missing" text.  Since X is not declared explicitly, it is implicitly declared to be default real, so the KIND for Y is established regardless of the question of whether X is a part of T or of MAIN.  For reasons having nothing to do with this example, it is important that X not be part of T (because we don't want undeclared components in T), so I hope that Malcolm's comments that the "missing" text was unnecessary means that this is expressed more clearly somewhere else in the draft.  Could we get a hint as to where?

I see the second program as not confirming.  The explicit declaration of a component X in T prevents T from accessing the X in MAIN by host association, so KIND(X) can only be referencing the component X, but this violates the requirement that the explicit declaration of X precede the KIND(X) reference.  I can imagine reasons why a compiler might fail to diagnose this, so I don't take compiler acceptance of this program as a strong indication of how the standard should be interpreted in this regard.

Am I missing something?

 

I don't think the reference to KIND(X) in the second example is a reference to the to-be-defined component. There is no syntax to reference a component of a type from within the type, or indeed anywhere else. Only the components of objects of the type can be accessed, and then they need the <designator>% before the component name.

 

-Kurt

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.j3-fortran.org/pipermail/j3/attachments/20220814/edad0b20/attachment.htm>


More information about the J3 mailing list