comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: What is X'Address of an empty array?
Date: Wed, 1 Jun 2022 14:49:25 +0200	[thread overview]
Message-ID: <t77n8k$1jan$1@gioia.aioe.org> (raw)
In-Reply-To: t761nn$daf$1@dont-email.me

On 2022-05-31 23:35, Randy Brukardt wrote:
> Aliased objects should never have zero-size in Ada (or, at least, ever be
> allocated at the same address). I believe that is because of the required
> result of the equality operator. Specifically:
> 
>      type NUL is array (1..0) of Integer;
>      A, B : aliased NUL;
>      type PNul is access Nul;
>      PA : PNul := A'Access; PB : PNul := B'Access;
> 
>      if PA = PB then
>           Report.Failed ("Access to two distinct objects can not be equal");
>      end if;
> 
> If an object is not aliased, it is undefined whether 'Address will work
> reliably with it (it probably does in GNAT, it might not in Janus/Ada, etc.)
> If the objects ARE aliased, then 'Address works essentially the same as
> 'Access.
> 
> I personally find this a bit of overspecification in Ada, but since
> zero-size objects are unusual, no one has thought it worth going through the
> effort to change. (And of course such a change would complicate static
> analysis.) We (the ARG) did discuss this topic at one point (I don't have
> the AI number at hand).

It is actually rather nice.

I recently stumbled upon code:

    A (A'First)'Address

in C bindings, when the other side has something like:

    const double * a, int len

It of course fails in the marginal case when the array is empty. But 
A'Address seems never do.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de

      reply	other threads:[~2022-06-01 12:49 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-31 12:19 What is X'Address of an empty array? Dmitry A. Kazakov
2022-05-31 21:35 ` Randy Brukardt
2022-06-01 12:49   ` Dmitry A. Kazakov [this message]
replies disabled

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