From jkr@jkr.cc.rl.ac.uk  Tue Jul  4 19:13:41 2000
Received: from nameserv.rl.ac.uk (nameserv.rl.ac.uk [130.246.135.129])
	by dkuug.dk (8.9.2/8.9.2) with ESMTP id TAA26202
	for <SC22WG5@dkuug.dk>; Tue, 4 Jul 2000 19:13:40 +0200 (CEST)
	(envelope-from jkr@jkr.cc.rl.ac.uk)
Received: from jkr.cc.rl.ac.uk (jkr.cc.rl.ac.uk [130.246.8.20])
	by nameserv.rl.ac.uk (8.8.8/8.8.8) with ESMTP id SAA27995
	for <SC22WG5@dkuug.dk>; Tue, 4 Jul 2000 18:13:39 +0100
Received: (from jkr@localhost)
	by jkr.cc.rl.ac.uk (8.8.8+Sun/8.8.8) id SAA07049
	for SC22WG5@dkuug.dk; Tue, 4 Jul 2000 18:14:44 +0100 (BST)
Date: Tue, 4 Jul 2000 18:14:44 +0100 (BST)
From: John Reid <jkr@rl.ac.uk>
Message-Id: <200007041714.SAA07049@jkr.cc.rl.ac.uk>
To: SC22WG5@dkuug.dk
Subject: WG5 letter ballot on Fortran 95 interpretations, part 2
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"


Dear WG5 members,

I am very sorry. In the ballot I sent out recently, I overlooked the
four interpretations that have been ready for WG5 ballot since 1996.  I
would like to ballot these, too, and they are enclosed.  This will also
be document N1392.

I also forgot to state a deadline, which will be 7 August. I have
chosen this date to allow the results to be available in Oulu.

The rules we operate on say:

4. The chair of J3/interp gathers all interp answers that are marked
   "passed by J3 letter ballot" and forwards them to the WG5 convenor.
   The WG5 convenor holds a ballot of individual members; a no vote
   must be accompanied by an explanation of the changes necessary to
   change the member's vote to yes. The answers that pass this ballot
   become "WG5 approved".

   J3/interp reserves the right to recall an interp answer for more
   study even if the answer passes.

5. "WG5 approved" answers are processed into a corrigendum document by
   taking the edits from the interp answers and putting them in the
   format required by ISO.  A WG5 vote is made on forwarding the
   corrigendum to SC22.

The following Fortran 95 interpretations are being balloted: 

Yes    No    Number     Title

---    ---   F90/000100 ASSOCIATED intrinsic and zero-sized objects

---    ---   F90/000179 DO variable with POINTER attribute

---    ---   F90/000185 What is the allocation status of an array 
                        after an allocation failure?

---    ---   F90/000194 Statements between SELECT CASE and CASE


The text of these interpretetions is attached.  Each interpretation
starts with a row of "-"s.

Please mark the above "yes" or "no" answer {be sure to include your
reasons with "no"} and send only the above text {not this entire mail
mail message} to 

        sc22wg5@dkuug.dk

before 7 August 2000.

----------------------------------------------------------------------

NUMBER: F90/000100
TITLE: ASSOCIATED intrinsic and zero-sized objects
KEYWORDS: ASSOCIATED intrinsic, zero-sized objects, target, pointer
DEFECT TYPE: Interpretation
STATUS: J3 approved; ready for WG5

QUESTION: What is the behavior of the ASSOCIATED intrinsic function for
zero-sized arguments?

Question 1: Can the single argument form of the ASSOCIATED intrinsic return true
as its result if the argument's target is zero sized?

Question 2: Can the two-argument form of the ASSOCIATED intrinsic return true
when both arguments are zero sized?

The following need answers only if the answer to question 2 is yes.

Question 2a: If the arguments to ASSOCIATED are zero sized but of rank greater
than one, must the extents of each dimension be the same for ASSOCIATED to
return true?  For example, what is printed by the following program?

       PROGRAM HUH
         REAL, DIMENSION(:,:), POINTER :: P1, P2
         REAL, DIMENSION(10, 10), TARGET :: A
         P1 => A(10:9:1, :)
         P2 => A(:, 10:9:1)
         PRINT *, ASSOCIATED (P1, P2)
       END

Question 2b: In the following example, rank, shape, type, kind type parameters,
and extent of dimensions of the zero-sized arguments to ASSOCIATED match, but
the second argument is not the same as the right hand side of the previous
pointer assignment statement.  What is the output of this program?  (Does a
notion of "base address" come to play for zero-sized objects as it does for
nonzero-sized objects?)

       PROGRAM HMMM
       REAL, DIMENSION(:,:),    POINTER :: P1
       REAL, DIMENSION(10, 10), TARGET :: A
       P1 => A(:, 2:1:1)
       PRINT *, ASSOCIATED (P1, A(:, 3:2:1))
       END

ANSWERS:

Answer 1: The one-argument form of ASSOCIATED returns a result of true if the
pointer actual argument is currently associated with a target, even if the
target is zero sized.

Answer 2: No; if either argument is zero sized the result is false.  The
edits in defect item 000027 clarify the intent.

Answer 2a: The result is false because P1 and P2 each are zero sized.

Answer 2b: The result is false because the arrays are of zero size.

Discussion: The reasons for having the ASSOCIATED function return false for
zero-sized arrays is based on an analogy with sharing storage and how assignment
works.

In normal English we understand the concept of "totally associated" and
"partially associated".  If two things are totally associated then doing
something to one of them does the exact same thing to the other.  If two things
are partially associated then doing something to one of them does something to
the other.  Section 14.6.3.3 hints at this by discussing "totally associated" in
terms of "the same storage sequence".

After executing assignment statements like

   I = values
   J = different_values

we would call I and J associated if it were no longer true that I is
equal to values.

Zero-sized arrays are the end case where doing "something" to them is equivalent
to doing nothing to them.  And in the example above we would still have I is
equal to values after the assignment if both I and J were zero-sized but would
otherwise appear to be associated.

We could also conclude that after the pair of assignment statements above
executed we would have I is equal to different_values if I and J were zero
sized, since the comparison operators return true for zero-sized objects.
However, on balance it seems better to view the comparison with the initial
conditions, not the potential changed conditions.

As a practical matter, sensible use of the ASSOCIATED function with zero-sized
arrays will usually require user special casing of the results.

EDITS: None.

SUBMITTED BY: Jon Steidel - X3J3/92-240
HISTORY: ui 114 (jw note)
         92-240   m123 Submitted
         93-035   m124 response, adopted by unanimous consent
         93-111   m125 ballot, return to subgroup based on Hirchert, Maine
                    comments. Also see Ellis comment for 000108
         93-138r  m125 revised response adopted 11-8.
         93-255r1 m127 ballot passed 21-3
         94-160   m129 WG5 ballot, failed
         94-253r3 m130 revised response, approved u.c.
         94-306   m131 X3J3 ballot, approved 15-4
         95-044   m132 WG5 ballot, approved, with Reid edit
         95-306r1 m135 withdrew edits as defect item 27 supplies better edits,
                       approved u.c.
         96-      m136 X3J3 ballot, approved 15-1
----------------------------------------------------------------------

NUMBER: F90/000179
TITLE: DO variable with POINTER attribute
KEYWORDS: DO variable, POINTER attribute
DEFECT TYPE: Interpretation
STATUS: J3 approved; ready for WG5

QUESTION: The first constraint following rule R822 states:

 "Constraint:  The <do-variable> must be a named scalar variable of type
               integer, default real, or double precision real."

The definition of loop initiation (8.1.4.4.1) states:

  "(2) The DO variable becomes defined with the value of the initial
       parameter <m>1."

The definition of the execution cycle of a DO loop (8.1.4.4.2) states:

  "(3) ... The DO variable, if any, is incremented by the value of the
       incrementation parameter <m>3."

Consider the following program:

      INTEGER, POINTER  :: PTR
      INTEGER, TARGET   :: LCV

      PTR => LCV

      DO PTR = 1, 3
        PRINT *, LCV
      END DO

      END

Note that the DO variable has the POINTER attribute.  The POINTER attribute does
not seem to be prohibited for the DO variable, but when the DO variable has the
POINTER attribute, it is unclear as to whether the DO variable is the pointer or
the target of the pointer.  That is, it is unclear as to whether the pointer or
the target is to be "defined" (8.1.4.4.1) or incremented (8.1.4.4.2).

Also consider the following modification of the above program:

      INTEGER, POINTER  :: PTR
      INTEGER, TARGET   :: LCV1, LCV2

      LCV1 = 1
      LCV2 = 4

      PTR => LCV1

      DO PTR = 1, 3
        IF (...) PTR => LCV2    ! An alternate EXIT form?
      END DO

      END

The standard does not seem to address what happens when the DO variable is
switched to a different variable while the loop is active.

Is it the intent of the standard to permit a DO variable with the
POINTER attribute?

