From owner-sc22wg5+sc22wg5-dom9=www.open-std.org@open-std.org  Wed Sep 20 11:00:18 2023
Return-Path: <owner-sc22wg5+sc22wg5-dom9=www.open-std.org@open-std.org>
X-Original-To: sc22wg5-dom9
Delivered-To: sc22wg5-dom9@www.open-std.org
Received: by www.open-std.org (Postfix, from userid 521)
	id E1C7A3569F4; Wed, 20 Sep 2023 11:00:17 +0200 (CEST)
Delivered-To: sc22wg5@open-std.org
Received: from nag-j.co.jp (bvdeuz19.secure.ne.jp [180.222.80.19])
	by www.open-std.org (Postfix) with SMTP id 71EB3356973
	for <sc22wg5@open-std.org>; Wed, 20 Sep 2023 11:00:14 +0200 (CEST)
Received: (qmail 83203 invoked from network); 20 Sep 2023 18:00:13 +0900
Received: from unknown (HELO Maru10) (218.42.159.105)
  by 0 with SMTP; 20 Sep 2023 18:00:13 +0900
From: "Malcolm Cohen" <malcolm@nag-j.co.jp>
To: "'WG5'" <sc22wg5@open-std.org>
References: <DM6PR12MB31302BD1D034319D5CD42B7ACBF1A@DM6PR12MB3130.namprd12.prod.outlook.com> <20230912161937.ED0F6356986@www.open-std.org> <493F5A4F-8746-4CA4-ACF7-554B71168255@nasa.gov> <20230912184902.A227F35699F@www.open-std.org> <20230914051137.8F0F93569EF@www.open-std.org> <20230914132511.A9155356742@www.open-std.org> <20230919074924.5A64A356969@www.open-std.org> <20230919085702.1ECCF3569C0@www.open-std.org> <73963378-8AB0-447B-8BA0-EC90F07B0FEF@nasa.gov> <DM6PR12MB3130F647EF16E1D055CCD673CBFAA@DM6PR12MB3130.namprd12.prod.outlook.com>
In-Reply-To: <DM6PR12MB3130F647EF16E1D055CCD673CBFAA@DM6PR12MB3130.namprd12.prod.outlook.com>
Subject: RE: [J3] [SC22WG5.6488] [EXTERNAL] [BULK]   Subobject of a variable
Date: Wed, 20 Sep 2023 18:00:14 +0900
Message-ID: <02d301d9eba0$de4a5b50$9adf11f0$@nag-j.co.jp>
MIME-Version: 1.0
Content-Type: multipart/alternative;
	boundary="----=_NextPart_000_02D4_01D9EBEC.4E36BE40"
X-Mailer: Microsoft Outlook 16.0
Thread-Index: AQG/qXZQcGIQLpZ1F3Ca3tHLE/EEbAFGgQaEAuD8HXAB7pdlIQFRoAeAAhuw4kIC1WjZxwJ3QBx3AbrjyQ0B8n/94a/EAnYA
Content-Language: ja
Sender: owner-sc22wg5@open-std.org
Precedence: bulk

This is a multipart message in MIME format.

------=_NextPart_000_02D4_01D9EBEC.4E36BE40
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit

One last thing.

 

"unspecified locality" is not "inferred locality". Unspecified locality is
its own thing, just as "unspecified intent" is also its own thing. It is not
always the case that unspecified locality acts as if it were one of the
specified possibilities.

 

Yes, it is horrible. That's why we added specified locality. Unspecified is
just there for (a) the easy cases, and (b) to maintain backward
compatibility.

 

Cheers,

-- 

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

 

From: J3 <j3-bounces@mailman.j3-fortran.org> On Behalf Of Jeff Hammond via
J3
Sent: Tuesday, September 19, 2023 10:59 PM
To: Clune, Thomas L. (GSFC-6101) <thomas.l.clune@nasa.gov>; General J3
interest list <j3@mailman.j3-fortran.org>
Cc: Jeff Hammond <jehammond@nvidia.com>; WG5 <sc22wg5@open-std.org>; Malcolm
Cohen <malcolm@nag-j.co.jp>
Subject: [J3] [SC22WG5.6488] [EXTERNAL] [BULK] Subobject of a variable

 

Okay, but we are saying that, in the context of do concurrent, locality
obviously propagates to subobjects, but (un)definedness obviously doesn't.

 

This bothers me because we use (un)definedness to infer the locality of
variables with unspecified locality.  It is hard for me to understand how I
can apply the locality inference rules when the inferred locality
propagates, but the rules used for that inference don't.

 

Jeff

 

From: Clune, Thomas L. (GSFC-6101) <thomas.l.clune@nasa.gov
<mailto:thomas.l.clune@nasa.gov> >
Date: Tuesday, 19. September 2023 at 16.17
To: General J3 interest list <j3@mailman.j3-fortran.org
<mailto:j3@mailman.j3-fortran.org> >
Cc: Jeff Hammond <jehammond@nvidia.com <mailto:jehammond@nvidia.com> >, WG5
<sc22wg5@open-std.org <mailto:sc22wg5@open-std.org> >, Malcolm Cohen
<malcolm@nag-j.co.jp <mailto:malcolm@nag-j.co.jp> >
Subject: Re: [EXTERNAL] [BULK] [J3] [SC22WG5.6486] Subobject of a variable


External email: Use caution opening links or attachments 

 

I do not find this situation odd.    Lots of things don't propagate to
subobjects.      E.g., if an array is allocatable, it's elements are not.
If an array is pointer, it's elements are not.

 

And "undefinedness" is very much a property of subobjects.   Indeed, a
variable is only defined if all of its subobjects are defined.  (I hope I
have that right.)

 

*	Tom

 

From: J3 <j3-bounces@mailman.j3-fortran.org
<mailto:j3-bounces@mailman.j3-fortran.org> > on behalf of j3
<j3@mailman.j3-fortran.org <mailto:j3@mailman.j3-fortran.org> >
Reply-To: j3 <j3@mailman.j3-fortran.org <mailto:j3@mailman.j3-fortran.org> >
Date: Tuesday, September 19, 2023 at 4:57 AM
To: j3 <j3@mailman.j3-fortran.org <mailto:j3@mailman.j3-fortran.org> >
Cc: Jeff Hammond <jehammond@nvidia.com <mailto:jehammond@nvidia.com> >, WG5
<sc22wg5@open-std.org <mailto:sc22wg5@open-std.org> >, Malcolm Cohen
<malcolm@nag-j.co.jp <mailto:malcolm@nag-j.co.jp> >
Subject: [EXTERNAL] [BULK] [J3] [SC22WG5.6486] Subobject of a variable

 


CAUTION: This email originated from outside of NASA.  Please take care when
clicking links or opening attachments.  Use the "Report Message" button to
report suspicious messages to the NASA SOC. 





If a variable has unspecified locality,

- if it is referenced in an iteration it shall either be previously defined
during that iteration, or shall not be defined or become undefined during
any other iteration; if it is defined or becomes undefined by more than one
iteration it becomes undefined when the loop terminates;

real, dimension(10) :: A

 

do concurrent (integer :: k=1:size(A))

  A(k) = k

  if (k.eq.1) A(10) = 0

end do

 

As best I can tell, A(1:9) are defined after the loop terminates, while
A(10) and A are not.  Does the fact that A is undefined before and becomes
undefined during this loop imply anything about the undefined-ness of its
elements during the loop or must one reason about them strictly
independently, based on the element-wise defined/undefined-ness?

 

Now suppose I make A shared.  Malcolm said all the elements of A are shared
as well "It's not written there now, because, like, how could it possibly be
anything else?"

 

real, dimension(10) :: A

 

do concurrent (integer :: k=1:size(A)) shared(A)

  A(k) = k

  if (k.eq.1) A(10) = 0

end do

 

It is odd to me that the shared-ness of A propagates to its elements but the
undefined-ness does not.  Why must I reason about the element-wise behavior
of an array independent of the array itself when worrying about whether a
variable becomes undefined or defined during a loop, but in the same
context, they are obviously not independent regarding locality?

 

Jeff

 





On 19. Sep 2023, at 10.49, Malcolm Cohen via J3 <j3@mailman.j3-fortran.org
<mailto:j3@mailman.j3-fortran.org> > wrote:

 


External email: Use caution opening links or attachments

 

Hi Brad,

 

There is no doubt that subobject includes array elements.

 

The point is that a subobject of a variable is itself a variable. So nothing
more needs to be said on that front.

 

But in the case of a subobject of a constant, that is often not constant.
E.g.

   INTEGER,PARAMETER :: x(10) = [ 1,2,3,4,5,6,7,8,9,10 ]

   READ *,I

   PRINT *,x(I) 

 

Here, X(I) is not a variable, and is also not a constant. It is a
non-constant subobject of a constant!

 

That is what those words are there for. They are not intended to imply that
subobjects of a variable are not data objects. They are simply because they
are also variables, indeed, portions that can be defined and redefined
separately, and being capable of being defined and redefined makes them
variables.

 

We could add a NOTE to say that "A subobject of a variable is a variable,
but a subobject of a constant is not necessarily itself constant, e.g. if it
has a non-constant subscript." Not sure it is really worth it though, at
least, not until we decide what to do with our overly-large set of terms.

 

Cheers,

--

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

 

From: Brad Richardson < <mailto:everythingfunctional@protonmail.com>
everythingfunctional@protonmail.com> 
Sent: Thursday, September 14, 2023 10:25 PM
To: General J3 interest list < <mailto:j3@mailman.j3-fortran.org>
j3@mailman.j3-fortran.org>; 'WG5' < <mailto:sc22wg5@open-std.org>
sc22wg5@open-std.org>
Subject: [ukfortran] [SC22WG5.6484] [J3] RE: [EXTERNAL] [BULK] are race
conditions allowed in do concurrent?

 

Hi Malcolm,

 

> >variable/data entity/data object

> >[are] circular, and doesn't seem to include individual array elements

 

> Yes it does, see 3.138 subobject.

 

While I see that it probably intends to include it, what it actually says is

 

subobject of a constant

 

so the edit would be to change it to

 

subobject of a variable or constant

 

I don't think the circularity is causing too much confusion, so I don't see
much urgency in trying to fix it, and don't quite see an easy way to do so.
I think we can leave it for now.

 

Regards,

Brad

 

On Thu, 2023-09-14 at 14:04 +0900, Malcolm Cohen via J3 wrote:

Hi Brad,

 

There is no contradiction, subtle or otherwise, here.

 

Locality-specs are only for named variables. However, as noted, subobjects
of variables are also variables.

 

> The way I've heard "definition" applied to arrays is that definition of an
element of an array does not constitute definition of the variable,

 

Correct (except in the trivial case of an array with a single element). This
is all spelled out explicitly: defining every "part" of a multi-part
variable defines the variable.

 

I can see some potential wording improvements for the next revision, but
nothing that rises to the level of a defect.

 

E.g. it may be better to mention that "if a variable has SHARED locality,
all of its subobjects have SHARED locality". It's not written there now,
because, like, how could it possibly be anything else? There is nothing else
it could be.  But making it explicit would lead naturally into writing "If a
variable with SHARED locality is defined." instead of the current "If it is
defined.".

 

>variable/data entity/data object

>[are] circular, and doesn't seem to include individual array elements

 

Yes it does, see 3.138 subobject.

 

The circularity is unfortunate, but they are all reasonably worded for
comprehensibility (not for trail-following). So it's either deleting one of
them (ugh) or rewording one to break the circle without making it hard to
understand (it's not obvious exactly what to do here, which is why it is
still like this).

 

If it were a glossary of terms, instead of a list of definitions, there
would be no problem with circularity, right?

 

Anyway, I agree it would be good to fix it as long as it doesn't make any
individual term hard to understand.

 

Given our experience this time around, I would be in favour of pruning our
terms and definitions, down to a more minimal set. If there are "useful"
terms that do not lend themselves to trivial drop-in replacement, and I
think there are, we could consider adding a "Glossary" (of "useful terms",
but probably better not to call them "terms"!).

 

Cheers,

--

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

 

From: Brad Richardson < <mailto:everythingfunctional@protonmail.com>
everythingfunctional@protonmail.com> 
Sent: Wednesday, September 13, 2023 3:49 AM
To: General J3 interest list < <mailto:j3@mailman.j3-fortran.org>
j3@mailman.j3-fortran.org>; WG5 < <mailto:sc22wg5@open-std.org>
sc22wg5@open-std.org>
Subject: [ukfortran] [SC22WG5.6480] [EXTERNAL] [BULK] [J3] are race
conditions allowed in do concurrent?

 

Hmm... I decided to work through this a bit more thoroughly.

 

From the syntax definitions:

 

R902

variable

is designator

or function-reference

 

R901

designator

is object-name

or array-element

or array-section

or coindexed-named-object

or complex-part-designator

or structure-component

or substring

 

 

Ok, so according to the syntax an array element is a variable.

 

From the terms and definitions:

 

variable

data entity (3.41) that can be defined (3.48) and redefined during execution
of a program

 

data entity

data object (3.42), result of the evaluation of an expression, or the result
of the execution of a function reference

 

data object

constant, variable, or subobject of a constant

 

which is circular, and doesn't seem to include individual array elements.

 

So now the question is which "definition" does the DO CONCURRENT constraint
refer to?

 

From the syntax definitions:

 

R1129

concurrent-locality

is

[ locality-spec ]...

 

R1130

locality-spec

is LOCAL ( variable-name-list )

