[J3] Self-assignment of allocatable component

Malcolm Cohen malcolm at nag-j.co.jp
Mon Jul 26 23:41:39 UTC 2021


No, the value assigned (and thus the effective “RHS component”) is unaffected by the variable on the LHS. This is the general rule that the value of the RHS is unaffected by the assignment to the LHS.

 

Otherwise you would be arguing that

   REAL x(10)

   ...

   X(2:) = X(:9)

would propagate the value of X(1) to the rest of X. That is not what happens, and not what the standard says happens.

 

Fortunately the standard is pretty clear

   “The execution of the assignment shall have the same effect as if the evaluation of expr and the evaluation of all expressions in variable occurred before any portion of the variable is defined by the assignment.”

 

Basically, the expression just delivers a value, whether the expression is a reference to a variable or not. If the expression is a variable that *might* overlap in some way with the LHS, the processor needs to capture the value of the expression before beginning the writing part of the assignment.

 

In the quoted example, there are no defined assignments going on, so the processor is free to omit all actions! It can see that capturing the value of P and then assigning that value to P will produce the same result as just leaving P alone.

 

That is, Vipul is 100% correct that (absent defined assignments, as those are procedure calls) assignment is equivalent to capturing the value of the expression in a temporary, then doing the assignment from the temporary to the variable. Fortran has *always* been like this, since the very beginning way back in Fortran 66 where overlapping assignments could happen with COMPLEX variables.

 

Cheers,

-- 

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

 

From: J3 <j3-bounces at mailman.j3-fortran.org> On Behalf Of Daniel C Chen via J3
Sent: Tuesday, July 27, 2021 5:17 AM
To: General J3 interest list <j3 at mailman.j3-fortran.org>
Cc: Daniel C Chen <cdchen at ca.ibm.com>
Subject: Re: [J3] Self-assignment of allocatable component

 

Hi Vipul,

My understanding is that the paragraph you quoted is AFTER (1), deallocate LHS component, and (2), allocate LHS component based on RHS. Because Step (1) already makes the RHS component unallocated, the rest actions are void.

Thanks,

Daniel Chen

XL Fortran Development, Fortran Standard Representative
IBM Toronto Software Lab
Phone: 905-413-3056   
Tie: 969-3056   
Email: cdchen at ca.ibm.com <mailto:cdchen at ca.ibm.com> 

"Vipul Parekh via J3" ---2021-07-26 04:10:32 PM---On Mon, Jul 26, 2021 at 3:17 PM Daniel C Chen via J3 < j3 at mailman.j3-fortran.org <mailto:j3 at mailman.j3-fortran.org> > wrote:

From: "Vipul Parekh via J3" <j3 at mailman.j3-fortran.org <mailto:j3 at mailman.j3-fortran.org> >
To: "General J3 interest list" <j3 at mailman.j3-fortran.org <mailto:j3 at mailman.j3-fortran.org> >
Cc: "Vipul Parekh" <parekhvs at gmail.com <mailto:parekhvs at gmail.com> >
Date: 2021-07-26 04:10 PM
Subject: [EXTERNAL] Re: [J3] Self-assignment of allocatable component
Sent by: "J3" <j3-bounces at mailman.j3-fortran.org <mailto:j3-bounces at mailman.j3-fortran.org> >

  _____  




On Mon, Jul 26, 2021 at 3:17 PM Daniel C Chen via J3 <j3 at mailman.j3-fortran.org <mailto:j3 at mailman.j3-fortran.org> > wrote: .. Apprently p%i is unallocated after the self-assignment. Is this code still standard conforming? Hi Daniel, Interesting question!  3 different compilers 


On Mon, Jul 26, 2021 at 3:17 PM Daniel C Chen via J3 < <mailto:j3 at mailman.j3-fortran.org> j3 at mailman.j3-fortran.org> wrote:

..

Apprently p%i is unallocated after the self-assignment. Is this code still standard conforming?


Hi Daniel,

Interesting question!  3 different compilers I have access to indicate "p%i" is indeed allocated after the "self-assignment"!

I look forward to the discussion.  Paragraph 1 in section 10.2.1.3 Interpretation of intrinsic assignments [p170:11-16] reads as the assignment you show can be interpreted *as though* it were *equivalent* to:
   block
      type(dt) :: tmp
      tmp = p
      p = tmp  
   end block

thereby leaving "p%i" as allocated and which is what the 3 processors I tried appeared to be doing.

Regards,
Vipul Parekh






Disclaimer

The Numerical Algorithms Group Ltd is a company registered in England and Wales with company number 1249803. The registered office is: 30 St. Giles, Oxford, OX1 3LE, United Kingdom. Please see our Privacy Notice <https://www.nag.co.uk/content/privacy-notice>  for information on how we process personal data and for details of how to stop or limit communications from us.

This e-mail has been scanned for all viruses and malware, and may have been automatically archived by Mimecast Ltd, an innovator in Software as a Service (SaaS) for business.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.j3-fortran.org/pipermail/j3/attachments/20210727/91ee4bc6/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image001.gif
Type: image/gif
Size: 105 bytes
Desc: not available
URL: <https://mailman.j3-fortran.org/pipermail/j3/attachments/20210727/91ee4bc6/attachment-0001.gif>


More information about the J3 mailing list