comp.lang.ada
 help / color / mirror / Atom feed
From: "Nasser M. Abbasi" <nma@12000.org>
Subject: why this construct causes aliasing problem in 2012 with functions allowing In Out?
Date: Wed, 20 Jun 2012 03:24:11 -0500
Date: 2012-06-20T03:24:11-05:00	[thread overview]
Message-ID: <jrs1bd$eth$1@speranza.aioe.org> (raw)

looking at http://www.slideshare.net/AdaCore/ada-2012

(typing it myself looking at the screen)

--------------------------
function change(x,y : in out integer) return integer is
  begin
   x := x*2;
   y := y*4;
   return x+y;
  end

  one , two : integer :=1;
  begin
    two := change(one,two)+ change(one,two);  -->
end
-----------------------------

They say it will generate

warning: result may differ if evaluated after actual in expression.

I understand that the order of calls in the A()+B() is not defined.
i.e. A() can be called first, then B(), or B() first then A().

But the result should still be the same either way. So what
is the problem?

Assume the first change(one,two) is called. Then after that
call, we will have
-------------------------
    two := 6 + change(2,4);   (1)

then the next change() is called using the updated actual
(the two on the LHS can't be updated yet)

    two := 6 + 20;   (2)
   
hence now two becomes 26.
------------------------
Same result will happen if we do it the other way

    two := change(2,4) + 6;   (1)

then the next change is called

    two := 20 + 6;   (2)
   
hence two is 26.

Is there another combination of mixing things up that I am
missing?

thanks,
--Nasser



             reply	other threads:[~2012-06-20  8:24 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-20  8:24 Nasser M. Abbasi [this message]
2012-06-20  8:26 ` why this construct causes aliasing problem in 2012 with functions allowing In Out? Nasser M. Abbasi
2012-06-20 14:56 ` Adam Beneschan
2012-06-20 15:14   ` Dmitry A. Kazakov
2012-06-21 20:06     ` Randy Brukardt
2012-06-21 20:00   ` Randy Brukardt
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox