comp.lang.ada
 help / color / mirror / Atom feed
From: Robert A Duff <bobduff@shell01.TheWorld.com>
Subject: Re: another way to shoot yourself in the foot?
Date: Tue, 24 Jun 2008 19:02:26 -0400
Date: 2008-06-24T19:02:26-04:00	[thread overview]
Message-ID: <wccr6amv3lp.fsf@shell01.TheWorld.com> (raw)
In-Reply-To: 87abhablrx.fsf@ludovic-brenta.org

Ludovic Brenta <ludovic@ludovic-brenta.org> writes:

> Robert A Duff writes:
>> But in Ada 95, if you say:
>> 
>>     P(F(...));
>> 
>> where F returns limited, you are not passing a limited object,
>> but an implicit reference to some object that already existed before the
>> call to F.
> [...]
>> In Ada 2005, functions always return newly-created objects, which I
>> think is appropriate.
>
> This makes me wonder whether there is an actual difference in the way
> the compiler handles such returns.

Yes, very different in the case of limited types.

In Ada 83, F returns its result by copy, and the address of this copy is
passed to P.

In Ada 95, F returns the address of some object outside F,
and this address is passed to P.

In Ada 2005, the formal of P is allocated at the call site,
and the address of that is passed to F, which puts its result
there.  This address is then passed to P.  Except if the size
is not known at the call site, things get more complicated.
And if controlled types or task types are involved, then extra
implicit parameters are passed to F (who is the master of this
thing, who is supposed to activate it, etc).

>...For example, has GNAT changed a
> lot in this area?

Yes.  We're talking about months of work by at least two people at
AdaCore (one of whom was me).

>...Do the Ada 95 and Ada 2005 compatibility modes use
> antirely different compilation strategies?

Yes.  And if you try to mix them, it won't work.

>>     if F(...).Flag then ...
>>
>> The last one is pretty silly -- it creates a new limited object,
>> grabs a boolean flag out of it, and then throws the whole thing
>> away.
>
> Yes but "grabbing a boolean flag" might consist in passing the limited
> object as a parameter to a primitive function named Flag, which might
> then pass it down to any number of subprograms with all sorts of side
> effects.  One could write an arbitrarily large program like this :)

Good point.  I was talking about the case where the result is a limited
record with a component called Flag, which is silly.  You are talking
about the case where Flag is a primitive operation, which is not silly.

- Bob



  reply	other threads:[~2008-06-24 23:02 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-20  9:03 another way to shoot yourself in the foot? fedya_fedyakoff
2008-06-20  9:34 ` Dmitry A. Kazakov
2008-06-20  9:48   ` fedya_fedyakoff
2008-06-20 10:01     ` Ludovic Brenta
2008-06-20 10:05 ` christoph.grein
2008-06-20 10:26   ` Dmitry A. Kazakov
2008-06-20 16:12     ` Adam Beneschan
2008-06-20 15:48   ` Adam Beneschan
2008-06-20 19:27   ` Robert A Duff
2008-06-20 23:37     ` Jeffrey R. Carter
2008-06-21  8:56       ` Dmitry A. Kazakov
2008-06-22 20:44         ` Robert A Duff
2008-06-23  7:49           ` Dmitry A. Kazakov
2008-06-24  4:02             ` george.priv
2008-06-24  7:30               ` Dmitry A. Kazakov
2008-06-24 17:16                 ` Robert A Duff
2008-06-24 19:15                   ` Jeffrey R. Carter
2008-06-24 20:31                     ` Robert A Duff
2008-06-24 20:50                       ` Ludovic Brenta
2008-06-24 23:02                         ` Robert A Duff [this message]
2008-06-24 23:42                         ` Georg Bauhaus
2008-06-24 21:24                       ` Jeffrey R. Carter
2008-06-24 23:24                         ` Robert A Duff
2008-06-25 15:07                       ` Adam Beneschan
2008-06-24 14:59             ` Adam Beneschan
2008-06-24 16:41               ` Dmitry A. Kazakov
2008-06-24 17:20                 ` Robert A Duff
2008-06-24 17:52                   ` Dmitry A. Kazakov
2008-06-24 23:35                     ` Georg Bauhaus
2008-06-25  8:09                       ` Dmitry A. Kazakov
2008-06-25 10:32                         ` Georg Bauhaus
2008-06-25 12:06                           ` Dmitry A. Kazakov
2008-06-22 20:37       ` Robert A Duff
2008-06-22 21:25         ` Jeffrey R. Carter
2008-07-04 20:52           ` Colin Paul Gloster
2008-07-04 22:15             ` (see below)
2008-07-05 16:06               ` Colin Paul Gloster
2008-07-05 13:38             ` Gary Scott
2008-07-05 16:42               ` Colin Paul Gloster
2008-07-05 19:00                 ` Gary Scott
2008-07-09 19:39                   ` Colin Paul Gloster
2008-07-09 20:35                     ` Richard Maine
2008-07-09 22:49                       ` Terence
2008-07-10  1:07                         ` Gary Scott
2008-07-10 14:10                       ` Colin Paul Gloster
2008-07-10 14:57                         ` fj
2008-07-10 16:47                           ` Richard Maine
2008-07-10 17:03                         ` Dick Hendrickson
2008-07-10 17:26                           ` Craig Powers
2008-07-10 19:55                             ` James Giles
2008-07-10 20:45                               ` Dick Hendrickson
2008-07-10 21:22                                 ` Richard Maine
2008-07-10 21:29                                   ` Craig Powers
2008-07-10 20:45                               ` Craig Powers
2008-07-10 19:51                           ` James Giles
2008-07-11 15:02                             ` Colin Paul Gloster
replies disabled

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