ANSWER: Yes, a DO variable may have the POINTER attribute.

Discussion: There are a number of contexts in the language where the target
of a pointer is referenced or defined when it is the pointer name that appears.
Two of these are cited in items (2) and (3) in the Question. In (2), the
target of the pointer variable is defined with the value of the DO loop initial
value parameter. In (3), the target of the pointer variable is incremented.
Other examples of these kinds of contexts are:

 * Section 6.3.1, which describes the ALLOCATE statement:
   "If the STAT= specifier is present, successful execution of the ALLOCATE
    statement causes the <stat-variable> to become defined with a value of
    zero."

 * Section 9.4.1.5, which describes the semantics of the I/O error branch:
   "(2) If the input/output statement also contains an IOSTAT= specifier,
        the variable specified becomes defined with a processor-dependent
        positive integer value,"

In contexts such as these, the variable involved may have the POINTER attribute
and it is the intent of the standard that it is the target of the pointer that
is being defined, incremented, etc.

With respect to the modified example in the Question, the standard does address
what happens when the DO variable appears on the left hand side of a pointer
assignment. In the modified example in the Question, the statement

  IF (...) PRT => LCV2   ! An alternate EXIT form?

is prohibited. Section 14.7.6 states:

  "(18) Execution of a pointer assignment statement that associates a pointer
        with a target that is defined causes the pointer to become defined."

but section 8.1.4.4.2 states:

  "Except for the incrementation of the DO variable that occurs [when the DO
   variable is incremented by the value of the incrementation parameter],
   the DO variable must neither be redefined nor become undefined while the
   DO construct is active."

Thus, since the pointer assignment statement causes the DO variable to become
(re)defined, it is prohibited.

Similarly, if the modified example had contained within the DO construct
an assignment statement such as:

     PRT = 10

such an assignment statement would also be prohibited because defining the
target of a pointer also defines the pointer as stated in section
14.6.2.2:

   "The definition status of a pointer is that of its target."

EDITS: None.

SUBMITTED BY: Larry Rolison
HISTORY: 94-226r1 m130 submitted, approved 10-1
         94-306   m131 X3J3 ballot approved 19-0
         95-044   m132 WG5 ballot, failed see Cohen's comments
         95-246   m134 revised edits, approved u.c.
         95-256   m135 X3J3 ballot, failed 10-6
         95-304r1 m135 revised response, delete edits, approved u.c.
         96-      m136 X3J3 ballot, approved 15-1
----------------------------------------------------------------------

NUMBER: F90/000185
TITLE: What is the allocation status of an array after an allocation failure?
KEYWORDS: ALLOCATE, POINTER, DEALLOCATE, status
DEFECT TYPE: Interpretation
STATUS: J3 approved; ready for WG5

QUESTION: It does not appear that the standard defines the allocation status of
an array if an ALLOCATE statement fails and returns a nonzero STAT= value?

Given a program segment such as:

        REAL, ALLOCATABLE, DIMENSION(:) :: A,B,C
        ALLOCATE(A(10), B(10), C(10), STAT = ISTAT)

Question 1: If "ISTAT" comes back non-zero, is it legal to deallocate the
arrays and try to reallocate them with smaller sizes?

Question 2: If instead of allocatable arrays, the variables had been pointers,
is it legal to NULLIFY them?

Question 3: Are the answers to questions 1 and 2 different if a single array
is allocated rather than a list?

Question 4: If a DEALLOCATE fails for a list, what is the allocation status
of the arrays?

Question 5: Is it acceptable to use the ALLOCATED and/or ASSOCIATED functions
to attempt to recover from a failure?

Question 6: 6.3.1.1 might be read to mean that successful allocation makes
the arrays "currently allocated" and otherwise leaves them "not currently
allocated".  But that's not an obvious reading of the text. In some ways I/O
is similar to allocate (they both process a list of things and have a STAT=
clause).  If an input statement fails then everything in the list becomes
undefined.  Does that apply by analogy to ALLOCATE?

ANSWER 1: Yes.  Note that one or more of the arrays is expected to have an
allocation status of "currently not allocated", due to the error which occurred.
See the Discussion below.

Note that this example only used allocatable arrays.  If a pointer appears in a
DEALLOCATE statement, its pointer association status must be defined (section
6.3.3.2).  See the Discussion below.

ANSWER 2: Yes.  See section 14.6.2.3.

ANSWER 3: No, the answers are the same.  See Answer 6 below.

ANSWER 4: When a DEALLOCATE with a "STAT=" specifier fails, those arrays that
were successfully deallocated will have an allocation status of deallocated.
Those arrays not successfully deallocated retain their previous allocation
status.

ANSWER 5: For ALLOCATED, yes.  For ASSOCIATED, it depends on the pointer
association status of the pointer at the time the ASSOCIATED intrinsic is
called.

The ALLOCATED intrinsic may be called with any allocatable array whose
allocation status is either currently allocated or currently not allocated.

The ASSOCIATED intrinsic must not be called with a pointer whose pointer
association status is undefined (section 6.3.3.2).  See the Discussion below.

ANSWER 6: No.  The standard does not require a processor to allocate the
variables specified in an ALLOCATE statement as a group; therefore, a
processor may successfully allocate some of the arrays specified in an
ALLOCATE statement even when that ALLOCATE statement assigned a positive value
to the variable specified in the STAT= specifier.

Discussion: Only when the allocation status of an array is undefined is it
illegal to specify the array in a DEALLOCATE statement. The only way for
an allocatable array to have a status of undefined is described in section 14.8,
item (3). If an array specified in a DEALLOCATE statement has an allocation
status of not currently allocated when the DEALLOCATE statement is executed,
an error condition occurs as described in section 6.3.3.1. The behavior of the
DEALLOCATE statement in the presence of an error condition is described in
section 6.3.3.

Immediately after the execution of an ALLOCATE statement, all allocatable arrays
specified in that ALLOCATE statement will have a defined allocation status.
The arrays that were successfully allocated will have an allocation status
of allocated, while any arrays not successfully allocated will retain their
previous allocation status.

When a pointer is specified in an ALLOCATE statement which fails (assigns a
positive value to ISTAT in this example), then the pointer association status
of that pointer will not be changed if the allocation failed for that particular
pointer. If that pointer previously had a pointer association status of
undefined, it will still have a pointer association status of undefined
immediately after the ALLOCATE statement is executed; therefore, it would be
illegal to specify that pointer in a DEALLOCATE statement (section 6.3.3.2) or
in a call to the ASSOCIATED intrinsic (section 13.13.13), unless the allocation
status of the pointer was first changed to be defined (either associated or
disassociated).

EDITS: None.

SUBMITTED BY:  Dick Hendrickson
HISTORY: 94-296   m131 submitted
         95-039   m132 draft response, approved u.c.
         95-101   m133 X3J3 ballot approved, 12-6
         95-310r1 m135 revised response to be consistent with F95, approved u.c.
         96-      m136 X3J3 ballot approved, 15-1
----------------------------------------------------------------------

NUMBER: F90/000194
TITLE: Statements between SELECT CASE and CASE
KEYWORDS: FORMAT statement, DATA statement, SELECT CASE statement,
          CASE statement, INCLUDE line, statement order
DEFECT TYPE: Interpretation
STATUS: J3 approved; ready for WG5

QUESTION:
1. Figure 2.1 (page 11) shows that FORMAT and DATA statements may be intermixed
with executable constructs but it is not clear at what points within an
executable construct these statements may appear.  In particular, may FORMAT
and DATA statements appear between the SELECT CASE statement and the first
CASE statement of a CASE construct?

2. May an INCLUDE line appear between the SELECT CASE statement and the first
CASE statement of a CASE construct?

ANSWER:

1.  No.  In general, FORMAT and DATA statements may appear in the IF, CASE and
DO executable constructs because these constructs contain blocks and a block is
defined in section 8.1 (on page 95) to consist of <execution-part-construct>s,
which in turn are defined as being made up of FORMAT and DATA statements, among
others.  However, the syntax rules for the CASE construct do not provide for any
blocks or any other statements to appear between the SELECT CASE statement and
the first CASE statement of a CASE construct.

The sentence in 8.1 [95:12] that defines a block in prose introduces the
general concept of a block, and does not precisely define the BNF term.
The BNF syntax rules give the precise definition.

2.  Yes.  An INCLUDE line may appear between a SELECT CASE statement and the
first CASE statement of a CASE construct because an INCLUDE line is a line, not
a statement.

EDITS: None.

SUBMITTED BY:  Larry Rolison
HISTORY: 94-383r1 m131 submitted with proposed response, approved 13-3
         95-034r1 m132 X3J3 ballot approved 19-1, with edits
         95-116   m133 (N1112) correct typo in answer 2.
         95-305r1 m135 changed to match F95 approved edits, approved u.c.
         96-      m136 X3J3 ballot approved 16-0
----------------------------------------------------------------------