or LOCAL_INIT ( variable-name-list )

or REDUCE ( reduce-operation : variable-name-list )

or SHARED ( variable-name-list )

or DEFAULT ( NONE )

 

only allows variable-name, not designator, so it's not exactly clear.

 

The "constraint" appears in normative text, I.e.

 

If a variable has

 

which is not hyperlinked and is not in a font indicating reference to the
syntax term.

 

My reading of this is that we have a subtle contradiction between the syntax
and normative terms. My guess is that the syntax meaning (i.e. an array
element is a variable) is what is intended for the rules here, and thus it's
valid to (un)define *different* elements of an array in separate iterations,
but not valid to (un)define and reference the same element of an array in
separate iterations.

 

I think it would be worth "fixing" the terms and definitions to eliminate
the circular definition and make it consistent with the syntax.

 

Regards,

Brad

 

On Tue, 2023-09-12 at 17:37 +0000, Clune, Thomas L. (GSFC-6101) wrote:

"Variable" does not mean what we think it means:     <variable>   <<is>>
<designator> <<or>> <function-reference>

 

And <designator> includes <array-element>.

 

But I for one would not mind an explanatory note that clarifies the common
use case of array elements in this context. 

 

 

 

From:J3 < <mailto:j3-bounces@mailman.j3-fortran.org>
j3-bounces@mailman.j3-fortran.org> on behalf of j3 <
<mailto:j3@mailman.j3-fortran.org> j3@mailman.j3-fortran.org>
Reply-To: j3 < <mailto:j3@mailman.j3-fortran.org> j3@mailman.j3-fortran.org>
Date: Tuesday, September 12, 2023 at 12:19 PM
To: j3 < <mailto:j3@mailman.j3-fortran.org> j3@mailman.j3-fortran.org>, WG5
< <mailto:sc22wg5@open-std.org> sc22wg5@open-std.org>
Cc: Brad Richardson < <mailto:everythingfunctional@protonmail.com>
everythingfunctional@protonmail.com>
Subject: [EXTERNAL] [BULK] [J3] [SC22WG5.6477] are race conditions allowed
in do concurrent?

 


CAUTION: This email originated from outside of NASA.  Please take care when
clicking links or opening attachments.  Use the "Report Message" button to
report suspicious messages to the NASA SOC.








Hi Jeff,

 

Based on " If it is defined or becomes undefined during any iteration, it
shall not be referenced, defined, or become undefined during any other
iteration.", the provide program is invalid, because `x` becomes defined in
more than one iteration.

 

The way I've heard "definition" applied to arrays is that definition of an
element of an array does not constitute definition of the variable, because
it is then only partially defined. I.e. an array is only defined once each
of its elements has been defined.

 

My opinion is that the above constraint simply does not adequately
describe/is still ambiguous about the case of arrays. I think an interp
would be warranted, and we should say that an element of an array should
have the same constraint as above if the variable is shared.

 

Regards,

Brad

 

On Tue, 2023-09-12 at 14:43 +0000, Jeff Hammond via J3 wrote:

Is this a legal program in Fortran with defined behavior?  If it is illegal
or the behavior is undefined, where do we say that?

 

program main

  integer :: k

  real :: x

  x = 0.0

  do concurrent (k=1:2) shared(x)

    x = real(k)

  end do

  print*,x

end program main

 

Is that what the following is intended to do?

 

"If a variable has SHARED locality, appearances of the variable within the
DO CONCURRENT construct refer to the variable in the innermost executable
construct or scoping unit that includes the DO CONCURRENT construct. If it
is defined or becomes undefined during any iteration, it shall not be
referenced, defined, or become undefined during any other iteration."

 

If so, then I am struggling to apply this to arrays.  When we say a variable
has shared locality, is the variable the array or the element?  We can only
put array names in SHARED(), but applying the text regarding "to become
defined" from the perspective of arrays appears to have interesting
consequences.

 

Thanks,


Jeff

 


------=_NextPart_000_02D4_01D9EBEC.4E36BE40
Content-Type: text/html;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

<html xmlns:v=3D"urn:schemas-microsoft-com:vml" =
xmlns:o=3D"urn:schemas-microsoft-com:office:office" =
xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" =
xmlns=3D"http://www.w3.org/TR/REC-html40"><head><meta =
http-equiv=3DContent-Type content=3D"text/html; =
charset=3Dus-ascii"><meta name=3DGenerator content=3D"Microsoft Word 15 =
(filtered medium)"><style><!--
/* Font Definitions */
@font-face
	{font-family:Wingdings;
	panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:"Yu Gothic";
	panose-1:2 11 4 0 0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
	{font-family:Verdana;
	panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
	{font-family:"Yu Gothic";
	panose-1:2 11 4 0 0 0 0 0 0 0;}
@font-face
	{font-family:LMRoman10;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0cm;
	font-size:10.0pt;
	font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
	{mso-style-priority:34;
	margin-top:0cm;
	margin-right:0cm;
	margin-bottom:0cm;
	margin-left:36.0pt;
	font-size:10.0pt;
	font-family:"Calibri",sans-serif;}
span.apple-converted-space
	{mso-style-name:apple-converted-space;}
span.23
	{mso-style-type:personal-reply;
	font-family:"Calibri",sans-serif;
	color:windowtext;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-size:10.0pt;
	mso-ligatures:none;}
@page WordSection1
	{size:612.0pt 792.0pt;
	margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
	{page:WordSection1;}
/* List Definitions */
@list l0
	{mso-list-id:355693763;
	mso-list-template-ids:1594143694;}
@list l0:level1
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:36.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level2
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:72.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level3
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:108.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level4
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:144.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level5
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:180.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level6
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:216.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level7
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:252.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level8
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:288.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l0:level9
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:324.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l1
	{mso-list-id:2000379298;
	mso-list-type:hybrid;
	mso-list-template-ids:-1759734866 1387838168 67698691 67698693 67698689 =
67698691 67698693 67698689 67698691 67698693;}
@list l1:level1
	{mso-level-start-at:0;
	mso-level-number-format:bullet;
	mso-level-text:-;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:"Calibri",sans-serif;
	mso-fareast-font-family:Calibri;}
@list l1:level2
	{mso-level-number-format:bullet;
	mso-level-text:o;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:"Courier New";}
@list l1:level3
	{mso-level-number-format:bullet;
	mso-level-text:\F0A7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:Wingdings;}
@list l1:level4
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:Symbol;}
@list l1:level5
	{mso-level-number-format:bullet;
	mso-level-text:o;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:"Courier New";}
@list l1:level6
	{mso-level-number-format:bullet;
	mso-level-text:\F0A7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:Wingdings;}
@list l1:level7
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:Symbol;}
@list l1:level8
	{mso-level-number-format:bullet;
	mso-level-text:o;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:"Courier New";}
@list l1:level9
	{mso-level-number-format:bullet;
	mso-level-text:\F0A7;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:Wingdings;}
ol
	{margin-bottom:0cm;}
ul
	{margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext=3D"edit">
<o:idmap v:ext=3D"edit" data=3D"1" />
</o:shapelayout></xml><![endif]--></head><body lang=3DEN-GB link=3Dblue =
vlink=3Dpurple style=3D'word-wrap:break-word'><div =
class=3DWordSection1><p class=3DMsoNormal><span =
style=3D'font-size:11.0pt'>One last thing.<o:p></o:p></span></p><p =
class=3DMsoNormal><span =
style=3D'font-size:11.0pt'><o:p>&nbsp;</o:p></span></p><p =
class=3DMsoNormal><span style=3D'font-size:11.0pt'>&#8220;unspecified =
locality&#8221; is not &#8220;inferred locality&#8221;. Unspecified =
locality is its own thing, just as &#8220;unspecified intent&#8221; is =
also its own thing. It is not always the case that unspecified locality =
acts as if it were one of the specified =
possibilities.<o:p></o:p></span></p><p class=3DMsoNormal><span =
style=3D'font-size:11.0pt'><o:p>&nbsp;</o:p></span></p><p =
class=3DMsoNormal><span style=3D'font-size:11.0pt'>Yes, it is horrible. =
That&#8217;s why we added specified locality. Unspecified is just there =
for (a) the easy cases, and (b) to maintain backward =
compatibility.<o:p></o:p></span></p><p class=3DMsoNormal><span =
style=3D'font-size:11.0pt'><o:p>&nbsp;</o:p></span></p><p =
class=3DMsoNormal><span =
style=3D'font-size:11.0pt'>Cheers,<o:p></o:p></span></p><div><p =
class=3DMsoNormal style=3D'text-align:justify'><span lang=3DEN-US =
style=3D'font-size:10.5pt'>-- </span><span =
style=3D'font-size:10.5pt'><o:p></o:p></span></p><p class=3DMsoNormal =
style=3D'text-align:justify'><span lang=3DEN-US =
style=3D'font-size:10.5pt'>..............Malcolm Cohen, NAG =
Oxford/Tokyo.</span><span =
style=3D'font-size:10.5pt'><o:p></o:p></span></p></div><p =
class=3DMsoNormal><span =
style=3D'font-size:11.0pt'><o:p>&nbsp;</o:p></span></p><div><div =
style=3D'border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm =
0cm 0cm'><p class=3DMsoNormal><b><span =
style=3D'font-size:11.0pt'>From:</span></b><span =
style=3D'font-size:11.0pt'> J3 &lt;j3-bounces@mailman.j3-fortran.org&gt; =
<b>On Behalf Of </b>Jeff Hammond via J3<br><b>Sent:</b> Tuesday, =
September 19, 2023 10:59 PM<br><b>To:</b> Clune, Thomas L. (GSFC-6101) =
&lt;thomas.l.clune@nasa.gov&gt;; General J3 interest list =
&lt;j3@mailman.j3-fortran.org&gt;<br><b>Cc:</b> Jeff Hammond =
&lt;jehammond@nvidia.com&gt;; WG5 &lt;sc22wg5@open-std.org&gt;; Malcolm =
Cohen &lt;malcolm@nag-j.co.jp&gt;<br><b>Subject:</b> [J3] [SC22WG5.6488] =
[EXTERNAL] [BULK] Subobject of a =
variable<o:p></o:p></span></p></div></div><p =
class=3DMsoNormal><o:p>&nbsp;</o:p></p><p class=3DMsoNormal><span =
lang=3DEN-US style=3D'font-size:12.0pt'>Okay, but we are saying that, in =
the context of do concurrent, locality obviously propagates to =
subobjects, but (un)definedness obviously =
doesn&#8217;t.<o:p></o:p></span></p><p class=3DMsoNormal><span =
lang=3DEN-US style=3D'font-size:12.0pt'><o:p>&nbsp;</o:p></span></p><p =
class=3DMsoNormal><span lang=3DEN-US style=3D'font-size:12.0pt'>This =
bothers me because we use (un)definedness to infer the locality of =
variables with unspecified locality.&nbsp; It is hard for me to =
understand how I can apply the locality inference rules when the =
inferred locality propagates, but the rules used for that inference =
don&#8217;t.<o:p></o:p></span></p><p class=3DMsoNormal><span =
lang=3DEN-US style=3D'font-size:12.0pt'><o:p>&nbsp;</o:p></span></p><p =
class=3DMsoNormal><span lang=3DEN-US =
style=3D'font-size:12.0pt'>Jeff<o:p></o:p></span></p><p =
class=3DMsoNormal><span =
style=3D'font-size:12.0pt'><o:p>&nbsp;</o:p></span></p><div =
id=3Dmail-editor-reference-message-container><div><div =
style=3D'border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm =
0cm 0cm'><p class=3DMsoNormal style=3D'margin-bottom:12.0pt'><b><span =
lang=3DEN-US style=3D'font-size:12.0pt;color:black'>From: =
</span></b><span lang=3DEN-US =
style=3D'font-size:12.0pt;color:black'>Clune, Thomas L. (GSFC-6101) =
&lt;<a =
href=3D"mailto:thomas.l.clune@nasa.gov">thomas.l.clune@nasa.gov</a>&gt;<b=
r><b>Date: </b>Tuesday, 19. September 2023 at 16.17<br><b>To: =
</b>General J3 interest list &lt;<a =
href=3D"mailto:j3@mailman.j3-fortran.org">j3@mailman.j3-fortran.org</a>&g=
t;<br><b>Cc: </b>Jeff Hammond &lt;<a =
href=3D"mailto:jehammond@nvidia.com">jehammond@nvidia.com</a>&gt;, WG5 =
&lt;<a =
href=3D"mailto:sc22wg5@open-std.org">sc22wg5@open-std.org</a>&gt;, =
Malcolm Cohen &lt;<a =
href=3D"mailto:malcolm@nag-j.co.jp">malcolm@nag-j.co.jp</a>&gt;<br><b>Sub=
ject: </b>Re: [EXTERNAL] [BULK] [J3] [SC22WG5.6486] Subobject of a =
variable<o:p></o:p></span></p></div><table class=3DMsoNormalTable =
border=3D1 cellpadding=3D0 style=3D'background:#FFEB9C'><tr><td =
style=3D'padding:.75pt .75pt .75pt .75pt'><p class=3DMsoNormal><b><span =
style=3D'font-size:7.5pt;font-family:"Verdana",sans-serif;color:black'>Ex=
ternal email: Use caution opening links or attachments</span></b><span =
style=3D'font-size:7.5pt;font-family:"Verdana",sans-serif;color:black'> =
</span><span =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></td></tr></table><p =
class=3DMsoNormal><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p>&nbsp;</o:p></span></p><div><p =
class=3DMsoNormal><span lang=3DEN-US style=3D'font-size:11.0pt'>I do not =
find this situation odd.&nbsp;&nbsp;&nbsp; Lots of things don&#8217;t =
propagate to subobjects.&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;E.g., if an array =
is allocatable, it&#8217;s elements are not.&nbsp; If an array is =
pointer, it&#8217;s elements are not.<o:p></o:p></span></p><p =
class=3DMsoNormal><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p><p =
class=3DMsoNormal><span lang=3DEN-US style=3D'font-size:11.0pt'>And =
&#8220;undefinedness&#8221; is very much a property of =
subobjects.&nbsp;&nbsp; Indeed, a variable is only defined if all of its =
subobjects are defined.&nbsp; (I hope I have that =
right.)<o:p></o:p></span></p><p class=3DMsoNormal><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p><ul =
style=3D'margin-top:0cm' type=3Ddisc><li class=3DMsoListParagraph =
style=3D'margin-left:0cm;mso-list:l1 level1 lfo3'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Tom<o:p></o:p></span></li></ul><p =
class=3DMsoNormal><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p><div =
style=3D'border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm =
0cm 0cm'><p class=3DMsoNormal style=3D'margin-left:36.0pt'><b><span =
lang=3DEN-US style=3D'font-size:12.0pt;color:black'>From: =
</span></b><span lang=3DEN-US style=3D'font-size:12.0pt;color:black'>J3 =
&lt;<a =
href=3D"mailto:j3-bounces@mailman.j3-fortran.org">j3-bounces@mailman.j3-f=
ortran.org</a>&gt; on behalf of j3 &lt;<a =
href=3D"mailto:j3@mailman.j3-fortran.org">j3@mailman.j3-fortran.org</a>&g=
t;<br><b>Reply-To: </b>j3 &lt;<a =
href=3D"mailto:j3@mailman.j3-fortran.org">j3@mailman.j3-fortran.org</a>&g=
t;<br><b>Date: </b>Tuesday, September 19, 2023 at 4:57 AM<br><b>To: =
</b>j3 &lt;<a =
href=3D"mailto:j3@mailman.j3-fortran.org">j3@mailman.j3-fortran.org</a>&g=
t;<br><b>Cc: </b>Jeff Hammond &lt;<a =
href=3D"mailto:jehammond@nvidia.com">jehammond@nvidia.com</a>&gt;, WG5 =
&lt;<a =
href=3D"mailto:sc22wg5@open-std.org">sc22wg5@open-std.org</a>&gt;, =
Malcolm Cohen &lt;<a =
href=3D"mailto:malcolm@nag-j.co.jp">malcolm@nag-j.co.jp</a>&gt;<br><b>Sub=
ject: </b>[EXTERNAL] [BULK] [J3] [SC22WG5.6486] Subobject of a =
variable</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><table =
class=3DMsoNormalTable border=3D1 cellspacing=3D0 cellpadding=3D0 =
align=3Dleft width=3D"100%" style=3D'width:100.0%;border:solid black =
1.5pt'><tr><td width=3D"100%" =
style=3D'width:100.0%;border:none;background:#FFEB9C;padding:3.75pt =
3.75pt 3.75pt 3.75pt'><p class=3DMsoNormal =
style=3D'mso-element:frame;mso-element-frame-hspace:2.25pt;mso-element-wr=
ap:around;mso-element-anchor-vertical:paragraph;mso-element-anchor-horizo=
ntal:column;mso-height-rule:exactly'><b><span =
style=3D'color:black'>CAUTION:</span></b><span =
style=3D'font-size:11.0pt;color:black'> </span><span =
style=3D'color:black'>This email originated from outside of NASA.&nbsp; =
Please take care when clicking links or opening attachments.&nbsp; Use =
the &quot;Report Message&quot; button to report suspicious messages to =
the NASA&nbsp;SOC.</span><span style=3D'font-size:11.0pt;color:black'> =
</span><span =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></td></tr></table><p =
class=3DMsoNormal =
style=3D'mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;mar=
gin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'><br><br><o:p></o:p></span></p><div><div><div><=
div><div><p style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:10.5pt;font-family:LMRoman10'>If a variable has =
unspecified locality,</span><span lang=3DEN-US><o:p></o:p></span></p><p =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:10.5pt;font-family:LMRoman10'>- if it is referenced =
in an iteration it shall either be previously defined during that =
iteration, or shall not be defined or become undefined during any other =
iteration; if it is defined or becomes undefined by more than one =
iteration it becomes undefined when the loop terminates;</span><span =
lang=3DEN-US><o:p></o:p></span></p></div></div></div></div><blockquote =
style=3D'margin-left:30.0pt;margin-top:5.0pt;margin-right:0cm;margin-bott=
om:5.0pt'><div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span =
lang=3DEN-US style=3D'font-size:11.0pt'>real, dimension(10) :: =
A<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>do concurrent (integer :: =
k=3D1:size(A))<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp; A(k) =3D =
k<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp; if (k.eq.1) A(10) =3D =
0<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>end =
do<o:p></o:p></span></p></div></blockquote><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>As best I can tell, A(1:9) are defined after =
the loop terminates, while A(10) and A are not. &nbsp;Does the fact that =
A is undefined before and becomes undefined during this loop imply =
anything about the undefined-ness of its elements during the loop or =
must one reason about them strictly independently, based on the =
element-wise defined/undefined-ness?<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Now suppose I make A shared. &nbsp;Malcolm =
said all the elements of A are shared as well &quot;It&#8217;s not =
written there now, because, like, how could it possibly be anything =
else?&#8221;<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><blockq=
uote =
style=3D'margin-left:30.0pt;margin-top:5.0pt;margin-right:0cm;margin-bott=
om:5.0pt'><div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span =
lang=3DEN-US style=3D'font-size:11.0pt'>real, dimension(10) :: =
A<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>do concurrent (integer :: k=3D1:size(A)) =
shared(A)<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp; A(k) =3D =
k<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp; if (k.eq.1) A(10) =3D =
0<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>end =
do<o:p></o:p></span></p></div></blockquote></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>It is odd to me that the shared-ness of A =
propagates to its elements but the undefined-ness does not. &nbsp;Why =
must I reason about the element-wise behavior of an array independent of =
the array itself when worrying about whether a variable becomes =
undefined or defined during a loop, but in the same context, they are =
obviously not independent regarding =
locality?<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Jeff<o:p></o:p></span></p><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p><div><p =
class=3DMsoNormal =
style=3D'mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;mar=
gin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'><br><br><o:p></o:p></span></p><blockquote =
style=3D'margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>On 19. Sep 2023, at 10.49, Malcolm Cohen via =
J3 &lt;<a =
href=3D"mailto:j3@mailman.j3-fortran.org">j3@mailman.j3-fortran.org</a>&g=
t; wrote:<o:p></o:p></span></p></div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p><div><table =
class=3DMsoNormalTable border=3D1 cellpadding=3D0 =
style=3D'margin-left:36.0pt;background:#FFEB9C;caret-color: rgb(0, 0, =
0);orphans: auto;widows: auto;-webkit-text-stroke-width: =
0px;word-spacing:0px'><tr><td style=3D'padding:.75pt .75pt .75pt =
.75pt'><p class=3DMsoNormal><b><span =
style=3D'font-size:7.5pt;font-family:"Verdana",sans-serif;color:black'>Ex=
ternal email: Use caution opening links or attachments</span></b><span =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></td></tr></table><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Hi Brad,<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>There is no doubt that subobject includes =
array elements.<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>The point is that a subobject of a variable =
is itself a variable. So nothing more needs to be said on that =
front.<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>But in the case of a subobject of a constant, =
that is often not constant. E.g.<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;&nbsp; INTEGER,PARAMETER :: x(10) =3D [ =
1,2,3,4,5,6,7,8,9,10 ]<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;&nbsp; READ =
*,I<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp; &nbsp;PRINT *,x(I)<span =
class=3Dapple-converted-space>&nbsp;</span><o:p></o:p></span></p></div><d=
iv><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Here, X(I) is not a variable, and is also not =
a constant. It is a non-constant subobject of a =
constant!<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>That is what those words are there for. They =
are not intended to imply that subobjects of a variable are not data =
objects. They are simply because they are also variables, indeed, =
portions that can be defined and redefined separately, and being capable =
of being defined and redefined makes them =
variables.<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>We could add a NOTE to say that &#8220;A =
subobject of a variable is a variable, but a subobject of a constant is =
not necessarily itself constant, e.g. if it has a non-constant =
subscript.&#8221; Not sure it is really worth it though, at least, not =
until we decide what to do with our overly-large set of =
terms.<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Cheers,<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt;text-align:justify'><span =
lang=3DEN-US style=3D'font-size:10.5pt'>--</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p><p class=3DMsoNormal =
style=3D'margin-left:36.0pt;text-align:justify'><span lang=3DEN-US =
style=3D'font-size:10.5pt'>..............Malcolm Cohen, NAG =
Oxford/Tokyo.</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><div =
style=3D'border:none;border-top:solid windowtext 1.0pt;padding:3.0pt 0cm =
0cm 0cm;border-color:currentcolor currentcolor;border-image: =
none'><div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><b><span =
lang=3DEN-US style=3D'font-size:11.0pt'>From:</span></b><span =
class=3Dapple-converted-space><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;</span></span><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Brad Richardson &lt;<a =
href=3D"mailto:everythingfunctional@protonmail.com"><span =
style=3D'color:#0563C1'>everythingfunctional@protonmail.com</span></a>&gt=
;<span class=3Dapple-converted-space>&nbsp;</span><br><b>Sent:</b><span =
class=3Dapple-converted-space>&nbsp;</span>Thursday, September 14, 2023 =
10:25 PM<br><b>To:</b><span =
class=3Dapple-converted-space>&nbsp;</span>General J3 interest list =
&lt;<a href=3D"mailto:j3@mailman.j3-fortran.org"><span =
style=3D'color:#0563C1'>j3@mailman.j3-fortran.org</span></a>&gt;; 'WG5' =
&lt;<a href=3D"mailto:sc22wg5@open-std.org"><span =
style=3D'color:#0563C1'>sc22wg5@open-std.org</span></a>&gt;<br><b>Subject=
:</b><span class=3Dapple-converted-space>&nbsp;</span>[ukfortran] =
[SC22WG5.6484] [J3] RE: [EXTERNAL] [BULK] are race conditions allowed in =
do concurrent?<o:p></o:p></span></p></div></div></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><div><p=
 class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Hi =
Malcolm,<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&gt; &gt;variable/data entity/data =
object<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&gt; &gt;[are]<span =
class=3Dapple-converted-space>&nbsp;</span>circular, and doesn't seem to =
include individual array =
elements<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&gt; Yes it does, see 3.138 =
subobject.<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>While I see that it probably intends to =
include it, what it actually says =
is<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span =
lang=3DEN-US style=3D'font-size:11.0pt'>subobject of a =
constant<o:p></o:p></span></p></div></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>so the edit would be to change it =
to<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>subobject of a variable or =
constant<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>I don't think the circularity is causing too =
much confusion, so I don't see much urgency in trying to fix it, and =
don't quite see an easy way to do so. I think we can leave it for =
now.<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Regards,<o:p></o:p></span></p></div></div><div=
><div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span =
lang=3DEN-US =
style=3D'font-size:11.0pt'>Brad<o:p></o:p></span></p></div></div><div><di=
v><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>On Thu, 2023-09-14 at 14:04 +0900, Malcolm =
Cohen via J3 wrote:<o:p></o:p></span></p></div></div><blockquote =
style=3D'border:none;border-left:solid windowtext 1.5pt;padding:0cm 0cm =
0cm =
6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5=
.0pt;border-color:currentcolor currentcolor currentcolor rgb(114, 159, =
207);border-image: none'><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Hi Brad,<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>There is no contradiction, subtle or =
otherwise, here.<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Locality-specs are only for named variables. =
However, as noted, subobjects of variables are also =
variables.<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&gt;<span =
class=3Dapple-converted-space>&nbsp;</span>The way I've heard =
&quot;definition&quot; applied to arrays is that definition of an =
element of an array does not constitute definition of the =
variable,<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Correct (except in the trivial case of an =
array with a single element). This is all spelled out explicitly: =
defining every &#8220;part&#8221; of a multi-part variable defines the =
variable.<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>I can see some potential wording improvements =
for the next revision, but nothing that rises to the level of a =
defect.<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>E.g. it may be better to mention that =
&#8220;if a variable has SHARED locality, all of its subobjects have =
SHARED locality&#8221;. It&#8217;s not written there now, because, like, =
how could it possibly be anything else? There is nothing else it could =
be. &nbsp;But making it explicit would lead naturally into writing =
&#8220;If a variable with SHARED locality is defined&#8230;&#8221; =
instead of the current &#8220;If it is =
defined&#8230;&#8221;.<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&gt;variable/data entity/data =
object<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&gt;[are] circular, and doesn't seem to =
include individual array elements<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Yes it does, see 3.138 =
subobject.<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>The circularity is unfortunate, but they are =
all reasonably worded for comprehensibility (not for trail-following). =
So it&#8217;s either deleting one of them (ugh) or rewording one to =
break the circle without making it hard to understand (it&#8217;s not =
obvious exactly what to do here, which is why it is still like =
this).<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>If it were a glossary of terms, instead of a =
list of definitions, there would be no problem with circularity, =
right?<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Anyway, I agree it would be good to fix it as =
long as it doesn&#8217;t make any individual term hard to =
understand.<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Given our experience this time around, I =
would be in favour of pruning our terms and definitions, down to a more =
minimal set. If there are &#8220;useful&#8221; terms that do not lend =
themselves to trivial drop-in replacement, and I think there are, we =
could consider adding a &#8220;Glossary&#8221; (of &#8220;useful =
terms&#8221;, but probably better not to call them =
&#8220;terms&#8221;!).<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Cheers,<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt;text-align:justify'><span =
lang=3DEN-US style=3D'font-size:10.5pt'>--</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p><p class=3DMsoNormal =
style=3D'margin-left:36.0pt;text-align:justify'><span lang=3DEN-US =
style=3D'font-size:10.5pt'>..............Malcolm Cohen, NAG =
Oxford/Tokyo.</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><div =
style=3D'border:none;border-top:solid windowtext 1.0pt;padding:3.0pt 0cm =
0cm 0cm;border-color:currentcolor currentcolor;border-image: =
none'><div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><b><span =
lang=3DEN-US style=3D'font-size:11.0pt'>From:</span></b><span =
class=3Dapple-converted-space><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;</span></span><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Brad Richardson &lt;<a =
href=3D"mailto:everythingfunctional@protonmail.com"><span =
style=3D'color:#0563C1'>everythingfunctional@protonmail.com</span></a>&gt=
;<span class=3Dapple-converted-space>&nbsp;</span><br><b>Sent:</b><span =
class=3Dapple-converted-space>&nbsp;</span>Wednesday, September 13, 2023 =
3:49 AM<br><b>To:</b><span =
class=3Dapple-converted-space>&nbsp;</span>General J3 interest list =
&lt;<a href=3D"mailto:j3@mailman.j3-fortran.org"><span =
style=3D'color:#0563C1'>j3@mailman.j3-fortran.org</span></a>&gt;; WG5 =
&lt;<a href=3D"mailto:sc22wg5@open-std.org"><span =
style=3D'color:#0563C1'>sc22wg5@open-std.org</span></a>&gt;<br><b>Subject=
:</b><span class=3Dapple-converted-space>&nbsp;</span>[ukfortran] =
[SC22WG5.6480] [EXTERNAL] [BULK] [J3] are race conditions allowed in do =
concurrent?<o:p></o:p></span></p></div></div></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><div><p=
 class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Hmm... I decided to work through this a bit =
more thoroughly.<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>From the syntax =
definitions:<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>R902<o:p></o:p></span></p></div></div><div><di=
v><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>variable<o:p></o:p></span></p></div></div><div=
><div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span =
lang=3DEN-US style=3D'font-size:11.0pt'>is =
designator<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>or =
function-reference<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>R901<o:p></o:p></span></p></div></div><div><di=
v><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>designator<o:p></o:p></span></p></div></div><d=
iv><div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span =
lang=3DEN-US style=3D'font-size:11.0pt'>is =
object-name<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>or =
array-element<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>or =
array-section<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>or =
coindexed-named-object<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>or =
complex-part-designator<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>or =
structure-component<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>or =
substring<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Ok, so according to the syntax an array =
element is a variable.<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>From the terms and =
definitions:<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>variable<o:p></o:p></span></p></div></div><div=
><div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span =
lang=3DEN-US style=3D'font-size:11.0pt'>data entity (3.41) that can be =
defined (3.48) and redefined during execution of a =
program<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>data =
entity<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>data object (3.42), result of the evaluation =
of an expression, or the result of the execution of a function =
reference<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>data =
object<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>constant, variable, or subobject of a =
constant<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>which is circular, and doesn't seem to =
include individual array =
elements.<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>So now the question is which =
&quot;definition&quot; does the DO CONCURRENT constraint refer =
to?<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>From the syntax =
definitions:<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>R1129<o:p></o:p></span></p></div></div><div><d=
iv><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>concurrent-locality<o:p></o:p></span></p></div=
></div><div><div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span =
lang=3DEN-US =
style=3D'font-size:11.0pt'>is<o:p></o:p></span></p></div></div><div><div>=
<p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>[ locality-spec =
]...<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>R1130<o:p></o:p></span></p></div></div><div><d=
iv><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>locality-spec<o:p></o:p></span></p></div></div=
><div><div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span =
lang=3DEN-US style=3D'font-size:11.0pt'>is LOCAL ( variable-name-list =
)<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>or LOCAL_INIT ( variable-name-list =
)<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>or REDUCE ( reduce-operation : =
variable-name-list )<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>or SHARED ( variable-name-list =
)<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>or DEFAULT ( NONE =
)<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>only allows variable-name, not designator, so =
it's not exactly clear.<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>The &quot;constraint&quot; appears in =
normative text, I.e.<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>If a variable =
has<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>which is not hyperlinked and is not in a font =
indicating reference to the syntax =
term.<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>My reading of this is that we have a subtle =
contradiction between the syntax and normative terms. My guess is that =
the syntax meaning (i.e. an array element is a variable) is what is =
intended for the rules here, and thus it's valid to (un)define =
*different* elements of an array in separate iterations, but not valid =
to (un)define and reference the same element of an array in separate =
iterations.<o:p></o:p></span></p></div></div><div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>I think it would be worth &quot;fixing&quot; =
the terms and definitions to eliminate the circular definition and make =
it consistent with the =
syntax.<o:p></o:p></span></p></div></div><div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Regards,<o:p></o:p></span></p></div></div><div=
><div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span =
lang=3DEN-US =
style=3D'font-size:11.0pt'>Brad<o:p></o:p></span></p></div></div><div><di=
v><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div><p class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>On Tue, 2023-09-12 at 17:37 +0000, Clune, =
Thomas L. (GSFC-6101) =
wrote:<o:p></o:p></span></p></div></div><blockquote =
style=3D'border:none;border-left:solid windowtext 1.5pt;padding:0cm 0cm =
0cm =
6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5=
.0pt;border-color:currentcolor currentcolor currentcolor rgb(114, 159, =
207);border-image: none'><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&#8220;Variable&#8221; does not mean what we =
think it means:&nbsp;&nbsp;&nbsp;&nbsp; &lt;variable&gt;&nbsp; =
&nbsp;&lt;&lt;is&gt;&gt;&nbsp; &lt;designator&gt; &lt;&lt;or&gt;&gt; =
&lt;function-reference&gt;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>And &lt;designator&gt; includes =
&lt;array-element&gt;.<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>But I for one would not mind an explanatory =
note that clarifies the common use case of array elements in this =
context.&nbsp;<o:p></o:p></span></p></div><div><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div><div =
style=3D'border:none;border-top:solid windowtext 1.0pt;padding:3.0pt 0cm =
0cm 0cm;border-color:currentcolor currentcolor;border-image: none'><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><b><span lang=3DEN-US =
style=3D'font-size:12.0pt'>From:</span></b><span lang=3DEN-US =
style=3D'font-size:12.0pt'>J3 &lt;<a =
href=3D"mailto:j3-bounces@mailman.j3-fortran.org"><span =
style=3D'color:#0563C1'>j3-bounces@mailman.j3-fortran.org</span></a>&gt; =
on behalf of j3 &lt;<a href=3D"mailto:j3@mailman.j3-fortran.org"><span =
style=3D'color:#0563C1'>j3@mailman.j3-fortran.org</span></a>&gt;<br><b>Re=
ply-To:<span class=3Dapple-converted-space>&nbsp;</span></b>j3 &lt;<a =
href=3D"mailto:j3@mailman.j3-fortran.org"><span =
style=3D'color:#0563C1'>j3@mailman.j3-fortran.org</span></a>&gt;<br><b>Da=
te:<span class=3Dapple-converted-space>&nbsp;</span></b>Tuesday, =
September 12, 2023 at 12:19 PM<br><b>To:<span =
class=3Dapple-converted-space>&nbsp;</span></b>j3 &lt;<a =
href=3D"mailto:j3@mailman.j3-fortran.org"><span =
style=3D'color:#0563C1'>j3@mailman.j3-fortran.org</span></a>&gt;, WG5 =
&lt;<a href=3D"mailto:sc22wg5@open-std.org"><span =
style=3D'color:#0563C1'>sc22wg5@open-std.org</span></a>&gt;<br><b>Cc:<spa=
n class=3Dapple-converted-space>&nbsp;</span></b>Brad Richardson &lt;<a =
href=3D"mailto:everythingfunctional@protonmail.com"><span =
style=3D'color:#0563C1'>everythingfunctional@protonmail.com</span></a>&gt=
;<br><b>Subject:<span =
class=3Dapple-converted-space>&nbsp;</span></b>[EXTERNAL] [BULK] [J3] =
[SC22WG5.6477] are race conditions allowed in do concurrent?</span><span =
lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div></div><div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
table class=3DMsoNormalTable border=3D1 cellspacing=3D0 cellpadding=3D0 =
align=3Dleft width=3D"100%" style=3D'width:100.0%;border:solid black =
1.5pt'><tr><td width=3D"100%" =
style=3D'width:100.0%;border:none;background:#FFEB9C;padding:3.75pt =
3.75pt 3.75pt 3.75pt'><div><p class=3DMsoNormal =
style=3D'mso-element:frame;mso-element-frame-hspace:2.25pt;mso-element-wr=
ap:around;mso-element-anchor-vertical:paragraph;mso-element-anchor-horizo=
ntal:column;mso-height-rule:exactly'><b><span =
style=3D'color:black'>CAUTION:</span></b><span =
class=3Dapple-converted-space><span =
style=3D'font-size:11.0pt;color:black'>&nbsp;</span></span><span =
style=3D'color:black'>This email originated from outside of NASA.&nbsp; =
Please take care when clicking links or opening attachments.&nbsp; Use =
the &quot;Report Message&quot; button to report suspicious messages to =
the NASA&nbsp;SOC.</span><span =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div></td></tr></table>=
</div><p class=3DMsoNormal =
style=3D'mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;mar=
gin-left:72.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'><br><br><br><br><br><o:p></o:p></span></p><div=
><div><div style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Hi =
Jeff,<o:p></o:p></span></p></div></div><div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Based on &quot; If it is defined or becomes =
undefined during any iteration, it shall not be referenced, defined, or =
become undefined during any other iteration.&quot;, the provide program =
is invalid, because `x` becomes defined in more than one =
iteration.<o:p></o:p></span></p></div></div><div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>The way I've heard &quot;definition&quot; =
applied to arrays is that definition of an element of an array does not =
constitute definition of the variable, because it is then only partially =
defined. I.e. an array is only defined once each of its elements has =
been defined.<o:p></o:p></span></p></div></div><div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>My opinion is that the above constraint =
simply does not adequately describe/is still ambiguous about the case of =
arrays. I think an interp would be warranted, and we should say that an =
element of an array should have the same constraint as above if the =
variable is shared.<o:p></o:p></span></p></div></div><div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Regards,<o:p></o:p></span></p></div></div><div=
><div style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>Brad<o:p></o:p></span></p></div></div><div><di=
v style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div><div><=
div style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>On Tue, 2023-09-12 at 14:43 +0000, Jeff =
Hammond via J3 wrote:<o:p></o:p></span></p></div></div><blockquote =
style=3D'border:none;border-left:solid windowtext 1.5pt;padding:0cm 0cm =
0cm =
6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5=
.0pt;border-color:currentcolor currentcolor currentcolor rgb(114, 159, =
207);border-image: none'><div style=3D'margin-left:36.0pt'><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>Is this a legal program in Fortran with =
defined behavior?&nbsp; If it is illegal or the behavior is undefined, =
where do we say that?</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>&nbsp;</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>program main</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>&nbsp; integer :: k</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>&nbsp; real :: x</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>&nbsp; x =3D 0.0</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>&nbsp; do concurrent (k=3D1:2) =
shared(x)</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>&nbsp;&nbsp;&nbsp; x =3D real(k)</span><span =
lang=3DEN-US style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>&nbsp; end do</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>&nbsp; print*,x</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>end program main</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>&nbsp;</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>Is that what the following is intended to =
do?</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>&nbsp;</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>&#8220;If a variable has SHARED locality, =
appearances of the variable within the DO CONCURRENT construct refer to =
the variable in the innermost executable construct or scoping unit that =
includes the DO CONCURRENT construct. If it is defined or becomes =
undefined during any iteration, it shall not be referenced, defined, or =
become undefined during any other iteration.&#8221;</span><span =
lang=3DEN-US style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>&nbsp;</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>If so, then I am struggling to apply this to =
arrays.&nbsp; When we say a variable has shared locality, is the =
variable the array or the element?&nbsp; We can only put array names in =
SHARED(), but applying the text regarding &#8220;to become =
defined&#8221; from the perspective of arrays appears to have =
interesting consequences.</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>&nbsp;</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'>Thanks,</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div><div =
style=3D'margin-left:36.0pt'><p class=3DMsoNormal =
style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:12.0pt'><br>Jeff</span><span lang=3DEN-US =
style=3D'font-size:11.0pt'><o:p></o:p></span></p></div></blockquote></div=
></blockquote></blockquote></div></div></blockquote></div><p =
class=3DMsoNormal style=3D'margin-left:36.0pt'><span lang=3DEN-US =
style=3D'font-size:11.0pt'>&nbsp;<o:p></o:p></span></p></div></div></div>=
</div></div></div></div></body></html>
------=_NextPart_000_02D4_01D9EBEC.4E36BE40--

