comp.lang.ada
 help / color / mirror / Atom feed
From: Andy <andy@nospam.com.tj>
Subject: Re: Default equality for generic formal types
Date: 2000/02/22
Date: 2000-02-22T11:37:13+00:00	[thread overview]
Message-ID: <38B282F4.42A2@nospam.com.tj> (raw)
In-Reply-To: 38B2204B.B08162F3@kaisere.com

This conflicts with my experience with both Apex and Gnat. If the "="
function is overridden, then this is the function used.

As usual with these sorts of question, I like to write a micro test
program
to see what really happens. It kind of helps me remember for next time.

Andy

PS Here my test program.

with Ada.Text_Io;

procedure Gen is

    generic
        type A is private;
        with function "=" (L, R : in A) return Boolean is <>;
        with function Eq  (L, R : in A) return Boolean is "=";
    procedure Check_Generic;

    procedure Check_Generic is
        L, R : A;
        B : Boolean;
    begin
        L := R;
        Ada.Text_Io.Put_Line ("-----");
        B := L = R;
        Ada.Text_Io.Put_Line ("-----");
        B := Eq (L,R);
        Ada.Text_Io.Put_Line ("-----");
    end Check_Generic;

    type Object is null record;

    function "=" (L, R : in Object) return Boolean is
    begin
        Ada.Text_Io.Put_Line ("override invoked");
        return True;
    end;

    procedure Check1 is
        new Check_Generic (Object);

    function "=" (L, R : in Integer) return Boolean is
    begin
        Ada.Text_Io.Put_Line ("int override invoked");
        return True;
    end;

    procedure Check2 is
        new Check_Generic (Integer);

begin

    Check1;
    Check2;

end Gen;


R. Tim Coslet wrote:
> 
> See AARM 12.3(29.b)
> 
> For upward compatibility with Ada83 (which had this bug/feature) for
> untagged types the the default function reverts to the predefined one. I
> can't seem to locate the reference right now, but I believe that even if you
> explicitly passed the instantion the "=" function, it still reverts to the
> predefined one. However if your "=" function had a different name (like
> "equal" you could pass that explicitly (a rename might work to accomplish
> this workaround, but if not a wrapper function will).
> 
> This is not a problem with tagged types.
> 
> Matthew Heaney wrote:
> 
> > Suppose I have a generic subprogram like this:
> >
> > generic
> >   type Item_Type is private;
> >   with function Item_Eq (L, R : Item_Type)
> >     return Boolean is "=";
> > procedure Generic_Op (O : T);
> >
> > Suppose further that the generic actual type is nontagged, and has
> > overridden its predefined equality.
> >
> > To which equality does Item_Eq refer?  The overridden version, or the
> > predefined version?  What does that default value for Item_Eq, "=", mean
> > at the time of compilation of the generic?
> >
> > If the client does not explicitly pass in an item equality op during the
> > instantiation (likely, because the type is nonlimited), then inside
> > Generic_Op, what does Item_Eq refer to?  Predefined equality, or the
> > overridding version?
> >
> > Thanks in advance,
> > Matt




      reply	other threads:[~2000-02-22  0:00 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-02-22  0:00 Default equality for generic formal types Matthew Heaney
2000-02-21  0:00 ` R. Tim Coslet
2000-02-22  0:00   ` Andy [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