• What is X'Address of an empty array?

    From Dmitry A. Kazakov@21:1/5 to All on Tue May 31 14:19:24 2022
    I have a language lawyering question. According to ARM X'Address is the
    address of the first array element. What is the address of empty array?

    In the case of an array with bounds it could be the address following
    the bounds.

    But what about a definite empty array? Of zero length (and presumably
    zero size). Would the compiler have to invent some address?

    P.S. With GNAT:

    type NUL is array (1..0) of Integer;
    S : NUL;

    S'Size is 8 and it has some address that holds the byte.

    Talking about the dark matter in our Universe. This is what empty arrays
    are constructed of! (:-))

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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Randy Brukardt@21:1/5 to Dmitry A. Kazakov on Tue May 31 16:35:49 2022
    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).

    Randy.




    "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> wrote in message news:t7514c$11tj$1@gioia.aioe.org...
    I have a language lawyering question. According to ARM X'Address is the >address of the first array element. What is the address of empty array?

    In the case of an array with bounds it could be the address following the bounds.

    But what about a definite empty array? Of zero length (and presumably zero size). Would the compiler have to invent some address?

    P.S. With GNAT:

    type NUL is array (1..0) of Integer;
    S : NUL;

    S'Size is 8 and it has some address that holds the byte.

    Talking about the dark matter in our Universe. This is what empty arrays
    are constructed of! (:-))

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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Dmitry A. Kazakov@21:1/5 to Randy Brukardt on Wed Jun 1 14:49:25 2022
    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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)