############################################################################## # # # X3J3/93-006 # # # # February 1993 # # # ############################################################################## Number Title Status 000000 Minor edits and corrections to ISO/IEC 1539:1991 (E) 3 000000 Minor edits and corrections to ISO/IEC 1539:1991 (E) 2 000001 Equivalence of expression evaluations 3 000002 Default main program name 3 000003 Preconnected units and UNIT=* 3 000004 Blanks in format specifications in free form source 2 000005 Namelist output of zero length character strings 3 000006 Procedure specifications in a scoping unit 3 000007 Duplicate module procedures in interface blocks 1 000008 subsumed by item 7 ** 000009 Generic interfaces with the same name in a program 3 000010 Generic interfaces with the same name in a scoping unit 3 000011 Multiple accessible defined assignment interfaces 2 000012 Type of a named constant when there is IMPLICIT mapping 2 000013 Implicit mapping of an interface block 3 000014 Interface for a character function with a variable length result 3 000015 Error in fourth constraint for R429 3 000016 Character length specification 3 000017 Creation of entities by local names in rename-list 3 000018 Valid characters for indicating fixed form statement continuation 3 000019 Correctness of last example in section 4.5 3 000020 References to the same derived type by different names 3 000021 References to different derived types with the same name 3 000022 Use of derived type name in host scoping unit 3 000023 subsumed by item 12 ** 000024 IMPLICIT NONE and the type of a function result 3 000025 Resolution of internal procedure references 3 000026 Bounds of array expressions 3 000027 Requirements for pointers and target association ** 000028 Precedence of use or host association 1 000029 Class of a defined operator 2 000030 Length of character literals in array constructors 2 000031 Overloaded implied-DO variable names KEYWORD: implied-Do variable, D 3 000032 Implicit declaration of a derived type 3 000033 Interface blocks with the same name in a program 3 000034 subsumed by item 33 ** 000035 subsumed by item 33 ** 000036 Pointer to an assumed-size array 3 000037 Use of array sections in pointer assignment statements 3 000038 Same interface body in multiple generic interface blocks 3 000039 Association of a pointer actual argument with a dummy argument 2 000040 Allocation of arrays of pointers 3 000041 Procedure with target dummy argument requires explicit interface 2 000042 KIND parameter value 3 000043 List-directed character input 3 000044 END statement and fixed form source 3 000045 Array intrinsics with arrays of derived-type arguments 3 000046 RESULT clause for RECURSIVE functions 3 000047 Automatic data object in initialization expressions 3 000048 Pointer-valued statement functions 3 000049 Characteristics of function results 1 000050 Repeat counts on edit descriptors 3 000051 On unambiguous generic procedure references 3 000052 Expressions in statement function definitions 3 000053 Optional intrinsic function arguments 3 000054 Resolving generic procedure references 0 000055 Characteristics of character function results 3 000056 TRANSFER intrinsic function description 3 000057 Prohibition against multiple explicit specific interfaces 3 000058 Ambiguous use of "keyword" 2 000059 SEQUENCE derived type and component bounds 3 000060 Statement function argument references 3 000061 G edit descriptor with "d" = 0 3 000062 Statement function constraints 3 000063 Interfaces and dummy procedure arguments 3 000064 SPACING result for 0.0 3 000065 Block and nonblock DO construct 3 000066 Declaration of FUNCTION type 3 000067 Output of negative signed zero 3 000068 Pointer association status 3 000069 I/O implied DO variable 3 000070 Characteristics specified by interface bodies 2 000071 USE association and COMMON block names 2 000072 Missing constraint for SIZE= 3 000073 Description of the MERGE intrinsic function 2 000074 Meaning of "referenced" in 11.3.2 3 000075 Interface blocks in block data 2 000076 Attributes, properties, characteristics 1 000077 Misc. questions 1 000078 Intrinsic functions in MODULE specification statements 3 000079 Automatic character and ALLOCATABLE, POINTER and TARGET attributes 2 000080 Vector subscripts in masked array assignment statements 3 000081 Pointer actual argument overlap 1 000082 Host association and generic names 2 000083 Generic override of intrinsic procedure ** 000084 Change masked array assignment constraint to prose 3 000085 Nondefault integer data type for UNIT=, RECL=, and REC= specifiers 3 000086 USE and host association 2 000087 PARAMETER statements and SAVE statements 2 000088 Common block names and local names 1 000089 Errors in the DATA statement description 2 000090 Subroutine and function names in nested scopes 1 000091 Constraint diagnosis for PRIVATE attribute 2 000092 Pointer and storage association 2 000093 Scalar pointer function results 2 000094 Functions in WRITE statement implied-DO loops 3 000095 Functions in IOLENGTH implied-DO loops 3 000096 Definition of "Declaration" 1 000097 Specification expression 2 000098 KIND param and list directed I/O 2 000099 Generic interfaces 1 000100 ASSOCIATED intrinsic and zero-sized objects 2 000101 Specification statements 1 000102 Returned value for INQUIRE POSITION= on an empty file 2 000103 Statement Function with unreferenced dummy argument 3 000104 Rounding formatted output 3 000105 Parallel evaluation of operands and arguments 2 000106 Multiple USE of modules; renaming rules 2 000107 USE renaming of generic and specific interfaces 3 000108 Referencing disassociated pointers 2 000109 Intrinsic function ASSOCIATED 3 000110 Named constant shape specification 3 000111 Array constructors in masked assignment statements 1 000112 Sequence derived type external functions 2 000113 Ordering of array specification and initialization 2 000114 Named constant attribute specification 3 000115 Multiple dummy arguments DEFECT TYPE: Interpretation 3 000116 Scoping units and statement labels 3 000117 Use of MODULE PROCEDURE statement in internal procedures 2 000118 Named constructs and host association 3 000119 Rank of assumed-shape array 3 000120 PRESENT intrinsic and host association 3 000121 ";" As a Statement Separator 1 000122 Intrinsic procedures in modules 1 000123 Result of INT(A) not equal to A for non-default integers 2 000124 Result of LBOUND for assumed-size arrays 1 000125 Copy in/copy out of target dummy arguments 2 000126 Character entry statements and partial association 1 000127 Is a module a global entity? 1 000128 Use associated generic names and renaming 1 000129 Array constructors in initialization expressions 2 000130 Multiple statements on line with END statement 2 INTRODUCTION This document is an internal working document of X3J3, the Fortran Technical Committee of the American National Standards Association, and contains the committee's responses to the defect reports received against ISO/IEC 1539:1991 (E). The status of each item in this document is tracked with the STATUS field, the six values of which are: 1. X3J3 consideration in progress Submitted via the hardcopy route or via the RFI or RFC email route and being processed by X3J3, but as yet no response has been adopted by an X3J3 formal vote. 2. X3J3 draft response A response (ANSWER field) has been approved by a formal X3J3 vote but not yet approved by subsequent letter ballot. 3. X3J3 approved; ready for WG5 Approved by an X3J3 letter ballot. This vote will be taken only on items having a STATUS of "X3J3 draft response". 4. WG5 approved; ready for SC22 Approved by WG5 for further processing within ISO as a corrigendum item. WG5 will advise X3J3 when an item reaches this status. 5. Returned by WG5 for X3J3 reconsideration Returned to X3J3 after the item had been forwarded to WG5 but failed to gain WG5 approval. This status is equivalent to "X3J3 consideration in progress". 6. Published Published as an item in an approved corrigenda report, or incorporated into the next draft revision of the standard. In either case the item must have previously attained the status of "WG5 approved; ready for SC22". Each entry is categorized by its defect type of which there are three kinds (these definitions are taken from the X3/SD-2 of February 1992): 1. Erratum The standard may be modified with corrigenda to: a) Correct a typographical error. b) Insert a missing word, sentence, paragraph, figure, example, table, or clause. c) Delete a extraneous word, sentence, paragraph, figure, example, table, or clause. Any such modification of the standard shall not introduce technical changes or changes in what it means to conform to the standard. 2. Amendment Any modification of the standard that introduces technical changes or changes in what it means to conform to the standard shall be treated as an amendment to the standard. 3. Interpretation An interpretation is a clarifying commentary on the standard that does not introduce either a technical change or a change in what it means to conform to the standard. The first entry, which has the number 000000-a, contains details of X3J3-approved minor edits and corrections to the standard. The second entry, which has the number 000000-b, is similar but is only in X3J3- draft status. ================================================================================ NUMBER: 000000-a TITLE: Minor edits and corrections to ISO/IEC 1539:1991 (E) KEYWORDS: edits, typos, typographical errors DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 1. Introduction, Overview, Data Concepts, last sentence [xvi:1-2]; Delete the sentence "The section concludes ... names." 2. 2.4.6, third sentence [15:25]; Change "of" to "or". 3. 12.4.1.1, first paragraph, last line [172:41]; Change "of the the dummy" to "of the dummy" 4. 12.5.2.4, at end of first paragraph [177:29]; Add new sentence "When a statement function is invoked, an instance of that statement function is created." 5. 13.13.25, Result Value, Case (ii), at beginning of the third line [203:23]; Change "1,sh" to "sh,1". 6. 13.13.66, Result Value, Case (iii) [220:25]; Change",[" to "[" (i.e. delete comma). 7. Annex A, conformable [255:27]; Change "2.4.7" to "2.4.5". 8. Annex A, constant [255:38]; Change "2.4.4" to "2.4.3.1.2". 9. Annex A, derived type [256:23]; Change "2," to "2)". 10. Annex A, extent [257:8]; Change "2.4.7" to " 2.4.5". 11. Annex A, literal constant [258:19]; Change "2.4.4" to "2.4.3.1.2". 12. Annex A, main program [258:22]; Change "2," to "2)". 13. Annex A, module [258:25]; Change "4," to "4)". 14. Annex A, named constant [258:34]; Change "2.4.4" to "2.4.3.1.2". 15. Annex A, procedure [259:19]; Change "3," to "3)". 16. Annex A, rank [259:31]; Change "2.4.7" to "2.4.5". 17. Annex A, shape [ 260:12]; Change "2.4.7" to "2.4.5". 18. Annex A, size [260:14]; Change "2.4.7" to "2.4.5". 19. Annex A, subobject [260:35]; Change "2.4.3.2" to "2.4.3.1". 20. Annex A, target [261:9]; Change "specified in a" to "specified in a TARGET statement or". 21. Annex A, variable [261:30]; Change "2.4.5" to "2.4.3.1.1". HISTORY: The initial set of 20 items, all except item 3, prepared at WG5 (Victoria, BC) and submitted to X3J3 122, July 1992. Item 3 submitted at X3J3 meeting 123, November 1992. Approved in X3J3 letter ballots 92-182 and 930-016. -------------------------------------------------------------------------------- NUMBER: 000000-b TITLE: Minor edits and corrections to ISO/IEC 1539:1991 (E) KEYWORDS: edits, typos, typographical errors DEFECT TYPE: Erratum STATUS: X3J3 draft response 1. 11.3.3.7, in the second sentence, change "C.11.5" to "C.11.4" 2. Annex A, host association [257:29]; Change "11.2.2" to "12.1.2.2.1". 3. Annex C, first example [273:14]; change "ENDTYPE" to "END TYPE". HISTORY: Submitted at X3J3 meeting 124, Feb 1993, papers 93-036, 93-078, 93-081 -------------------------------------------------------------------------------- NUMBER: 000001 TITLE: Equivalence of expression evaluations KEYWORDS: arithmetic expressions, mathematical equivalence, numeric operations DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: In the following code fragments must the values of D be the same for all legal values of A, B, and C? TEMP=A+B D=C+TEMP and D=C+(A+B) ANSWER: No. Discussion: Section 7.1.7.3 "Evaluation of numeric operations", specifies that processors may evaluate any mathematically equivalent expression and notes, for example, that X+Y can be evaluated as Y+X. Thus, the statements in the question could legitimately be evaluated as: TEMP=A+B D=C+TEMP and D=C+(B+A) Consequently, there is no requirement that the computational result be the same. REFERENCE: ISO/IEC 1539:1991 (E) section 7.1.7.3 EDITS: None. SUBMITTED BY: J.C.Adams 119-JCA-2 (119.002) HISTORY: 119-RL-1 (119.047) 92-044 (S20.120A) 92-104 (Interpretation) Approved as 92-147 at meeting 122 by a vote of 21-1 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000002 TITLE: Default main program name KEYWORDS: main program, default name DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Some implementations of Fortran supply a default PROGRAM statement and program name when it is omitted from the main program. If the default program name conflicts with a global name in the program is the processor standard conforming or not? For example: COMMON /MAIN/ A(1000) READ *,N CALL SUB(N) END SUBROUTINE SUB(N) COMMON /MAIN/ A(1000) DO 100 I=1,N A(I)=0.0 100 CONTINUE END If a processor supplies a PROGRAM statement with a default name MAIN, this will conflict with the common block name MAIN. Is such a processor standard conforming? If the processor supplied a name which could never conflict with a Fortran name, would it be standard conforming? Would the processor in the example above be standard conforming if it used $MAIN, for example, instead of MAIN? ANSWER: This situation is covered by the third paragraph of sections 1.4 and C.11.1 of ISO/IEC 1539:1991. Specifically, section 1.4, item (1), of ISO/IEC 1539:1991 states: A processor conforms to this International Standard if: (1) It executes any standard-conforming program in a manner that fulfills the interpretations herein, subject to any limits that the processor may impose on the size and complexity of the program. If, as in the example provided, the processor supplies a PROGRAM statement with a symbolic name that conflicts with another global name in the program such that the program fails to execute, then the processor does not conform to the standard. The processor may supply a default name which does not conflict with another global name and be standard conforming. REFERENCES: ISO/IEC 1539:1991 (E) sections 1.4 and C.11.1 ANSI X3.9-1978 section 1.4 (page 1-2, lines 25-27) EDITS: None. SUBMITTED BY: A. D. Tait, 117-ADT-5 (117.035), 118-ADT-3 (118.045) HISTORY: 119-ADT-1 (119.012), 119-RL-2 (119.048) X3J3 draft response at meetings 120, 123 -------------------------------------------------------------------------------- NUMBER: 000003 TITLE: Preconnected units and UNIT=* KEYWORDS: preconnected units, identifying a unit, UNIT=* DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Is a processor which associates preconnected units with the files identified by the * in READ and WRITE statements standard conforming? ANSWER: Yes. Discussion: This situation is covered by sections 9.3and 9.4.4.2 of ISO/IEC 1539:1991. These sections state that the asterisk identifies a particular processor-determined unit which is the same for a PRINT statement and a WRITE statement which contains an asterisk. The processor-determined unit is different for a READ statement which contains an asterisk. REFERENCES: ISO/IEC 1539:1991 (E) sections 9.3 and 9.4.4.2 ANSI X3.9-1978 section 12.9.2 EDITS: None. SUBMITTED BY: A. D. Tait, 118-ADT-2 (118.024) HISTORY: Approved as 119-ADT-2 (119.013) at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000004 TITLE: Blanks in format specifications in free form source KEYWORDS: free form source, format specification, blanks DEFECT TYPE: Erratum STATUS: X3J3 draft response QUESTION: Is the following format specification valid in free form source? FORMAT (B N) ANSWER: Yes. Discussion: Sections of Fortran 90 are not consistent. 3.3.1: In free form, blank characters must not appear within lexical tokens other than in a character context. and A blank must be used to separate names, constants, or labels from adjacent keywords, names, constants, ... 10.1.1: Additional blank characters may appear at any point within the format specification, with no effect on the interpretation of the format specification, except within a character string edit descriptor. It can be seen that the text in chapter 3 does not consider edit descriptors. The text will be revised so that: -- edit descriptors are not in the category "keywords" and need not be delimited by blanks. -- blanks are allowed in edit descriptors. Note that the first edit below depends on a change made in item 58 which moves the line from section 3.2.1 to 2.5.2 REFERENCES: ISO/IEC 1539:1991 (E) sections 3.3.1, 10.1.1 EDITS: 1. Section 2.5.2 following the sentence "Keywords appear ... through 12." add the following: "Note that in addition to keywords, upper-case letters may also appear in various other lexical tokens. Examples include operators such as .EQ., edit descriptors such as BN or Iw[.m], and literal constants such as B'digit[digit]...'." 2. Section 3.2 page 19 last sentence [19:35-36] insert ", edit descriptors" following "... , labels". 3. Section 3.3.1, page 22, second paragraph, change "... character context." to "... character context or in a format specification." SUBMITTED BY: J.T. Martin 119-JTM-2 (119.015) HISTORY: 119-JTM-2 119-RPK-1 X3J3/92-044 S20.120, number 4 X3J3/92-075 X3J3/92-145 Draft Interpretation by CIO, withdrawn Approved as X3J3/92-176 at meeting 122 by unanimous consent -------------------------------------------------------------------------------- NUMBER: 000005 TITLE: Namelist output of zero length character strings KEYWORDS: namelist output, zero length, character string DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Given the program: PROGRAM P CHARACTER*0 CH NAMELIST/OUT/CH OPEN(UNIT=8,DELIM='NONE') WRITE(UNIT=8,NML=OUT) END The namelist output record would be: &OUT CH= / Does not this conflict with the statement in section 10.9.2.2 that: A null value is not produced by namelist formatting. ANSWER: No. Discussion: Although the output produced by this program appears to contain a null value (to namelist input), actually a zero-length character string was written by the namelist output statement. Note that this is different from a null value (section 10.9.1.4) which has no meaning on output. The statement: A null value is not produced by namelist formatting. indicates that since all namelist group objects have a value, that value (in this case a zero-length string) is output. REFERENCES: ISO/IEC 1539:1991 (E) sections 10.9.1.4, & 10.9.2.2, EDITS: None. SUBMITTED BY: J. T. Martin, 119-JTM-3 (119.016) HISTORY: 119-RPK-2 (119.064), & 119-JTM-6 (119.041) Approved in ballot 92-182 -------------------------------------------------------------------------------- NUMBER: 000006 TITLE: Procedure specifications in a scoping unit KEYWORDS: procedure specification, scoping unit, interface body DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 QUESTION: Which of the following procedure related specifications may jointly occur within a scoping unit? a. An interface body for the procedure and the appearance of the procedure name in a type statement b. A module procedure definition and the appearance of the procedure name in a type statement c. A module procedure definition and an interface body for the procedure d. An interface body for the procedure and the appearance of the procedure name in an EXTERNAL statement ANSWER: None of the above. Discussion: Section 5.1 states the generally applicable constraint: An entity must not be given explicitly any attribute more than once in a scoping unit. An interface body provides an explicit interface to the procedure. This interface includes the characteristics of the procedure: these characteristics include, for a function, the type of the value returned. Thus, the interface body is an explicit declaration of the function result type, and this must not also be declared in a type statement (a). Similarly, a module procedure definition includes a declaration of its interface, so its presence precludes the presence of either a type statement declaring function result (b) or an interface body declaring its characteristics (c). The case of the module procedure definition and interface body is also covered by the statement in 12.3.2.1 that A procedure must not have more than one explicit specific interface in a given scoping unit. and by the fact that the statement (also in 12.3.2.1): An interface body in an interface block specifies an explicit interface for an existing external procedure or a dummy procedure, does not include module procedures. The latter statement in conjunction with the sentence which follows it also implies that the interface body declares the same attributes as the EXTERNAL statement, so this combination is similarly prohibited (d). This last case may be less than obvious. This deficiency is remedied by an edit to provide an explicit prohibition to cover this case. REFERENCES: ISO/IEC 1539:1991 (E) sections 5.1, & 12.3.2.1 EDIT: At the end of the fourth paragraph following R1207 in 12.3.2.2, add A name that appears in an EXTERNAL statement must not also appear as a specific procedure name in an interface block in the scoping unit. SUBMITTED BY: S. M. Lammers, 119-SML-1 (119.019) items 1 through 4 HISTORY: Approved as X3J3/92-170 at meeting 122 by unanimous consent Revised following letter ballot at meeting 123, in 92-312. Revision approved by unanimous consent at meeting 123. -------------------------------------------------------------------------------- NUMBER: 000007 TITLE: Duplicate module procedures in interface blocks KEYWORDS: module procedure name, interface block, generic DEFECT TYPE: Erratum STATUS: X3J3 consideration in progress QUESTION: May a module procedure name be referenced on more than one MODULE PROCEDURE statement for a given generic name in a scoping unit, either in a single interface block or in multiple interface blocks specifying that generic name? ANSWER: No. Discussion: The standard routinely disallows such redundant specifications within a scoping unit. The prohibition for this case was inadvertently overlooked. This deficiency is remedied by the supplied edit. Example: INTERFACE INT_1 MODULE PROCEDURE FOO, FOO ! second FOO is illegal MODULE PROCEDURE FOO1 MODULE PROCEDURE FOO1 ! FOO1 is illegal here END INTERFACE INT_1 INTERFACE INT_2 MODULE PROCEDURE FOO2A, FOO2B END INTERFACE INT_2 INTERFACE INT_2 MODULE PROCEDURE FOO2B, FOO2C ! FOO2B is illegal here END INTERFACE INT_2 Note, however, that if the two interface blocks for INT_2 were placed in separate modules, the second appearance of FOO2B would have been permitted, as would a scoping unit which used both modules. For example: MODULE MOD1 USE SOME_OTHER_MODULE ! the source of FOO2B INTERFACE INT_2 MODULE PROCEDURE FOO2A, FOO2B END INTERFACE INT_2 ... END MODULE MOD1 MODULE MOD2 USE SOME_OTHER_MODULE ! the source of FOO2B INTERFACE INT_2 MODULE PROCEDURE FOO2B, FOO2C !FOO2B is legal here END INTERFACE INT_2 ... END MODULE MOD2 The following USE statements would be allowed: USE MOD1 USE MOD2 ! no problem using both modules here REFERENCES: ISO/IEC 1539:1991(E) Section 12.3.2.1 EDIT: The following additional constraint should be added to section 12.3.2.1: Constraint: A in a must not be one which previously had been established to be associated with the of the in which it appears, either by a previous appearance in an or by use or host association. SUBMITTED BY: S.M.Lammers, 119-SML-1 (119.019) HISTORY: Original interpretation was 120-MBSH-4A (120.096A) Modified based on X3J3/92-039 arguments. Adopted because this interpretation is more consistent with requirements concerning duplication of other specification statements in a given scoping unit. Interpretation modification presented in X3J3/92-095 Commented on by N786A from WG5 Victoria meeting in item marked 1167/36+. Approved as X3J3/92-155A at meeting 122 by unanimous consent. -------------------------------------------------------------------------------- NUMBER: 000008 TITLE: Module procedure name in multiple interface blocks KEYWORDS: module procedure name, interface block DEFECT TYPE: Interpretation STATUS: subsumed by item 7 QUESTION: May a module procedure name be referred to on more than one MODULE PROCEDURE statement in multiple interface blocks specifying the same generic name? ANSWER: REFERENCES: 120-MBSH-4A (120.096A) EDITS: None. SUBMITTED BY: S. M. Lammers, 119-SML-1 (119.019) item 5, question 4 HISTORY: Interpretation questioned in X3J3/92-039 Resolved by X3J3/92-155A (approved by unanimous consent as the response to NUMBER 000007) -------------------------------------------------------------------------------- NUMBER: 000009 TITLE: Generic interfaces with the same name in a program KEYWORDS: generic, interface DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: May two generic interfaces of the same name be accessed by use association in the same scoping unit? Discussion: Can the following program fragment be part of a standard conforming program? MODULE MOD1 INTERFACE INT1 ... END INTERFACE END MODULE MOD1 MODULE MOD2 INTERFACE INT1 ... END INTERFACE ... END MODULE MOD2 PROGRAM EXAMPLE_1 USE MOD1 USE MOD2 ANSWER: Yes. As can be seen in section 11.3.2: If two or more generic interfaces that are accessible in a scoping unit ... they are interpreted as a single generic interface. REFERENCES: ISO/IEC 1539:1991 (E) section 11.3.2 (paragraph 5 after last constraint). EDITS: None. SUBMITTED BY: L. R. Rolison, 120-LRR-4 (120.029), question 1 HISTORY: Proposed as 120-MBSH-1A (120.084A) at meeting 120 Questioned in X3J3/92-040 (121-JKR-8) Approved as X3J3/92-099 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000010 TITLE: Generic interfaces with the same name in a scoping unit KEYWORDS: generic, interface, scoping unit DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Are two generic interfaces with the same name allowed in the same scoping unit? For example can this program fragment be part of a standard conforming program? PROGRAM EXAMPLE_1 INTERFACE INT1 ... END INTERFACE ... INTERFACE INT1 ... END INTERFACE ANSWER: Yes. As can be seen in section 11.3.2: If two or more generic interfaces that are accessible in a scoping unit ... they are interpreted as a single generic interface. REFERENCES: 120-MBSH-1A (120.084A) EDITS: None. SUBMITTED BY: L. R. Rolison, 120-LRR-4 (120.029), question 2 HISTORY: Proposed as 120-MBSH-1A (120.084A) at meeting 120 Questioned in X3J3/92-040 (121-JKR-8) Approved as X3J3/92-100 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000011 TITLE: Multiple accessible defined assignment interfaces KEYWORDS: interfaces, defined assignment DEFECT TYPE: Interpretation STATUS: X3J3 draft response QUESTION: Consider the following excerpts from section 14.1.2 [241]: Excerpt (a): Within a scoping unit, entities in the following classes: (1) Named variables that are not statement entities (14.1.3),..., generic identifiers, derived types, and namelist group names ... are local entities of that scoping unit. Excerpt (b): Within a scoping unit, a name that identifies a local entity of one class must not be used to identify another local entity of the same class, except in the case of generic names (12.3.2.1). A name that identifies a local entity of one class may be used to identify a local entity of another class. The standard defines both the terms "generic identifier" and "generic name" in section 12.3.2.1 [168]. "Generic identifier" is defined to encompass the three concepts of a generic name, a defined operator, or an equals symbol on a generic specification. "Generic name" refers to the BNF term for the name that may appear on an interface specification. The text from section 14 cited in (a) uses the term "Generic identifier" but the text cited in (b) uses the term "generic name". Is the intent behind the choice of different words in section 14 to prohibit a program from containing multiple interface blocks for the same operator and multiple accessible defined assignment interfaces? ANSWER: No. Discussion: Section 11.3.2 states: "If two or more generic interfaces that are accessible in a scoping unit have the same name, the same operator, or are both assignments, they are interpreted as a single generic interface" Thus, two or more interfaces that have the same name, the same operator, or are assignment interfaces are not only permitted but the interfaces are considered to be a single generic interface. The text cited in (b) above was specifically discussing "names" and hence "generic names" were singled out. The text cited in (a) above was discussing all entities that are local to a scoping unit, not just named entities. REFERENCES: ISO/IEC 1539:1991 (E) sections 11.3.2, 12.3.2.1, & 14.1.2 EDITS: None. SUBMITTED BY: L. R. Rolison, 120-LRR-4 (120.029), question 3 LAST SIGNIFICANT CHANGE: before meeting 123 000011 HISTORY: Originally passed as 120-MBSH-1A (120.084A) Revised in response to ballot comments at meeting 123, but no vote taken - withheld for further consideration Slight rewording for clarification in 93-029 Approved by unanimous consent at meeting 124. -------------------------------------------------------------------------------- NUMBER: 000012 TITLE: Type of a named constant when there is IMPLICIT mapping KEYWORDS: named constant, parameter statement, IMPLICIT mapping, internal procedure, host DEFECT TYPE: Interpretation STATUS: X3J3 draft response QUESTION: 1. Is the following code fragment valid Fortran 90? PARAMETER (A=1) IMPLICIT INTEGER (A) 2. Is the following code fragment valid? PROGRAM MAIN IMPLICIT INTEGER (Z) ! Z is mapped to type integer ... CONTAINS SUBROUTINE INNER PARAMETER (ZERO = (0.0, 0.0)) ! Name starts with Z IMPLICIT COMPLEX (Z) ! Z is mapped to type complex ... END SUBROUTINE END PROGRAM ANSWER: No in both cases. Discussion: In any scoping unit there is only one (possibly null) implicit typing map (5.3). Section 5.2.10 states that a named constant either must have its type, shape, and any type parameters specified previously or determined by the implicit typing rules currently in effect for the scoping unit. The word "currently" is intended to mean that any IMPLICIT statement which would affect the named constant must occur previously in the scoping unit. A subsequent IMPLICIT statement may specify the type of a named constant appearing in a PARAMETER statement, but in that case, it must confirm the type of the named constant. REFERENCES: ISO/IEC 1539:1991 (E) sections 5.2.10 & 5.3 EDITS: None. SUBMITTED BY: (Question 1) J. T. Martin, 120-JTM-9 (120.046), question 3 (Question 2) J. L. Steidel, 120-JLS-2 (120.020) case 3 LAST SIGNIFICANT CHANGE: 1993-02-11 000012 HISTORY: 120-LJM-5 (120-093) X3J3/92-172, as modified, passed at meeting 122 Items 000012 and 000023 combined following letter ballot as X3J3/93-73r2 and adopted at meeting 124 by unanimous consent -------------------------------------------------------------------------------- NUMBER: 000013 TITLE: Implicit mapping of an interface block KEYWORDS: implicit mapping, interface block DEFECT TYPE: Amendment STATUS: X3J3 approved; ready for WG5 QUESTION: Is the implicit mapping of the host inherited by an interface block? ANSWER: No. Discussion: Unlike other scoping units that are contained within a host scoping unit, an interface body does not access entities from its host by host association. This was intended to allow the initial statements of an external procedure to be used without modification in an interface body describing that procedure. The possibility of there being different implicit mappings was inadvertently overlooked. If not corrected, this would mean that: FUNCTION F(X,I) F = X**I/I END FUNCTION F would be properly described by: INTERFACE FUNCTION F(X,I) END FUNCTION F END INTERFACE if the interface block is contained in a host with default implicit mapping, but not in one containing the statement: IMPLICIT INTEGER (A-Z) The default implicit mapping in an interface body is made consistent with that in an external procedure by the supplied edit. REFERENCES: ISO/IEC 1539:1991 (E) sections 2.2 & 5.3 EDITS: 1. In Section 5.3 in the second paragraph after the constraints, in the phrase: "the default is the mapping ...", after "default" add "for a program unit or an interface body is default integer if the letter is I,J, ... , or N and default real otherwise, and the default for an internal or module procedure". Delete "A program ... O-Z)" 2. In the example in section 5.3 for FUNCTION FUN in the interface block the comment should be changed from: ! All data entities must ! be declared explicitly to ! Not all entities need be ! declared explicitly 3. In the first example in section 5.3, change "INTEGER FUN, I" to be "INTEGER FUN". SUBMITTED BY: L.R.Rolison 120-LRR-3 (120.028) HISTORY: Draft response in 92-102A, questioned in N786A of the Victoria WG5 meeting. Revised edit approved as 92-154A at meeting 122 by a vote of 21-1. Edit approved in 92-267r at meeting 123. -------------------------------------------------------------------------------- NUMBER: 000014 TITLE: Interface for a character function with a variable length result KEYWORDS: character function, variable length, interface DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Given a definition of an external function such as the following where the function result is variable length, must the characteristics of the function be described by an interface block accessible to the calling scoping unit? FUNCTION F(I) INTEGER I,N CHARACTER*(N) F COMMON /B/ N ... END ANSWER: Yes. Discussion: Section 12.3.1.1 states: A procedure must have an explicit interface if ... (2) The procedure has ... (d) A result whose length type parameter value is neither assumed nor constant." That provision applies to this function. Section 12.3.1 indicates that an external procedure has an explicit interface only if an interface block is provided. REFERENCES: ISO/IEC 1539:1991 (E) section 12.3.1 & 12.3.1.1 EDITS: None. SUBMITTED BY: L. R. Rolison, 119-LRR-1, part II HISTORY: 119-KWH-3A (119-70A) Approved in ballot 92-182 -------------------------------------------------------------------------------- NUMBER: 000015 TITLE: Error in fourth constraint for R429 KEYWORDS: constraints, R429, DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 QUESTION: Should the fourth constraint for R429 also apply to a in the ? ANSWER: Yes. Discussion: A nonconstant specification expression specifies an automatic character object that may be declared only in a procedure or procedure interface. It was never the intention to permit the specification of automatic objects in type definitions. The fifth constraint for R429 prohibits the only other automatic object, an automatic array. The length specified in a character should be similarly restricted. REFERENCES: ISO/IEC 1539:1991 (E) sections 4.4.1, 5.1, 5.1.1.5, & 7.1.6.2 EDIT: Replace the fourth constraint after R429 with: The character length specified by the in a or the in a (5.1, 5.1.1.5) must be a constant specification expression (7.1.6.2). SUBMITTED BY: J. T. Martin, 119-JTM-7 (119.042) part 1 HISTORY: 119-JTM-11 (119.054) Approved at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000016 TITLE: Character length specification KEYWORDS: character length specification, , R508 DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 QUESTION: Is there a similar interaction between a specified in both a and a as there is between a specified in both an and a ? ANSWER: Yes. Discussion: It was intended that character declarations in type definitions be symmetrical with character object declarations. REFERENCES: ISO/IEC 1539:1991 (E) sections 4.4.1, 5.1, & 5.1.1.5 EDIT: Replace the text following the constraints for R508 with: The in a CHARACTER and the * in an or in a of a type definition specify character length. The * in an or specifies an individual length and overrides the length specified in the , if any. If a * is not specified in an or , the or specified in the is the character length. If the length is not specified in a or a * , the length is 1. SUBMITTED BY: J. T. Martin, 119-JTM-7 (119.042) part 2 HISTORY: 119-JTM-12A (119.055A) Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000017 TITLE: Creation of entities by local names in rename-list KEYWORDS: local names, data entity DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Does a local-name on a rename-list create a new data-entity? For example, is the local name Q a new data entity or is Q a rename of the entity P in the following example? MODULE UTIL PUBLIC P CONTAINS SUBROUTINE P END END MODULE UTIL MODULE MID1 USE UTIL, Q=>P ! Is Q a new data entity or merely a ! renaming of P? PUBLIC Q END MODULE MID1 MODULE MID2 USE UTIL, Q=>P ! Another renaming of the same entity P? PUBLIC Q END MODULE MID2 SUBROUTINE ENDUSER USE MID1 USE MID2 CALL Q ! Is this legal? Does it refer to P? END SUBROUTINE ENDUSER ANSWER: Multiple renames of the same do not constitute separate entities. Subsequent appearances of the refer to the single entity. In the example, Q does not create a new entity. Thus "CALL Q" in the subroutine is legal. Discussion: In section 11.3.2 [158:15-16], the standard states that a local name in the rename list is a "local name for the entity" which is intended to mean that a new entity is not created. REFERENCES: ISO/IEC 1539:1991 (E) section 11.3.2 EDITS: None. SUBMITTED BY: E. A. Johnson, 119-EAJ-1 (119.057) HISTORY: 120-LF-1 (120.089) Response proposed in 92-296, approved by unanimous consent at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000018 TITLE: Valid characters for indicating fixed form statement continuation KEYWORDS: fixed form source, statement continuation, character set DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Line 3 of the first paragraph of 3.3.2.3 states: If character position 6 contains any character other than blank or zero, character positions 7-72 of this line constitute a continuation of the preceding noncomment line. Can the character in character position 6 be a character outside the Fortran character set (for example, newline)? ANSWER: No. Section 3.1.5 specifies where additional characters not in the Fortran character set may be used. REFERENCES: ISO/IEC 1539:1991 (E) sections 3.1 & 3.3.2.3 EDITS: None. SUBMITTED BY: J. C. Adams, 120-JCA-13 (120.013) HISTORY: Originally proposed as 120-RL-1 (120.058) Approved as X3J3/92-105 at meeting 121 by a vote of 20-0 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000019 TITLE: Correctness of last example in section 4.5 KEYWORDS: DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Is the order of the coordinates correct in the last example of 4.5, considering the type definition of LINE in 4.4.1? ANSWER: Yes. Discussion: The line is drawn between points X and Y where the coordinates of X are X1 and X2 and the coordinates of Y are Y1 and Y2. Admittedly, this is not the traditional naming scheme for the coordinates of two points that determine a line. Traditionally, a line would be drawn between points 1 and 2 where each point had an X and Y coordinate, but it is merely a matter of naming. REFERENCES: ISO/IEC 1539:1991 (E) sections 4.4.1 and 4.5 EDITS: None. SUBMITTED BY: J. C. Adams, 120-JCA-14 (120.014) HISTORY: 120-JTM-10 (120.057) Approved at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000020 TITLE: References to the same derived type by different names KEYWORDS: derived types, derived type definition DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: How does changing the name by which a derived type is referenced affect its use? For example, is the code below standard conforming and, if so, which specific procedure is invoked by the reference to GEN? MODULE MOD TYPE T1 SEQUENCE INTEGER I,J END TYPE T1 END MODULE MOD USE MOD, T2=>T1 TYPE (T2) X INTERFACE GEN SUBROUTINE SPEC1(A1) TYPE T1 SEQUENCE INTEGER I,J END TYPE T1 TYPE (T1) A1 END SUBROUTINE SPEC1 SUBROUTINE SPEC2(A2) TYPE T2 SEQUENCE INTEGER I,J END TYPE T2 TYPE (T2) A2 END SUBROUTINE SPEC2 END INTERFACE GEN INTERFACE SUBROUTINE SPEC3(A3) USE MOD TYPE (T1) A3 END SUBROUTINE SPEC3 END INTERFACE ... CALL SPEC3(X) CALL GEN(X) END ANSWER: Yes, the code is standard conforming. The reference to GEN should invoke the specific procedure SPEC1. Discussion: The rules governing these questions are stated in 4.4.2. Two alternatives are provide for entities to have the same type. The first alternative applies to the reference to SPEC3: Two data entities have the same type if they are declared with reference to the same derived-type definition. In this case, both the actual argument X and the dummy argument A3 are declared with reference to the type definition T1 in MOD. The second alternative applies to the analysis of the procedures in generic interface GEN: Data entities in different scoping units also have the same type if they are declared with reference to different derived-type definitions that have the same name, have the SEQUENCE property, and have structure components that do not have PRIVATE accessibility and agree in order, name, and attributes. The type definition in SPEC1 agrees in all these respects with the type definition in MOD, so X and A1 have the same type. The definition in SPEC2 has a different name, so X and A2 have different types. Thus the reference to GEN invokes SPEC1. Note the fact that type T1 in MOD was accessible using a different name in the main program was irrelevant in both these analyses. REFERENCES: ISO/IEC 1539:1991 (E) section 4.4.2 EDITS: None. SUBMITTED BY: J. C. Adams, 120-JCA-15 (120.015), 120-JLS-5 (120.023) HISTORY: 120-KWH-1 (120.078) Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000021 TITLE: References to different derived types with the same name KEYWORDS: derived type definition DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: In the following example, to which type T1 does the FUNCTION statement refer? SUBROUTINE FRED TYPE T1 REAL :: X,Y END TYPE ... CONTAINS TYPE (T1) FUNCTION WILMA() TYPE T1 INTEGER I,J END TYPE ... END FUNCTION WILMA END SUBROUTINE FRED ANSWER: It is the type T1 defined in WILMA. Discussion: Section 12.1.2.2.1 states: A name that appears in the scoping unit as (1) a in a ... is the name of a local entity and any entity of the host that has this as its nongeneric name is inaccessible. Therefore, the type T1 defined in FRED is not accessible in WILMA and cannot be the type referenced in the function statement. Note that it is impossible to reference WILMA because its type T1 is not known outside WILMA. Were the SEQUENCE attribute added to the definition of T1 and the component types of the two T1 declarations the same so that the two T1 declarations met the requirements of being the "same derived types" (4.4.2), then a reference to WILMA would be possible. REFERENCES: ISO/IEC 1539:1991 (E) sections 4.4.2, 5.3, 12.1.2.2.1, 12.5.2.2 EDITS: None. SUBMITTED BY: J. L. Steidel, 120-JLS-1 (120.019) HISTORY: Originally answered in 120-KWH-2A (120.083A) Modification requested by X3J3/92-037 (121-JKR-5) Discussed in X3J3/92-049 (121-ADT-9) p7 & X3J3/92-050 (121-ADT-10) p4 Approved as X3J3/92-080 at meeting 121 by a vote of 20-0 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000022 TITLE: Use of derived type name in host scoping unit KEYWORDS: derived type, , host scoping unit, internal procedure DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Consider the following code fragment: SUBROUTINE HOST TYPE T1 INTEGER I,J END TYPE ... CONTAINS FUNCTION CONTAINED () IMPLICIT TYPE (T1) C TYPE T1 INTEGER I,J END TYPE END FUNCTION CONTAINED END SUBROUTINE HOST Is it standard conforming to redefine T1 following the IMPLICIT statement that maps to T1? Does the fact that the function name begins with the letter being mapped have any significance in that determination? If an argument named C were added to the dummy argument list of CONTAINED, would that have any effect? ANSWER: The redefinition is permitted. The fact that the type of CONTAINED is implicitly mapped has no significance. The inclusion of an argument named C would have no significance in the redefinition of T1, but would render the program unit nonstandard conforming for other reasons. Discussion: Section 12.1.2.2.1 states: A name that appears in the scoping unit as (1) a in a ... is the name of a local entity and any entity of the host that has this as its nongeneric name is inaccessible. Therefore the type T1 of HOST is inaccessible in the scoping unit of CONTAINED. The function statement is part of the scoping unit of CONTAINED since R1215 says that a function statement is part of its subprogram and it is not excluded in item (3) of the definition of a scoping unit in section 2.2. It follows that the type must be the local type. Note that although this is legal, it is not very useful. Since the type of CONTAINED is local to CONTAINED, CONTAINED cannot be referenced. To be useful, when the type of a procedure is of nonsequence derived type, the derived-type definition must be accessible in the scoping unit of the procedure by either host association or use association. If a dummy argument is of nonsequence derived type, this principle is mandated in 5.1.1.7: A declaration for a nonsequence derived-type dummy argument must specify a derived type that is accessed by use association or host association because the same definition must be used to declare both the actual and dummy arguments to ensure that both are of the same derived type. This restriction does not apply to arguments of sequence type (4.4.2). If the SEQUENCE attribute were present, and the types were the same as mandated by 4.4.2, then the program would be legal and the function with the dummy argument could be referenced in the host. REFERENCES: ISO/IEC 1539:1991 (E) sections 2.2, 4.4.2, 12.1.2.2.1, 12.5.2.2 EDITS: None. SUBMITTED BY: J. L. Steidel, 120-JLS-2 (120.020) cases 1 and 2 HISTORY: Proposed as 120-RPK-1A (120.092A) Questioned by X3J3/92-038 (121-JKR-6) Approved as X3J3/92-097 at meeting 121 by a vote of 20-0 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000023 TITLE: Type of a named constant in an internal procedure KEYWORDS: named constant, internal procedure, parameter statement, host DEFECT TYPE: Interpretation STATUS: subsumed by item 12 NOTE: THIS ITEM HAS BEEN SUBSUMED BY ITEM 12 QUESTION: Given that an implicit mapping is established for a letter in a host scoping unit. An internal procedure of that host scoping unit contains a PARAMETER statement which defines a named constant whose name begins with the letter in question. This is followed by an IMPLICIT statement which defines a different mapping for this letter. Is this legal? ANSWER: No. Discussion: In any scoping unit there is only one (possibly null) implicit typing map (5.3). Thus, in the statement (5.2.10), The named constant must have its type, shape, and any type parameters specified either by a previous occurrence in a type declaration statement in the same scoping unit, or by the implicit typing rules currently in effect for the scoping unit. the implicit mapping currently in effect for a scoping unit is affected by all IMPLICIT statements in the scoping unit even those appearing subsequent to PARAMETER statements. A subsequent IMPLICIT statement may specify the type of a named constant appearing in a PARAMETER statement, but in that case, it must confirm the type of the named constant. REFERENCES: ISO/IEC 1539:1991 (E) sections 5.2.10 and 5.3 EDITS: None. SUBMITTED BY: J. L. Steidel, 120-JLS-2 (120.020) case 3 HISTORY: 120-LJM-5 (120-093) Response in X3J3/92-172, must be identical to response to NUMBER 000012 -------------------------------------------------------------------------------- NUMBER: 000024 TITLE: IMPLICIT NONE and the type of a function result KEYWORDS: IMPLICIT NONE, internal procedure, function result type DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: An internal function contains an IMPLICIT NONE statement and does not contain a type specification for the function result. Is this legal? ANSWER: No. Discussion: 12.5.2.2 states if the type of the function result is not explicitly specified: ... it is determined by the implicit typing rules in force within the function subprogram. As the null mapping has been specified for all letters within the internal function, the type of the result must be explicitly specified within the function. REFERENCES: ISO/IEC 1539:1991 (E) section 12.5.2.2 EDITS: None. SUBMITTED BY: J. L. Steidel, 120-JLS-2 (120.020) case 4 HISTORY: 120-RPK-3A (120-094A) Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000025 TITLE: Resolution of internal procedure references KEYWORDS: host, internal procedure, IMPLICIT NONE, procedure references DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: A host scoping unit contains two internal functions, F1 and F2. If F1 contains an IMPLICIT NONE and references F2, must F1 contain an explicit type declaration for F2? ANSWER: No. In fact if it did contain an explicit type specification for F2, F1 would be referencing an external function F2 and not the internal one contained in its host scoping unit. Discussion: 12.3.1 states: If a procedure is accessible in a scoping unit, its interface is either explicit or implicit in that scoping unit. The interface of an internal procedure ... is always explicit in such a scoping unit. Therefore, the interface of F2 is explicit in the host scoping unit. The function F2 is established to be specific in the host scoping unit by (2)(b) of 14.1.2.4 which states that a procedure name is specific: if that scoping unit contains a ... an internal procedure ... with that name; Furthermore, the function name F2 is established to be specific in the internal procedure F1 by (2)(f) of 14.1.2.4 which states that a name is specific: if that scoping unit contains no declarations of that name, that scoping unit is contained in the host scoping unit, and that name is established to be specific in the host scoping unit. As F2 is established to be specific within F1 by the above, 14.1.2.4.2 indicates that the F2 referenced by F1 is to the internal function F2 contained in the host scoping unit. Note that if F1 contains an explicit declaration for F2, by the rules of 14.1.2.4, F2 is not established to be either generic or specific in F1. Therefore, to resolve the procedure reference, the rules in 14.1.2.4.3 apply and the reference to F2 within F1 is to an external procedure with the name F2. REFERENCES: ISO/IEC 1539:1991 (E) section 12.3.1, 14.1.2.4, 14.1.2.4.2, 14.1.2.4.3 EDITS: None. SUBMITTED BY: J. L. Steidel, 120-JLS-2 (120.020) case 5 HISTORY: Proposed meeting 120 120-RPK-4 (120-095) Questioned X3J3/92-050 (121-ADT-10) page 4 X3J3 draft response at meeting 121 Approved in ballot 92-182 -------------------------------------------------------------------------------- NUMBER: 000026 TITLE: Bounds of array expressions KEYWORDS: lower bound, upper bound, array expression DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Is it the intent of the standard to state that the lower bound of an array expression is always 1, and the upper bound is equal to the number of elements in a given dimension, for all dimensions? That is, given: REAL,TARGET,DIMENSION(5:10) :: A REAL,DIMENSION(:),POINTER :: P P => A(5:10) PRINT *, LBOUND (P) Does the PRINT statement result in the value 1 being written? Previous versions of the draft standard stated that the lower bounds of array expressions were 1. Where are those words in the standard? Reading chapter 7 indicates that an expression may be simply a primary, and a primary may be an array variable. Question 1: Does this mean, given the above declarations that P => A PRINT *, LBOUND (P) would also result in the value 1 being written (since A is an array expression), or should this print the value 5? Question 2: Is the intent of the standard that given an array with a declared lower bound other than one, the following relational expressions are false? REAL,TARGET,DIMENSION(5:10) :: A REAL,DIMENSION(:),POINTER :: P1, P2 INTERFACE SUBROUTINE FRED (X, Y) REAL,INTENT (IN),DIMENSION(:) :: X, Y END SUBROUTINE END INTERFACE P1 => A P2 => A(:) PRINT *, LBOUND (A) .EQ. LBOUND (A(:)) PRINT *, LBOUND (P1).EQ. LBOUND (P2) CALL FRED (A, A(:)) END SUBROUTINE FRED (X, Y) REAL,INTENT(IN),DIMENSION(:) :: X, Y PRINT *, LBOUND (X) .EQ. LBOUND (Y) END SUBROUTINE Question 3: If the above three PRINT statements result in the values .FALSE., in what cases does the appearance of an array name constitute an array (carrying with it its dimension attributes), and in what cases does it constitute an expression (implying the lower bound is one)? That is, in cases where bounds information may be transmitted (pointer assignment and actual argument association at subprogram calls), does the appearance of an array or pointer name *without* a subscript following cause the bounds of the array or pointer to be transmitted, and does the appearance of the same array or pointer name followed by a subscript triplet with no lower or upper bound or stride (i.e. (:,:)) constitute an expression with a lower bound of one transmitted? In summary: (a) What are the bounds of an array pointer which has been pointer assigned to an array section? (b) What are the bounds of an array pointer which has been pointer assigned to a whole array? (c) What are the bounds of an assumed-shape array? (d) What are the bounds of a pointer dummy argument? ANSWER: The output of the three example programs would be: 1) 1 2) 5 3) F F T (a) Each lower bound is 1, and each upper bound is the size of the corresponding dimension of the array section. (b) The declared bounds of the whole array. (c) Each lower bound is the declared lower bound of the assumed-shape corresponding dimension of the array section plus the lower bound minus one. (d) The bounds of the target associated with the pointer actual argument. Discussion: Cases (a) and (b) are determined from the statements (5.1.2.4.3), ...The lower bound of each dimension is the result of the LBOUND function (13.13.52) applied to the corresponding dimension of the target. The upper bound of each dimension is the result of the UBOUND function (13.13.111) applied to the corresponding dimension of the target. Case (c) is described in section 5.1.2.4.2. Case (d) is determined from these statements in conjunction with the statement, "If the actual argument is currently associated, the dummy argument becomes associated with the same target" (12.4.1.1). REFERENCES: ISO/IEC 1539:1991 (E) sections 5.1.2.4.2, 5.1.2.4.3, 12.4.1.1, 13.13.52, & 13.13.111 EDITS: None. SUBMITTED BY: J. L. Steidel, 120-JLS-3 (120.021) HISTORY: 120-LJM-4A (120.088A) Approved at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000027 TITLE: Requirements for pointers and target association KEYWORDS: POINTER attribute, TARGET attribute, pointer association DEFECT TYPE: Interpretation STATUS: X3J3 draft response QUESTION: If PTR has the POINTER attribute and TGT has the TARGET or POINTER attribute, under which of the following other conditions are PTR and TGT considered to be pointer associated, i.e., under which of the following conditions does ASSOCIATED(PTR, TGT) return a value of .TRUE.: a) PTR and TGT have different types? b) PTR and TGT have different type parameters? c) PTR and TGT have different ranks? d) PTR and TGT have different sizes? e) PTR and TGT have different shapes? f) PTR and TGT have different bounds? g) PTR and TGT refer to the same set of array elements/storage units, but not in the same array element order? h) PTR and TGT have array elements/storage units whose range of memory addresses overlap, but they have no identical array elements/storage units? i) PTR and TGT have at least one but not all identical array elements/storage units and all the identical elements have the same subscript order value in both PTR and TGT? j) PTR and TGT have at least one but not all identical array elements/storage units but not all the identical elements have the same subscript order value in both PTR and TGT? ANSWER: Except under conditions where the value of ASSOCIATED is undefined, any of the above conditions except for f) are sufficient for ASSOCIATED (PTR, TGT) to return a value of .false.. In determining whether a pointer and a target are associated, the bounds are not relevant, but the extents are. The extents of each dimension of PTR and TGT must be the same, thus their shapes must match which is covered by condition (e). Discussion: There are only three means by which a pointer may become pointer associated: via the ALLOCATE statement (6.3.1), via pointer assignment (7.5.2), or via argument association (12.4.1.1). In an ALLOCATE statement, the object created inherits its type, type parameters, rank, shape, size and bounds from those declared for, or specified with, the pointer name. In a pointer assignment, the type, type parameters, and rank of the pointer and target must conform, and the shape and size of the target determine those of the pointer. When a pointer actual argument is passed to a pointer dummy argument, the pointer dummy argument becomes pointer associated with the same target as the pointer actual argument. In all three of these cases, array elements of the pointer and the target correspond with one another in array element order. Thus, since there is no other way for two objects to become pointer associated, all these properties must be the same. The result of the two-argument form of ASSOCIATED is undefined if either argument is a pointer that is currently associated with a target that is zero sized, or the second argument is not a pointer but is zero sized. Note that other forms of association (name association and storage association) are distinct from, and orthogonal to, pointer association (14.6). REFERENCES: ISO/IEC 1539:1991 (E) 5.1.2.4.3, 6.3.1, 7.5.2, 12.4.1.1, & 14.6 EDITS: None. SUBMITTED BY: J. L. Steidel, 120-JLS-4 (120.022) LAST SIGNIFICANT CHANGE: 1993-02-12 000027 HISTORY: 120-LJM-3A (120.081A) Original response proposed at meeting 121 Questioned in X3J3/92-061 (121-ADT-9) p9 & X3J3/92-061 (121-ADT-13) item 27 Approved as X3J3/92-093A at meeting 121 Approval rescinded at meeting 123 (uc) Revised response in X3J3/93-099r1 adopted at meeting 124 by a vote of (15-2) -------------------------------------------------------------------------------- NUMBER: 000028 TITLE: Precedence of use or host association KEYWORDS: use association, host association DEFECT TYPE: Interpretation STATUS: X3J3 consideration in progress QUESTION: Is an implicitly typed entity with the same name as a host or use associated entity a reference to a local entity or the host or use associated entity? ANSWER: It is a reference to the host or use associated entity. 5.3, in the fourth paragraph beginning "Any data entity ...", states that use or host association takes precedence over implicit typing. REFERENCES: ISO/IEC 1539:1991 (E) section 5.3 EDITS: None. SUBMITTED BY: J. L. Steidel, 120-JLS-6 (120.024)) HISTORY: 120-RL-3 (120.060) -------------------------------------------------------------------------------- NUMBER: 000029 TITLE: Class of a defined operator KEYWORDS: defined operator, generic identifier, classes of local entities DEFECT TYPE: Interpretation STATUS: X3J3 draft response QUESTION: Is a defined operator name a generic identifier? Thus is it illegal for a defined operator name to be the same as another class 1 entity within the same scoping unit (as defined in 14.1.2)? ANSWER: No. The word 'name' is used in a technical way throughout the standard. It is defined by R304 on page 19 and is not used in the definition of defined-operator by R311, R704, R724 on page 21. A defined operator is a generic identifier (see page 168, lines 12 and 11 from the bottom), but it does not have a name. Therefore the rule in 14.1.2 does not apply. This is analogous to the situation for intrinsic operators, where it is permissible to have local variables named AND, OR, etc. REFERENCES: ISO/IEC 1539:1991 (E) sections 3.2.2, 3.2.4, 12.3.2.1, 14.1.2 EDIT: None. SUBMITTED BY: J. L. Steidel, 120-JLS-7 (120.025) HISTORY: 120-RL-2A (120.059A) 121-LRR-8 Opposed to 121-JKR-2 121-JKR-2 Opposed to S20/29 (120-59a) X3J3/92-106 Interpretation based on 121-JKR-2 Approved as X3J3/92-148A at meeting 122 by unanimous consent Approved as X3J3/92-252 by unanimous consent at meeting 124 -------------------------------------------------------------------------------- NUMBER: 000030 TITLE: Length of character literals in array constructors KEYWORDS: array constructor, character literal, character length, substring DEFECT TYPE: Erratum STATUS: X3J3 draft response QUESTION: Consider the following example: CHARACTER :: NAMES (3) * 20 NAMES = (/ 'TOM', 'DICK', 'HARRY' /) This appears to be invalid due to a constraint in section 4.5, "Construction of array values": Constraint: Each expression in the must have the same type and type parameters. The length of the string is a type parameter. Thus the array constructor sample above is invalid because the strings have different lengths. Consider another example: CALL SUB ( (/ 'TOM', 'DICK', 'HARRY' /) ) ... SUBROUTINE SUB (NAMES) CHARACTER :: NAMES(:) * (*) WRITE(*,*) LEN(NAMES) ... This also appears invalid. 1. Must each character string literal constant in an array constructor be the same length? 2. If the answer to 1 is "No", what values are printed by the second example? 3. If the answer to 1 is "Yes", another question arises. The syntax of an array constructor is described in section 4.5. In rule R432, ac- value is defined to be an expr or an ac-implied-do. Since an ac-value may be an expression, a substring is a valid ac-value. Therefore each substring in an array constructor must have the same length and that length must be the same as the length of every other ac-value in the constructor. But a substring can contain nonconstant expressions as the starting point and ending point, or the starting point and ending point can be omitted (signaling the use of a default value). Since a substring can contain nonconstant starting and ending points, the constraint cited above cannot be detected at compile time and thus cannot be a constraint. Should this restriction be rephrased as prose in the text of the standard? ANSWER: The answer to question 1. is yes. Each character literal constant in an array constructor must be the same length. Both examples are nonstandard conforming. The answer to question 3. is yes. The following edits move the equal-length requirement from a constraint to prose in the text. Discussion: The awkwardness resulting from the requirement that each ac- value be the same length was noted by X3J3, but the committee could not reach agreement on an acceptable way to allow character literal constants of differing lengths in an array constructor. Since the length cannot always be determined at compile time, the constraint must be changed to prose. REFERENCES: ISO/IEC 1539:1991 (E) section 4.5 EDITS: Delete the second constraint following R435. Add the following paragraph after the constraints in 4.5. Each expression in the must have the same type and type parameters. SUBMITTED BY: (Questions 1 and 2) L. R. Rolison in 120-LRR-1 (120.026) (Question 3) L. R. Rolison in X3J3/93-070 LAST SIGNIFICANT CHANGE: 1993-02-11 000030 HISTORY: Response to Questions 1 and 2 - 120-LJO-1 (120.074) Question 3. submitted as X3J3/93-070 at meeting 124 Complete proposed response in X3J3/93-100 adopted at meeting 124 by unanimous consent -------------------------------------------------------------------------------- NUMBER: 000031 TITLE: Overloaded implied-DO variable names KEYWORD: implied-Do variable, DATA statement DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 QUESTION: Section 14.1.3. states: The name of the variable that appears as the DO variable of an implied- DO in a DATA statement or an array constructor has a scope of the implied-DO list. It has the type and type parameter that it would have if it were the name of a variable in the scoping unit that includes the DATA statement or array constructor and this type must be integer. Is the following in error since J has type character and therefore does not have type integer? CHARACTER J INTEGER A(10) DATA (A(J), J=1,10) /10*5/ Is the following valid because, although J is a named constant, it has type integer? INTEGER J PARAMETER (J=5) INTEGER A(10) DATA (A(J), J=1,10) /10*5/ Is the following valid? TYPE (ITYPE) CHARACTER FIELD1 INTEGER FIELD2 END TYPE INTEGER A(10) DATA (A(ITYPE), ITYPE=1,10) /10*5/ If ITYPE were a variable it would have type integer and this would be valid. Does the fact that it is the name of a derived type cause a conflict? The second sentence cited above appears to allow EXTERNAL J INTEGER A(10) DATA (A(J), J=1,10) /10*5/ The EXTERNAL statement declares J to be a global name. If J is a subroutine it has no type, so the presence of the EXTERNAL statement is irrelevant. If J were a function, then it must be type integer for the presence of J in the DATA statement to be valid. Question 1: Is the Fortran 90 standard intentionally extending the FORTRAN 77 standard with respect to implied-DO variables in DATA statements? Did the Fortran 90 standard intentionally delete the material about COMMON block names in section 18.2.7 of X3.9-1978? Question 2: Are the conclusions and interpretations above correct or incorrect? If incorrect, for what specific reasons are they incorrect? Question 3: Are the examples above standard conforming program fragments? If not, what are the specific reasons? Question 4: Are the rules for implied-DO variables in DATA statements and array constructors the same? If they are not exactly the same, provide examples which illustrate the differences. ANSWER: It was intended that the rules for implied-DO variables be similar to those in X3.9-1978. An edit to section 14.1.3 of ISO/IEC 1539:1991 clarifies these rules. The answers to your questions are: 1. Fortran 90 extended the rules for implied-DO variables in DATA statements in two ways: a) The type of an implied-DO variable must be integer but need not be default integer. b) FORTRAN 77 allowed the name of the statement entity also to be the name of a (scalar) variable or COMMON block (X3.9-1978, section 18.2.7) in (i.e. appearing in) the program unit containing the DATA statement or statement function statement. Fortran 90 allows the name of the statement entity also to be the name of a scalar variable or COMMON block appearing in or accessible from the enclosing scope (section 14.1.3 of ISO/IEC 1539-1991, with the changes in the EDITS section, below). 2. The detailing of the conclusions and justifications given below in (3) answer this. 3. The first example is in error because J is of type character and R537 requires integer type. The second example is in error. J is of type integer as required by R537, but the edit to section 14.1.3 prohibits the name of a statement entity also being the name of a constant in the same scoping unit. The third example is in error. The edit to section 14.1.3 prohibits the name of a of a statement entity also being the name of a derived type. The fourth example is in error. The edit to section 14.1.3 prohibits the name of a statement entity also being the name of an external function or subroutine. 4. The rules for implied-DO variables in DATA statements and in array constructors, with respect to typing and scope, are the same. REFERENCES: ISO/IEC 1539:1991, sections 5.2.9, 6.2.1, 14.1.2, 14.1.3. X3.9-1978, section 18.2.7 EDIT: Replace the last paragraph of section 14.1.3 with the following two paragraphs: Except for a common block name or a scalar variable name, a name that identifies a global entity or local entity of class 1 (14.1.2) accessible in the scoping unit of a statement must not be the name of a statement entity of that statement. Within the scope of a statement entity, another statement entity must not have the same name. If the name of a global or local entity accessible in the scoping unit of a statement is the same as the name of a statement entity in that statement, the name is interpreted within the scope of the statement entity as that of the statement entity. Elsewhere in the scoping unit, including parts of the statement outside the scope of the statement entity, the name is interpreted as that of the global or local entity. SUBMITTED BY: L. R. ROLISON, 120-LRR-2 (120.027) LAST SIGNIFICANT CHANGE: 92-11-10, new response 000031 HISTORY: 1st response - 120-RRR-1A (92.069a) -- all prohibited Griffiths' complaint (92.49, p. 11ff) 2nd response (92.112) -- all allowed Email discussion (92.132, #4, 5, 32, 33, 38, 39, 49) WG5 suggests F77 restrictions (92.136, N815-7) 3rd response (92.167a) drafted by DATA subgroup at meeting 122; final action deferred due to 2 week rule Improved edits suggested by Janice Shepherd (private communication) 4th response (92-229b) approved at meeting 123 (22-1) -------------------------------------------------------------------------------- NUMBER: 000032 TITLE: Implicit declaration of a derived type KEYWORDS: derived type, IMPLICIT statement DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Is the following program standard conforming? IMPLICIT TYPE(T1) (A-D) ! Note IMPLICIT range is A-D. TYPE T1 SEQUENCE CHARACTER*10 NAME INTEGER EMP_NUMBER END TYPE T1 A1%NAME='FRED' ! A1 is implicitly declared to be of type T1 ... CONTAINS SUBROUTINE INNER IMPLICIT TYPE(T1) (D) ! D now overrides IMPLICIT for D in !host TYPE T1 INTEGER WIDTH INTEGER HEIGHT END TYPE T1 D%WIDTH = 10 ! No problem here, D is implicitly ! declared with the T1 that is ! defined in INNER. CALL OUTSIDE(C) ! Is this an error? ... Is a reference to A1 (declared in the host) from inside INNER permitted in this example? ANSWER: Yes, the example is standard conforming. Discussion: Components of A1 can also be referred to from inside INNER. While the derived type T1 from the host scoping unit is inaccessible inside the internal routine INNER, there is no reason why data entities of this derived type that are accessible cannot be referred to. The implicit mapping for the letter C is not specified within the internal routine INNER. So, the implicit mapping is that of the host routine. In the host routine the letter C is mapped to derived type T1 of the host. Therefore the variable C is implicitly declared to be of type T1 from the host. The components of the variable C, C%NAME and C%EMP_NUMBER, can also be referred to in INNER. The following edits clarify the standard with regard to these questions. REFERENCES: ISO/IEC 1539:1991 (E) section 5.1.1.7, 5.3, 12.1.2.2.1 EDITS: 1. In the first paragraph of 5.1.1.7, change "is specified" to "is explicitly declared". 2. In paragraph 5 of 5.3 after "provided the mapping is not null.", insert the new sentence: "Note that the mapping can be to a derived type that is inaccessible in the local scope if the derived type is accessible to the host scope." 3. In paragraph 3 of 12.1.2.2.1 after "prior to the DATA statement.", insert a new paragraph: "If a derived type name of a host is inaccessible, data entities of that type or subobjects of such data entities still can be accessible." SUBMITTED BY: L. R. Rolison, 120-LRR-5 (120.030) LAST SIGNIFICANT CHANGE: 1992 11 10, revised content 000032 HISTORY: 120-TMRE-2 (120.075) Questioned by 92-035, 92-049(p14), 92-050(p4) Revised at meeting 121 but rejected Revised response proposed in 92-280, approved by unanimous consent at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000033 TITLE: Interface blocks with the same name in a program KEYWORDS: generic interface blocks, module, USE statement DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Question 1: In the following program, both interface blocks have the same generic name and thus might be considered to be merged into a single generic interface block. Is function F1 (from module MOD_1) accessible to the program but function F2 (from module MOD_2) hidden? MODULE MOD_1 PUBLIC INT_1 INTERFACE INT_1 ! Generic interface - PUBLIC. INTEGER FUNCTION F1(K) INTEGER K END FUNCTION END INTERFACE ... END MODULE MOD_1 MODULE MOD_2 PRIVATE INT_1 INTERFACE INT_1 ! Generic interface, same name - PRIVATE INTEGER FUNCTION F2(L) LOGICAL L END FUNCTION END INTERFACE ... END MODULE MOD_2 PROGRAM EXAMPLE_1 USE MOD_1; USE MOD_2 ! Program accesses both modules. ... END Question 2: If the following module is added to the above example and the USE statement in the main program is changed to "USE MOD_1; USE MOD_2; USE MOD_3", is the resulting program standard conforming? MODULE MOD_3 PUBLIC INT_1 INTERFACE INT_1 ! Generic interface, same name - PUBLIC. INTEGER FUNCTION F3(L) LOGICAL L END FUNCTION END INTERFACE ... END MODULE MOD_3 Question 3: If the program and modules shown above are altered so that module MOD_2 USEs MOD_1 and the program EXAMPLE_1 only USEs MOD_2 directly, is this an example of a standard conforming program? If it is standard conforming, does the program have access to function F1 but not F2? ANSWER 1: No. Function F2 is still accessible but only by its specific name. ANSWER 2: Yes, but not for the reason implied by the question. ANSWER 3: Yes, the program is standard conforming. Discussion: Because the name INT_1 is private in the module MOD_2, the interface for the function F2 is accessible in the program EXAMPLE_1, but NOT the generic name INT_1. Therefore, the two interface blocks are NOT merged into a single generic interface block. The function F1 is, therefore, accessible in the program EXAMPLE_1 by either its specific name F1 or the generic name INT_1; the function F2, on the other hand is accessible only by its specific name F2. This shows that the function F2 (from module MOD_2) does not share the same generic name, INT_1, as the function F1 (from module MOD_1). When the example is modified as specified by Question 2, the new module MOD_3 defines a new interface block INT_1, which will be combined with the identically named interface block from module MOD_1. In the program EXAMPLE_1 the generic name INT_1 has the two specific names F1 and F3. However, since F2 is not part of the combined generic interface block the fact that F2 and F3 have the same dummy argument and result characteristics is of no significance, and the program is standard conforming. When the example is modified as specified by Question 3, within module MOD_2 the two generic interface blocks are combined into a single interface block. However, since INT_1 is declared to be private within module MOD_2 only the specific names of the functions F1 and F2 are accessible to program units using MOD_2. Therefore, both the function F1 and F2 are accessible within the program EXAMPLE_1, but only by their specific names. REFERENCES: ISO/IEC 1539:1991 (E) sections 5.2.3, 11.3.2 EDITS: None. SUBMITTED BY: L. R. Rolison, 120-LRR-6 (120.031) HISTORY: 120-TMRE-3 (120.076) Included into S20 as three items (33-35). Recombined in 92-308. Revised in response to ballot comments in 93-082. Approved by unanimous consent at meeting 124. -------------------------------------------------------------------------------- NUMBER: 000034 TITLE: Interface blocks with the same name in a program - II KEYWORDS: generic interface blocks, module, USE statement DEFECT TYPE: Interpretation STATUS: subsumed by item 33 QUESTION: If the following module is added to the example given in NUMBER 000033, and the USE statement in the main program is changed to "USE MOD_1, MOD_2, MOD_3", is the resulting program standard conforming? MODULE MOD_3 PUBLIC INT_1 INTERFACE INT_1 ! Generic interface, same name - PUBLIC. INTEGER FUNCTION F3(L) LOGICAL L END FUNCTION END INTERFACE ... END MODULE MOD_3 ANSWER: Yes, but not for the reason implied by the question. Discussion: The answer in NUMBER 000033 shows that the function F2 (from MODULE MOD_2) does not share the same generic name, INT_1, as the function F1 (from MODULE MOD_1). The new module MOD_3 defines a new interface block INT_1, which will be combined with the identically named interface block from module MOD_1. In the program EXAMPLE_1 the generic name INT_1 has the two specific names F1 and F3. However, since F2 is not part of the combined generic interface block the fact that F2 and F3 have the same dummy argument and result characteristics is of no significance, and the program is standard conforming. REFERENCES: EDITS: None. SUBMITTED BY: L. R. Rolison, 120-LRR-6 (120.031) Part 2 HISTORY: 120-TMRE-3 (120.076) -------------------------------------------------------------------------------- NUMBER: 000035 TITLE: Interface blocks with the same name in a program - III KEYWORDS: generic interface block, module, USE statement DEFECT TYPE: Interpretation STATUS: subsumed by item 33 QUESTION: If the program and modules shown in NUMBER 000033 are altered so that module MOD_2 USEs MOD_1 and the program EXAMPLE_1 only USEs MOD_2 directly, is this an example of a standard conforming program? If it is standard conforming, does the program have access to function F1 but not F2? ANSWER: Yes, the program is standard conforming. Discussion: Within module MOD_2 the two generic interface blocks are combined into a single interface block. However, since INT_1 is declared to be private within module MOD_2 only the specific names of the functions F1 and F2 are accessible to program units using MOD_2 (c.f. NUMBER 000033). Therefore, both the function F1 and F2 are accessible within the program EXAMPLE_1, but only by their specific names. REFERENCES: EDITS: None. SUBMITTED BY: L. R. Rolison, 120-LRR-6 (120.031) Part 3 HISTORY: 120-TMRE-3 (120.076) -------------------------------------------------------------------------------- NUMBER: 000036 TITLE: Pointer to an assumed-size array KEYWORDS: pointer, assumed-size array, pointer assignment statement DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Is a pointer assignment statement of the form: PTR => A where A is an assumed-size array, standard conforming? ANSWER: No. This is prohibited by section 6.2.1, second paragraph, second sentence. REFERENCES: ISO/IEC 1539:1991 (E) section 6.2.1 EDITS: None. SUBMITTED BY: L. R. Rolison, 120-LRR-7 (120.032) HISTORY: 120-RRR-2A (120.087A) Approved in ballot 92-182 -------------------------------------------------------------------------------- NUMBER: 000037 TITLE: Use of array sections in pointer assignment statements KEYWORDS: pointer assignment statement, array sections, pointer DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: If A is an assumed-size array: Is "PTR => A(:N)" standard conforming? Are "PTR => A(:)" and "PTR => A(N:)" standard conforming? ANSWER: "PTR => A(:N)" is standard conforming because A(:N) is a valid array section. Forms "PTR => A(:)" and "PTR => A(N:)" are not standard conforming because the array sections are prohibited by the second constraint after R621. REFERENCES: ISO/IEC 1539:1991 (E) section 6.2.2 EDITS: None. SUBMITTED BY: L. R. Rolison, 120-LRR-7 (120.032) HISTORY: 120-RRR-2A (120.087A) Approved in ballot 92-182 -------------------------------------------------------------------------------- NUMBER: 000038 TITLE: Same interface body in multiple generic interface blocks KEYWORDS: interface body, generic interface blocks, scoping unit DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Part 1. Is the following example standard conforming? That is, can the same interface body exist in multiple generic interface blocks that are all accessible from a single scoping unit? MODULE MOD_1 INTERFACE RED SUBROUTINE CMN(K) INTEGER K END SUBROUTINE SUBROUTINE S(X) REAL X END SUBROUTINE END INTERFACE END MODULE MODULE MOD_2 INTERFACE BLUE SUBROUTINE SS(Y) REAL Y END SUBROUTINE SUBROUTINE CMN(K) INTEGER K END SUBROUTINE END INTERFACE END MODULE PROGRAM EXAMPLE_1 USE MOD_1; USE MOD_2 INTEGER M ... CALL RED(M) ... CALL BLUE(M) ... END PROGRAM Part 2. If the names are removed from the interface blocks in both modules, thus making them nongeneric, and the subroutine calls in program EXAMPLE_1 replaced by "CALL CMN(M)", is the resulting program standard conforming? That is, may a procedure interface description occur in multiple nongeneric interface blocks that are accessible to a given scoping unit and may the program unit reference that procedure? ANSWER: Part 1. No. The example is not standard conforming. Part 2. No. Discussion: The last sentence of the second paragraph of 12.3.2.1 states A procedure must not have more than one explicit specific interface in a given scoping unit. In the example the subroutine CMN has two specific interfaces, one from each module in the program EXAMPLE_1 which is forbidden. The program could be made standard conforming by making the name CMN private in one or both modules or by adding a rename or only option to one of the USE statements. REFERENCES: ISO/IEC 1539:1991 (E) section 12.3.2.1 EDITS: None. SUBMITTED BY: L. R. Rolison, 120-LRR-8 (120.033) HISTORY: Original interpretation in 120-TMRE-4 (120.077) Questioned in X3J3/92-131 Approved as X3J3/92-174 at meeting 122 by unanimous consent Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000039 TITLE: Association of a pointer actual argument with a dummy argument KEYWORDS: pointer, actual argument, dummy argument, argument association DEFECT TYPE: Erratum STATUS: X3J3 draft response QUESTION: When a pointer is passed as an actual argument, is the intent of the standard as follows: Dereferencing of the pointer is dependent on the interface of the called procedure. That is, if the dummy argument is known to be a pointer (with matching type, etc.) then the pointer actual argument is NOT dereferenced - the pointer itself is passed. Conversely, if the dummy argument is unknown or is known to not be a pointer then the pointer dummy argument is dereferenced so that its target is passed (possibly through a temporary)? If yes, please quote the text that specifies the meaning of passing a pointer as an actual argument. ANSWER: Section 5.1.2.4.3 indicates that a pointer actual argument may be associated with either a pointer dummy argument or a nonpointer dummy argument. The semantics of a pointer actual argument associated with a pointer dummy argument are specified in section 12.4.1.1. When a pointer actual argument is associated with a nonpointer dummy argument, the actual argument's associated target object becomes associated with the dummy argument. Section 7.1.4.1 states If a pointer appears as a primary in an intrinsic operation or a defined operation in which it corresponds to a nonpointer dummy argument, the associated target object is referenced. Discussion: The standard does not specify implementation details. A valid implementation would allow passing a descriptor when a pointer actual argument is associated with a pointer dummy argument and a temporary when the dummy argument is a nonpointer. Another valid implementation would be to pass a descriptor in both cases. Since the notion of referencing and dereferencing pointers is implementation dependent, the standard does not use these terms when discussing pointers and targets. The standard does state when a pointer's association status may change (pointer assignment, allocation, deallocation, nullification, and association with a dummy argument which is a pointer) and several cases where a pointer name refers to the associated target object (assignment as primary in an expression, and an I/O list). There is also an example of a pointer actual argument associated with a nonpointer dummy argument in section 12.5.2.9. The corrections indicated below clarify the rules and meaning of associating a pointer actual argument with a nonpointer dummy argument. REFERENCES: ISO/IEC 1539:1991 (E) sections 5.1.2.4.3, 7.1.41, 7.5.1.5, 9.4.4.4, 12.4.1.1, & 12.5.2.9 EDITS: 1. Delete the penultimate (tenth) paragraph of 5.1.2.4.3, "A pointer dummy argument ... argument." [46:41-42] 2. Add the following new paragraph following the current fifth paragraph of section 12.4.1.1: [173:13+] If the dummy argument is not a pointer and the corresponding actual argument is, the actual argument must be currently associated with a target and the dummy argument becomes argument associated with that target. SUBMITTED BY: L. R. Rolison, 120-LRR-9 (120.034) LAST SIGNIFICANT CHANGE: 1993-02-12 000039 HISTORY: 120-JLS-9 (120.079) Passed letter ballot to move to "Ready for WG5" status Revised response in 93-102 adopted at meeting 124 by unanimous consent -------------------------------------------------------------------------------- NUMBER: 000040 TITLE: Allocation of arrays of pointers KEYWORDS: arrays, pointer allocation, structures DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Consider the following code fragment: TYPE DEF INTEGER I INTEGER, POINTER :: PTR END TYPE TYPE (DEF) :: STRUCT (5) ... ALLOCATE (STRUCT%PTR) Are the following quotations from the standard sufficient to declare this code fragment to be nonstandard-conforming? The constraint immediately following R628 "Each must be a pointer or an allocatable array." The second sentence of the fourth constraint after R613 "A to the right of a with nonzero rank must not have the POINTER attribute." ANSWER: The ALLOCATE statement in the example is not permitted by the syntax rules and constraints of the standard: R625 is or R614 is R612 is [%]... R613 is [()] Constraint: A to the right of a with nonzero rank must not have the POINTER attribute. REFERENCES: ISO/IEC 1539:1991 (E) sections 6.1.2 and 6.3.1 EDITS: None. SUBMITTED BY: Larry Rolison, X3J3/92-056 HISTORY: Approved as X3J3/92-069 at meeting 121 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000041 TITLE: Procedure with target dummy argument requires explicit interface KEYWORDS: dummy argument, explicit interface, TARGET attribute DEFECT TYPE: Erratum STATUS: X3J3 draft response QUESTION: If a procedure has a dummy argument that has the TARGET attribute, it must have an explicit interface (section 12.3.1.1). The TARGET attribute is defined solely for the purpose of aiding optimization (C.5.3). Why must such a procedure have an explicit interface? ANSWER: Section C.5.3 is in error by stating the TARGET attribute is solely to aid optimization. It is true that requiring an explicit interface for a procedure with a dummy argument that has the TARGET attribute aids optimization of the subprogram that calls the procedure. Such an explicit interface also allows a processor to diagnose when an actual argument which does not have the TARGET attribute becomes associated with a dummy argument that has the TARGET attribute. The supplied edit corrects the error. Discussion: Section 6.3.3.2 states that upon execution of a RETURN or END statement, some pointers declared or accessed in the procedure retain their association status. For example, if a pointer is accessible to both the subprogram which references the procedure and the referenced procedure, or if the procedure is a function whose result has the POINTER attribute, such a pointer cannot become associated with an actual argument during execution of the procedure if the target actual argument becomes associated with a nontarget dummy argument. If a procedure does not have an explicit interface, a processor may assume any actual argument with the target attribute cannot become associated with such a pointer during execution of the procedure. Requiring an explicit interface for a procedure with a target dummy argument also allows the processor to diagnose association of a nontarget actual argument, such as an expression, with the target dummy argument. Note that edits in defect item 125 make the need for the explicit interface mandatory. REFERENCES: ISO/IEC 1539:1991 sections 6.3.3.2, 12.3.1.1, and C.5.3 EDIT: Section C.5.3, second sentence, change "solely" to "primarily". SUBMITTED BY: K. Kazumura, X3J3/92-048 (121-ADT-8) page 23 LAST SIGNIFICANT CHANGE: 1993-02-12 000041 HISTORY: Posted request to f90 interp e-mail Approved as X3J3/92-070 meeting 121 Approval rescinded at meeting 123 (uc) Revised response in X3J3/93-101 adopted at meeting 124 by unanimous consent -------------------------------------------------------------------------------- NUMBER: 000042 TITLE: KIND parameter value KEYWORDS: kind parameter value, representation of constants DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: It is stated in section 5.1.1.2 that: An entity declared with type specifier REAL(KIND(0.0)) is of the same kind as one declared with the type specifier REAL. There are similar statements about INTEGER, DOUBLE PRECISION, and COMPLEX type specifiers in sections 5.1.1.1, 5.1.1.3, and 5.1.1.4. In section 5.1.1.2, for example, must the constant be exactly the characters "0.0" to cause the declared entity to be the same as the default real entity? Could the result be different if the constant were expressed, for example, as "0."? It appears that the committee chose the value 0 in these statements because it exists on every machine on which a Fortran 90 processor will be run. Further, a specific value was chosen so that machine architecture differences would be factored out. For example, KIND(10000000.) might have the same kind parameter value as default real on one machine but not on another. ANSWER: No, the constant need not be exactly "0.0". The constant "0.0" is used only as an example. Discussion: The KIND intrinsic is defined in section 13.13.51 of the standard to return a value equal to the kind type parameter of its argument; the argument may be of any intrinsic type. In section 13.5.5 it is stated that the value of the argument to this function need not be defined. It is only the kind type of the argument that is relevant. Nowhere in the standard is there a restriction that the argument to the KIND intrinsic be a constant at all, much less the specific constant 0.0. The is specified in section 5.1, R505 to be a . The definition of an is given in section 7.1.6.1, and the restrictions on the argument of the KIND intrinsic in an are detailed in item (6) of that definition. The question makes the assertion that KIND(10000000.) might not have the same kind parameter value as default real on all machines. This assertion is false. Possibly the requestor believed that a literal real constant could assume a kind parameter value based on the number of digits in the constant or some other implicit criterion. This is not allowed in Fortran 90. In section 4.3.1.2, it is explicitly stated that: A literal real constant without a kind type parameter is a default real constant if it is without an exponent part..." Similar arguments apply to the corresponding questions about INTEGER, DOUBLE PRECISION, and COMPLEX type specifiers. REFERENCES: ISO/IEC 1539:1991, sections 4.3.1.2, 5.1, 5.1.1, 7.1.6.1, 13.5.5, 13.13.51 EDITS: None. SUBMITTED BY: L.R.Rolison, X3J3/92-060 HISTORY: Approved as X3J3/92-084 at meeting 121 by a vote of 19-0 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000043 TITLE: List-directed character input KEYWORDS: list-directed, input, character, zero length, null value DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 QUESTION: For list directed input of character items, how does the standard distinguish between the input of an undelimited zero-length character string and a null value? If the input is a zero-length character string, the corresponding list item must be set to blank, whereas if the input is a null value, the definition status of the corresponding list item must be left unchanged. However, there appears to be no way to distinguish these two possibilities. ANSWER: The ambiguity between undelimited zero length character values and the null value should be resolved by requiring that zero-length character values always be delimited in list-directed input. Discussion: Several other potential ambiguities with undelimited character items in list-directed input were resolved in section 10.8.1 by requiring delimiters in those cases. However, the case of a zero- length string was omitted from this list. EDITS: The following changes should be made to section 10.8.1, 1. Add " and" to the end of item (4), and 2. Add an additional item to the list after item (4): "(5) The character constant contains at least one character," REFERENCES: ISO/IEC 1539:1991, sections 10.8.1, 10.8.1.1 SUBMITTED BY: Richard E. Maine, X3J3/92-087 HISTORY: Approved as X3J3/92-116 at meeting 121 by a vote of 19-0 Approved in ballot 92-182 -------------------------------------------------------------------------------- NUMBER: 000044 TITLE: END statement and fixed form source KEYWORDS: end statement, fixed form source, initial line DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 QUESTION: Consider the following: 1. Section 3.3.2.4 "Fixed Form Statements", page 24, requires that no statement, except the program unit END statement, have an initial line that appears to be a program unit END statement. 2. Other statements, for example, , R1218 page 175, may consist of only the keywords "END" or "END FUNCTION". While these do not conflict, the combined requirements are not obvious and complicate the situation for users. Consider, for example, ending an for a function subprogram: 1. END ! wrong, appears to be a program unit END 2. EN ! END continued to 2nd line. OK & D 3. END FUNCTION ! OK in main PROGRAM unit and SUBROUTINE ! subprogram, wrong in FUNCTION subprogram 4. EN ! OK & D FUNCTION 5. END F ! OK 6. END FUNCTION A ! OK in main program, OK in SUBROUTINE & BC !subprogram, OK in function if name is not "A" ANSWER: Section 3.3.2.4 was brought forward from FORTRAN 77 without modification for new Fortran 90 constructs. The resulting usability characteristics, as seen in the examples above, are regrettable enough that a repair should be made. REFERENCES: ISO/IEC 1539:1991 (E) section 3.3.2.4 EDIT: In 3.3.2.4 replace the text "and no other statement in the program unit may have an initial line that appears to be a program unit END statement" with ". A statement whose initial line appears to be a program unit END statement must not be continued." SUBMITTED BY: J.C.Shepherd, X3J3/92-012, X3J3/92-013, X3J3/92-014 HISTORY: Approved as X3J3/92-088A at meeting 122 by a vote of 24-0 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000045 TITLE: Array intrinsics with arrays of derived-type arguments KEYWORDS: array intrinsics, derived-types, operations, interface blocks DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: The intrinsic functions ALLOCATED, ASSOCIATED, LBOUND, UBOUND, PRESENT, SHAPE, SIZE, MERGE, PACK, SPREAD, UNPACK, CSHIFT, EOSHIFT, TRANSPOSE, RESHAPE, and TRANSFER are documented as accepting arrays of any type. Does this include arrays of derived-type, and if so, does this conflict with section 4.4.5 which states: Any operation on derived-type entities or nonintrinsic assignment for derived-type entities must be defined explicitly by a function or subroutine and a procedure interface block. ANSWER: The intrinsics in question can accept arguments which are arrays of derived-types. This does not conflict with section 4.4.5. Discussion: The term "operation" in section 4.4.5 refers to user defined unary and binary operations in expressions and nonintrinsic assignments. Such operators are defined by means of interface blocks which define operators and nonintrinsic assignment. Using an object as an actual argument in a procedure reference is not considered an operation on that object in this sense. REFERENCES: ISO/IEC 1539:1991 section 4.4.5 and 13.13 X3J3/92-051 pages 13-14 EDITS: None. SUBMITTED BY: H.Funaki, X3J3/92-051 (121-ADT-11) pp13-14 HISTORY: Posted request to f90 interp e-mail Approved as X3J3/92-092A meeting 121 by a vote of 19-0 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000046 TITLE: RESULT clause for RECURSIVE functions KEYWORDS: result clause, recursive functions DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: 1. Does RECURSIVE require RESULT? 2. Assuming (1), is a permitted on the function name when RECURSIVE is present? ANSWER: The RESULT clause is not required for all RECURSIVE functions; it is required for those that are directly recursive. That is, the RESULT clause is necessary to make the function visible in its own body so that direct recursion can take place. It should be noted that the prohibition against typing the function name when a result variable name is specified was not intended to prohibit putting the function type into the header. In other words: FUNCTION F() RESULT (FVAR) INTEGER FVAR and INTEGER FUNCTION F() RESULT (FVAR) are both allowed. The case prohibited is: FUNCTION F() RESULT (FVAR) INTEGER F It is possible for both a and RECURSIVE to appear in a single function header. REFERENCES: ISO/IEC 1539:1991 (E) section 12.5.2.2 EDITS: None. SUBMITTED BY: L.Meissner, X3J3/92-045 (121-ADT-5) p17. HISTORY: For discussion see X3J3/92-45 (121-ADT-5) pp 18, 26-27 Approved as X3J3/92-101 at meeting 121 by a vote of 20-0 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000047 TITLE: Automatic data object in initialization expressions KEYWORDS: automatic data object, initialization expressions DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 QUESTION: Can an automatic data object be used as the argument to the LEN function in the initialization expression of a PARAMETER statement or an item given the PARAMETER attribute? ANSWER: It was the intent of the committee to include objects with nonconstant lengths in the restrictions on the LEN function in section 7.1.6.1 (pages 77 and 78). REFERENCES: ISO/IEC 1539:1991 (E) section 7.1.6.1 EDITS: 1. Section 7.1.6.1, page 77, item (6) change "not assumed or" to "not assumed, are not defined by an expression that is not a constant expression, and are not" 2. Section 7.1.6.1, page 78, item (6) change "not assumed or" to "not assumed, are not defined by an expression that is not a constant expression, and are not" SUBMITTED BY: 120.042 HISTORY: For discussion see 120.073A and X3J3/92-036 (121-JKR-4) Approved as X3J3/92-107 at meeting 121 by a vote of 20-0 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000048 TITLE: Pointer-valued statement functions KEYWORDS: statement function, pointer DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Can a statement function be pointer-valued? There appears to be nothing in section 12.5.4 to prohibit this. ANSWER: No, a statement function cannot be pointer-valued. Discussion: From section 12.3.1: The interface of a statement function is always implicit. >From section 12.3.1.1: A procedure must have an explicit interface if... (2) The procedure has: (e) A result that is a pointer (functions only) Therefore, a statement function cannot have a result that is a pointer. REFERENCES: ISO/IEC 1539:1991 sections 12.3.1, 12.3.1.1, 12.5.4 EDITS: None. SUBMITTED BY: L.Meissner, X3J3/92-45 (121-ADT-5) p37 HISTORY: Approved as X3J3/92-108 at meeting 121 by a vote of 19-0 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000049 TITLE: Characteristics of function results KEYWORDS: characteristics, function result, ENTRY, exact dependence, partially associated DEFECT TYPE: Erratum STATUS: X3J3 consideration in progress QUESTION: Given a character function with an ENTRY statement, both results must have the same characteristics or be scalars without the POINTER attribute and have identical length. Therefore: FUNCTION FUN(M,N) CHARACTER (LEN=M+N)::FUN,ENT ... ENTRY ENT(M,N) ... END FUNCTION is standard conforming. Question 1: FUNCTION FUN(M,N) CHARACTER (LEN=M+N)::FUN CHARACTER (LEN=M+N)::ENT ... ENTRY ENT(M,N) ... END FUNCTION Is the code above standard conforming? Question 2: FUNCTION FUN(M,N) CHARACTER (LEN=M+N)::FUN CHARACTER (LEN=N+M)::ENT ... ENTRY ENT(M,N) ... END Is the code above standard conforming? Question 3: FUNCTION FUN(M) CHARACTER (LEN=M+M)::FUN CHARACTER (LEN=M*2)::ENT ... ENTRY ENT(M) ... END Is the code above standard conforming? Question 4: What is the meaning of the phrase "the exact dependence on the entities" in section 12.2.2? ANSWER: Answer 1. Yes Answer 2. Yes Answer 3. Yes Answer 4. The sentence containing the phrase "the exact dependence on the entities" in section 12.2.2 is intended to convey that in those cases where the shape or character length type parameter is not constant, the corresponding characteristic of the function result is not a value but the way the value is determined when the procedure is invoked. Discussion: It was intended that only the mapping from program state to value be of significance, not the particular form in which that mapping is expressed. An edit to make this clear has been included. In question 3, for example, it is a characteristic of FUN and ENT that their lengths are twice the value of M. It is not required that the expressions of this mapping be identical, only that they yield the same results. Thus, twice the value of M could be expressed as M+M for FUN and as M*2 for ENT. Clearly, it can be extremely difficult to determine on a static basis whether two expressions of a mapping are consistent, and there is no requirement in the standard that this be done. It would be possible to check during execution that the values expressed are identical each time such a procedure is invoked, but it is expected that a more typical application of this requirement would be to assume that it has been met and use one expression of this mapping as the basis for computing attributes of all of the result variables. REFERENCES: ISO/IEC 1539:1991 (E) section 12.2.2 & 14.6.3.3 EDITS: 1. Replace the last two sentences in 12.2.2 [166:14-16] with the following: If the shape or character length type parameter is not constant, the corresponding characteristic is the method by which the value is to be determined when the function is invoked. This includes the possibility that the value is assumed or that it is given by evaluating a specification expression. Two such methods are considered to be the same if they yield the same value under all possible conditions in which they might be applied; they need not be expressed identically. 2. Replace the last two sentences in 12.2.1.1 [166:4-6] with the following: If the shape or character length type parameter is not constant, the corresponding characteristic is the method by which the value is to be determined when the procedure is invoked. This includes the possibility that the value is assumed or that it is given by evaluating a specification expression. Two such methods are considered to be the same if they yield the same value under all possible conditions in which they might be applied; they need not be expressed identically. SUBMITTED BY: Y. Yoshida, X3J3/92-051 (121-ADT-11) pp.-13 LAST SIGNIFICANT CHANGE: 1993-02-11, item split 000049 HISTORY: Approved as X3J3/92-109A at meeting 121 by a vote of 19-0 resubmitted in 92-313 in response to ballot comments and approved by unanimous consent at meeting 123. Revised in response to ballot comments in 92-105 -------------------------------------------------------------------------------- NUMBER: 000050 TITLE: Repeat counts on edit descriptors KEYWORDS: edit descriptor, repeat count DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Is the repeat specification part of the edit descriptor? In section 10.1.1 the second constraint states that the comma separating the in a is optional between certain combinations of edit descriptors. In section 10.2 a format-item is defined as, amongst other things, "[r]" and in 10.2.1 an edit-descriptor can be a data- edit-desc. However, does not contain the repeat count. This implies that: 100 FORMAT(1PE20.10) ! is legal 200 FORMAT(1P3E20.10) ! is not legal 300 FORMAT(1P,3E20.10) ! is legal ANSWER: The repeat count is not part of any edit descriptor except the "[r]/" edit descriptor. The comments in the examples are correct. REFERENCES: ISO/IEC 1539:1991, sections 10.1.1, 10.2, & 10.2.1 EDITS: None. SUBMITTED BY: A.D.Tait, X3J3/92-041 (121-ADT-1) HISTORY: X3J3/92-041, X3J3/92-042 This problem appears to stem from an incompatibility between FORTRAN 66 and FORTRAN 77. In FORTRAN 66 a FORMAT statement is of the form: FORMAT(list) where the list consists of a series of field descriptors separated by field separators and optionally preceded and succeeded by slashes. The field descriptors for real or double precision values consisted of the now familiar Dw.d, Ew.d, Fw.d, and Gw.d edit descriptors (a term introduced in FORTRAN 77) preceded by an optional scale factor and repeat count. For example, in FORTRAN 66 a valid field descriptor is 1P3E17.10, where 1P is the scale factor, 3 the repeat count for a field containing 10 digits in the fractional part of the number and having a E exponent. In FORTRAN 77 the scale factor is an edit descriptor and thus is a list element in the format specification. While FORTRAN 77 specifies places where the commas separating list elements in a format specification are optional, it fails to make a comma between the scale factor and an immediately succeeding repeated D, E, F, or G edit descriptor optional. This situation has been carried over to Fortran 90. Thus: 100 FORMAT(1PE20.10) ! is legal in F66, F77, and F90 200 FORMAT(1P3E20.10) ! is legal in F66, and illegal in F77 & F90 300 FORMAT(1P,3E20.10) ! is illegal in F66, and legal in F77 & F90 Edit approved in 92-267r at meeting 123. -------------------------------------------------------------------------------- NUMBER: 000051 TITLE: On unambiguous generic procedure references KEYWORDS: generic procedure DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Should the rules in 14.1.2.3 include a rule that uses the fact that a dummy argument is either a subroutine or a function to disambiguate a generic procedure reference? For example, such a rule could be in section 14.1.2.3, in the sentence that is preceded by "(1)", after "with a different type" adding "present as a subroutine instead of a function". ANSWER: No. The intent of the committee was to keep the rules as simple as possible in order that they would be easy to understand and to use. It is not always possible for the processor to tell whether an actual argument that is a procedure is a subroutine or an implicitly typed function. REFERENCES: ISO/IEC 1539:1991 (E) section 14.1.2.3 EDITS: None. SUBMITTED BY: John Reid, SC22/WG5 N786A HISTORY: X3J3/92-017 at meeting 121 - RFI: generic interfaces and dummy procedure arguments Approved as X3J3/92-151 at meeting 122 by a vote of 25-0 -------------------------------------------------------------------------------- NUMBER: 000052 TITLE: Expressions in statement function definitions KEYWORDS: statement functions, array, variable, intrinsic operator, expression DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 QUESTION: Section 12.5.4 appears to prohibit whole array names appearing as actual arguments to functions within the of a statement function. The first constraint states: The may be composed only of constants (literal and named), references to scalar variables and array elements, references to functions and function dummy procedures, and intrinsic operators. A defined operator may be an extended intrinsic operator, as well as a defined unary or binary operator. Question 1: Is the legal FORTRAN 77 program fragment, EXTERNAL FCN REAL A(2) STFN(X) = FCN(A) + X where FCN is some function and STFN is a statement function, a legal Fortran 90 program fragment? Question 2: Is it intended that a defined operator which is an extended intrinsic operator be allowed in a statement function definition but other defined operators not be allowed? ANSWER: The intent is that the program fragment in question one should bea valid Fortran 90 program fragment, and that no defined operators be allowed in a statement function definition. The standard is in error. The edits below should be applied to correct the standard. Discussion: The intent of the standard was to retain the FORTRAN 77 definition of statement functions without extending it to include defined operators or array expressions. In FORTRAN 77, "expression" and "variable" referred only to scalar expressions and variables; there were no defined operators. In Fortran 90 these terms also refer to array expressions and arrays. The Fortran 90 definition of statement functions was intended to prohibit array expressions but overlooked the use of an array name as an actual argument to a function in the definition of a statement function. REFERENCES: ISO/IEC 1539:1991 section 12.5.4 EDITS: Section 12.5.4 1. First constraint, first sentence change "references to scalar variables and array elements" to "references to variables" change "intrinsic operators" to "intrinsic operations" after first sentence add If contains a reference to a function or a function dummy procedure the reference must not require an explicit interface, the function must not require an explicit interface or be a transformational intrinsic, and the result must be scalar. If an argument to a function or a function dummy procedure is array valued, it must be an array name. 2. Second constraint, third sentence change "scalar variable, array element" to "variable" 3. Fifth constraint, first sentence delete second word ("scalar") SUBMITTED BY: A. D. Tait X3J3/92-064 item # 13 points to B. Smith e-mail in X3J3/92-045 pp. 50-52 HISTORY: Approved as X3J3/92-153A at meeting 122 by a vote of 17-2 -------------------------------------------------------------------------------- NUMBER: 000053 TITLE: Optional intrinsic function arguments KEYWORDS: intrinsic functions, optional arguments DEFECT TYPE: Amendment STATUS: X3J3 approved; ready for WG5 QUESTION: Should constraining text be added to the description of optional argument Y in CMPLX, and optional argument BACK in INDEX, and optional argument SIZE in ISHFTC, and optional argument A3,... in MAX, and optional argument A3,... in MIN, and optional argument BACK in SCAN, and optional argument BACK in VERIFY to state that the argument must not be an optional argument of an invoking procedure? ANSWER: In principle yes; however it is more appropriate to add an additional restriction on dummy arguments not present in section 12.5.2.8. Discussion: The standard contains numerous restrictions intended to ensure that the rank of a given expression never changes. The case of elemental functions with optional arguments was inadvertently overlooked. Consider the following subprogram: SUBROUTINE SUB (A,B,C) INTEGER :: A ,B INTEGER, OPTIONAL :: C (:) PRINT *, MAX (A, B, C) END When C is present, the result of the elemental function MAX, is an array of the same shape as C. However, if SUB were to be called with the third argument omitted, the result would be a scalar. The supplied edit remedies this deficiency. REFERENCES: ISO/IEC 1539:1991 (E) 12.5.2.8, 13.13.20, 13.13.46, 13.13.50, 13.13.52, 13.13.63, 13.13.68, 13.13.91, 13.13.111, 13.13.113. EDITS: 1. Add the following point to the numbered list in section 12.5.2.8: (5) If it is an array, it must not be supplied as an actual argument to an elemental procedure unless an array of the same rank is supplied as an actual argument corresponding to a nonoptional dummy argument of that elemental procedure. 2. In the paragraph following the numbered list, replace "It" with "Except as noted in (5) above, it" SUBMITTED BY: response to X3J3/92-058 (121-LRR-5) HISTORY: Submitted as question in 92-058, draft response prepared in X3J3/92-094, and in N815A of the WG5 Victoria meeting based on John Reid's paper, N786A. X3J3/92-156r approved at meeting 122 -------------------------------------------------------------------------------- NUMBER: 000054 TITLE: Resolving generic procedure references KEYWORDS: generic, interface, intrinsic DEFECT TYPE: Interpretation STATUS: X3J3 draft response QUESTION: Consider the following code fragment: PROGRAM HOST DIMENSION ABS(10) ... CONTAINS SUBROUTINE SUB() INTERFACE ABS FUNCTION IA1(I) INTEGER IA1, I END FUNCTION END INTERFACE R = ABS(1.5) Do the rules for resolving references to names established to be generic (14.1.2.4.1) imply that R will be assigned the value 1.5 as the result of invoking the intrinsic ABS? ANSWER: Yes. Discussion: ABS is established to be generic in the scope of subroutine SUB (14.1.2.4 item 1(a)). The rules in section 14.1.2.4.1 can be used to resolve the procedure reference. Rule (1) in 14.1.2.4.1 does not apply, as the reference is not consistent with any specific interface in the interface block with the name ABS. Rule (2) does not apply as ABS does not appear in an INTRINSIC statement. Rule (3) does not apply as ABS is not established to be generic in the host scope. Therefore, rule (4) is applied and the reference is resolved to the generic intrinsic procedure ABS. REFERENCES: ISO/IEC 1539:1991(E) Sections 14.1.2.4 and 14.1.2.4.1 EDITS: None. SUBMITTED BY: J.C. Shepherd HISTORY: One of the questions raised in X3J3/92-048 pg 29-30, 34-40, 51, 52 and X3J3/92-052 pg 1-3. Initially drafted as X3J3/92-119 X3J3/92-157 approved at meeting 122 -------------------------------------------------------------------------------- NUMBER: 000055 TITLE: Characteristics of character function results KEYWORDS: character function, function result DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 QUESTION: In section 12.5.2.5 the second paragraph after the constraints contains the text: "Otherwise, they are storage associated and must all be scalars without the POINTER attribute and all be of type default character with identical length". Is some of this text redundant? ANSWER: Yes. Discussion: The phrase referring to "identical length" was meant to include the FORTRAN 77 character storage association case. FORTRAN 77 requires either that they all be of assumed length or all be of the same constant length; both are included as characteristics that agree in section 12.5.2.5 in the second paragraph after the constraints that starts with "If the ENTRY". The phrase is redundant and is causing confusion. REFERENCES: ISO/IEC 1539:1991 (E) section 12.5.2.5. EDIT: In Section 12.5.2.5 in the sentence that starts: "Otherwise, they ... " delete: "all be scalars ... length or". SUBMITTED BY: J.K.Reid in N786A at the WG5 Victoria Meeting, July 1992. HISTORY: Drafted at the WG5 Victoria Meeting July, 1992 and submitted to X3J3 at meeting 122 X3J3/92-158 approved at meeting 122 -------------------------------------------------------------------------------- NUMBER: 000056 TITLE: TRANSFER intrinsic function description KEYWORDS: Intrinsic functions, examples DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Should the text of Case (iii) under Examples in the TRANSFER intrinsic function be corrected so the example reads: Case (iii): TRANSFER((/1.1,2.2,3.3/),(/ (0.0,0.0) /),1) is a complex rank-one array of length one whose sole element has the value (1.1,2.2)." ANSWER: No. Discussion: The current format of the example, 1.1+2.2i, is valid mathematical notation for complex type. REFERENCES: ISO/IEC 1539:1991 (E) Section 13.13.108. EDITS: None. SUBMITTED BY: Larry Rolison in X3J3/92-059 (121-LRR-6) LAST SIGNIFICANT CHANGE: 1992 11 11, opposite response 000056 HISTORY: Submitted as a request in X3J3/92-059 Draft response first prepared in X3J3/92-091 Subsequent draft in X3J3/92-159, rejected at meetings 121 and 122 Revised response proposed in X3J3/92-294 - approved by unanimous consent at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000057 TITLE: Prohibition against multiple explicit specific interfaces KEYWORDS: specific interfaces, interface body, interface block DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 QUESTION: What is the meaning and/or intent of the following sentence in 12.3.2.1? A procedure must not have more than one explicit specific interface in a given scoping unit." Multiple SPECIFIC interfaces can not be produced by the existence of interface blocks because the definition of an interface body states that it only specifies an EXPLICIT interface, not a SPECIFIC interface. According to the statement in 12.3.2.1: "An external or module subprogram definition specifies a specific interface for the procedures defined in that subprogram", only external or module subprograms have specific interfaces and the specific interfaces are only specified by the text of the subprogram itself. Could an example of code be provided that is prohibited by the statement "a procedure must not have more than one explicit specific interface in a given scoping unit" in 12.3.2.1 and that would not be prohibited by some other provision of ISO/IEC 1539:1991? ANSWER: The statement in the question that "Multiple SPECIFIC interfaces can not be produced by the existence of interface blocks" is incorrect. An example follows. Discussion: The paragraph following the constraints, in 12.3.2.1 is concerned with "specific interfaces" and it was intended to be understood from the context in that discussion that the interface specified by an interface body should be both specific and explicit. See also 14.1.2.4, (2), (a) which shows that it was intended that an interface body define a specific interface. The intention was to disallow the same information being provided twice, as for other specifications. An edit is supplied to make this clearer. An example which illustrates what is prohibited follows: Example: MODULE MOD INTERFACE SUBROUTINE SUB(I,J) INTEGER I,J END SUBROUTINE SUBROUTINE SUB(M,N) ! duplication of SUB is illegal INTEGER M,N END SUBROUTINE END INTERFACE END MODULE REFERENCES: ISO/IEC 1539:1991 (E) section 12.3.2. EDITS: Section 12.3.2.1, the sentence that begins "An interface body..." change "explicit interface" to "explicit specific interface". SUBMITTED BY: L. Rolison LAST SIGNIFICANT CHANGE: 1992-11-12 000057 HISTORY: 120.035, 120.090 Approved as X3J3/92-162A at meeting 122 by unanimous consent Revised following letter ballot at meeting 123 in 92-314 to correct transcription errors in the recording of what was contained in 92-162A. -------------------------------------------------------------------------------- NUMBER: 000058 TITLE: Ambiguous use of "keyword" KEYWORDS: keyword, argument keyword DEFECT TYPE: Erratum STATUS: X3J3 draft response QUESTION: Is the use of "keyword" in 12.4.1 page 172 1st paragraph consistent with the definition of "keyword" in 3.2.1, page 19? Is the definition of keyword in 3.2.1 consistent with the two definitions of keyword in 2.5.2 page 16? In 13.10 page 188 is "keyword" the correct term (or should it be "argument keyword")? ANSWER: For each question, the answer is "NO". There are two different definitions of "keyword", 2.5.2 page 16 and 3.2.1 page 19. Neither definition is complete. The edits below combine these two definitions into one and consistently use "argument keyword" where appropriate. Note that edits 3 and 6 are related to edit 1 in item 4. REFERENCES: ISO/IEC 1539:1991 (E) sections 2.5.2, 3.2.1, 12.4.1,& 13.10 EDITS: 1. Page 5, section 1.5.3, (3) [5:9] delete "keyword actual arguments and" rationale: these are not specifiers and -spec is not used with them. 2. Page 16, section 2.5.2, first paragraph, first occurrence [16:3] change "statement keyword" --------- ------- to "statement keyword (often abbreviated to keyword)" --------- ------- ------- rationale: define "keyword", in a style similar to "object" in 2.4.3.1. 3. Page 16, section 2.5.2, first paragraph, end of [16:5] add "Keywords appear as upper-case words in the syntax rules in Sections 4 through 12". 4. Page 16, section 2.5.2, second paragraph, first sentence [16:6] change "name." to "name (see 12.4.1)." 5. Page 19, section 3.2 [19:35] change "keywords" to "statement keywords (2.5.2)" 6. Page 19, section 3.2.1 [19:37-38] delete rationale: 2.5.2 is now the complete definition. 7. Page 160, section 11.3.3.5, first paragraph, third line [160:29] change "keywords" to "argument keywords" 8. Page 168, the pp following the line "END INTERFACE", second sentence [168:24] replace with "Invocations of these procedures may use argument keywords; for example:" rationale: "keyword calls" is not defined. In general invocations can use both positional and argument keywords. 9. Page 172, 1st paragraph following constraints, 3 occurrences [172:13,16,17] change "a keyword" to "an argument keyword", two occurrences, and change "the keyword" to "the argument keyword" 10. Section 13.3, first sentence [183:37], set "positional arguments" and "keyword arguments" in regular font 11. Page 183, section 13.3, first paragraph, third line, 2 occurrences [183:38] change "the keyword" to "the argument keyword" and change "A keyword" to "An argument keyword" 12. Page 188, section 13.10, first paragraph, first two lines, 2 occurrences [188:12,13] change "keyword" to "argument keyword" and change "keywords" to "argument keywords" 13. Page 363, entry for "argument keywords 183" [363:37] delete rationale: odd to index both singular and plural. "Keyword", and "statement keyword" are indexed to p16, as is the remaining entry for "argument keyword". 14. Annex F, delete entry for "positional arguments" [368:13] SUBMITTED BY: GEN HISTORY: WG5/N808, Question 2. Approved as X3J3/92-164A at meeting 122 by a vote of 17-4 -------------------------------------------------------------------------------- NUMBER: 000059 TITLE: SEQUENCE derived type and component bounds KEYWORDS: SEQUENCE, derived type DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Given two objects of SEQUENCE derived type, can the two objects be of the same derived type if the only difference between the two SEQUENCE derived type definitions is the value of the low bound and high bound for one dimension of one of the components (assuming the extent of the dimension of the array component matches the extent given in the other; and there are no structure components that have PRIVATE accessibility)? The description of when two objects of SEQUENCE derived type have the same type includes the words (2nd paragraph of 4.4.2 "Determination of derived types") "have structure components that do not have PRIVATE accessibility and agree in order, name, and attributes". This text seems to imply that if the derived type includes an then the individual low bounds and high bounds have to be the same. An example that corresponds to the question above: SUBROUTINE S() TYPE T SEQUENCE INTEGER A(1:10) END TYPE TYPE (T) X CALL S2(X) ... SUBROUTINE S2(Y) TYPE T SEQUENCE INTEGER A(2:11) END TYPE TYPE (T) Y ... Do X and Y have the same type? ANSWER: No. Discussion: The attributes that a data object may have are enumerated in section 5.1.2. Included in these is the DIMENSION attribute (section 5.1.2.4). In reference to the explicit shape arrays in the example above, in order for the attributes to agree, the values of the corresponding lower bounds and the corresponding upper bounds in must be equal. REFERENCES: ISO/IEC 1539:1991(E) 5.1.2 EDITS: None. SUBMITTED BY: Janice C. Shepherd X3J3/92-129 HISTORY: X3J3/92-129 Approved as X3J3/92-165A at meeting 122 by a vote of 19-2 Approved in ballot 92-182 -------------------------------------------------------------------------------- NUMBER: 000060 TITLE: Statement function argument references KEYWORDS: statement function arguments DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Consider the following program: PROGRAM TEST INTEGER AR EXTERNAL AR REAL A(2), FUN, X, Y DATA A/2*5./ FUN(X) = X+X+X Y=FUN(A(AR(5))) END INTEGER FUNCTION AR(I) INTEGER I AR = 1 PRINT *, I RETURN END When the statement function is referenced, how many times is the function AR called? Or, to put it another way, how many times is the PRINT statement in function AR executed during the statement function reference? ANSWER: In the program above, the function AR is called once unless the value of the function "can be determined otherwise" than by evaluating the function. Therefore, the PRINT statement in function AR is executed at most once. Discussion: When the statement function is referenced, the actual arguments are evaluated and the resulting values are associated with the corresponding dummy arguments. The statement function FUN has only one actual argument which contains only one reference to the external function AR. Therefore, the function AR is called once as part of the evaluation of the actual argument. The value resulting from this evaluation is associated with the single dummy argument of the statement function FUN. Though the PRINT statement may be executed once, note that 7.1.7.1 gives license to the processor to not execute the PRINT statement at all. Thus the statement in the answer is "the PRINT statement in function AR is executed at most once". REFERENCES: ISO/IEC 1539:1991 (E) sections 7.1.7.1 and 12.5.4, the fourth paragraph after the last constraint EDITS: None. SUBMITTED BY: Linda J. O'Gara LAST SIGNIFICANT CHANGE: 1992 11 13 000060 HISTORY: 121-LJO-3, 121-ADT-11 pages 14-17 Approved as X3J3/92-168 at meeting 122 by a vote of 17-0 Revised after letter ballot at meeting 123, in paper 92-315. Revision approved by unanimous consent in meeting 123. -------------------------------------------------------------------------------- NUMBER: 000061 TITLE: G edit descriptor with "d" = 0 KEYWORDS: G edit descriptor DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 QUESTION: Is a value of 0 for "d" in a G edit descriptor (e.g. 1PG8.0) permitted? ANSWER: Yes. See R1008, R1005, and R404. QUESTION: Did the committee mean to change the definition of G format in Fortran 90 (compared to FORTRAN 77)? ANSWER: Yes. The form of output text produced by the G edit descriptor for some values and particular edit descriptors was intentionally changed. The changes require processors to give meaningful output instead of "*"s for certain values and edit descriptors. QUESTION: What happens when N (the value to be printed) is zero and "d" is zero? ANSWER: The standard indicates a format of F(w-n).-1 is to be used. This is an error in the standard. REFERENCES: ISO/IEC 1539:1991 (E) Rules R404, R1005, and R1008 EDITS: 1. In section 10.5.4.1.2 second paragraph, 3rd sentence, after "- 0.5," add " or N is identically 0 and d is 0,". 2. In section 10.5.4.1.2, second paragraph, fourth sentence, after "N is identically 0" add " and d is not zero". 3. In section 1.4.1, add item (5) as follows: (5) A value of 0 for a list item in a formatted output statement will be formatted in a different form for some G edit descriptors. In addition, the Fortran 90 standard specifies how rounding of values will affect the output field form, but FORTRAN 77 did not address this issue: therefore, some FORTRAN 77 processors may produce a different output form than Fortran 90 processors for certain combinations of values and G edit descriptors. SUBMITTED BY: J.Brixius, 121-JB-1 HISTORY: 121-ADT-7 pp 1-9, 92-076, 92-118 Approved as X3J3/92-149A at meeting 122 by a vote of 20-3 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000062 TITLE: Statement function constraints KEYWORDS: statement function, host association DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 QUESTION: Does the last constraint under R1226 allow variables in a of a statement function definition to be accessed via host association or use association? PROGRAM HOST INTEGER I ... CONTAINS SUBROUTINE INNER() STMTFUNC()=I+1 ... ANSWER: Yes. Discussion: It was the intent of the committee to allow variables made accessible by use or host association to appear in a of a statement function definition. The text of the last constraint under R1226 needs clarification to better reflect that intent. REFERENCES: ISO/IEC 1539:1991 (E) section 12.5.4 EDITS: In the last constraint after R1226 in section 12.5.4 replace "local to" with "accessible in". SUBMITTED BY: J.C.Shepherd X3J3/92-015 HISTORY: Discussed in X3J3/92-046 pp 28-29 Initially drafted as X3J3/92-120 Approved as X3J3/92-160 at meeting 122 by a vote of 23-0 Approved in ballot 92-182 -------------------------------------------------------------------------------- NUMBER: 000063 TITLE: Interfaces and dummy procedure arguments KEYWORDS: interface, dummy procedure DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Given a procedure that has a dummy argument, must an explicit interface for the procedure show sufficient information to indicate that its dummy argument is a dummy procedure? ANSWER: Yes. Discussion: The first sentence of the second paragraph in 12.3.2.1 indicates that an interface body must specify all of the procedures characteristics. Section 12.2 indicates that a procedure's characteristics include the characteristics of its arguments. Therefore, an interface body must include an EXTERNAL statement or a nested interface block for each dummy argument that is a dummy procedure, even though this may not be necessary in the procedure definition. REFERENCES: ISO/IEC 1539:1991 (E) Sections 12.2 and 12.3.2.1 EDITS: None. SUBMITTED BY: J.C.Shepherd, X3J3/92-016 HISTORY: Approved as X3J3/92-161 at meeting 122 by a vote of 24-0 Approved in ballot 92-182 -------------------------------------------------------------------------------- NUMBER: 000064 TITLE: SPACING result for 0.0 KEYWORDS: SPACING intrinsic DEFECT TYPE: Erratum STATUS: X3J3 approved; ready for WG5 QUESTION: Is the SPACING intrinsic function intended to return absolute spacing of model numbers about 0.0 when its argument is 0.0? Section 13.12.100 under Result Value specifies that the result should be b**(e-p); this is not equal to the absolute spacing of model numbers around zero because zero has e == 0, so b**(e-p) provides a much larger value than expected. ANSWER: Yes. Discussion: Since the smallest magnitude model numbers are TINY(X) and -TINY(X), the absolute spacing around zero is TINY(X). It was intended that the "otherwise" clause of the SPACING definition apply to this case. REFERENCES: ISO/IEC 1539:1991 (E) Sections 12.7.1 and 13.13.100. EDITS: In section 13.13.100, after "Result Value." change "The" to "If X is not zero, the". In the same section, change "; otherwise " to ". Otherwise". SUBMITTED BY: J.K.Reid HISTORY: WG5/N786a item 234/7, N815a item 6 (X3J3/92-136 item 6) Approved as X3J3/92-171 at meeting 122 by a vote of 22-0 Edit approved in 92-267r at meeting 123 -------------------------------------------------------------------------------- NUMBER: 000065 TITLE: Block and nonblock DO construct KEYWORDS: block DO construct, nonblock DO construct DEFECT TYPE: Interpretation STATUS: X3J3 approved; ready for WG5 QUESTION: Consider the following DO loop: DO 10, I = 1, 10 K = I 10 CONTINUE It can be parsed using either of the following two paths: R816 is R817 is R818 is R819 is DO