From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=BAYES_00,INVALID_MSGID, REPLYTO_WITHOUT_TO_CC autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,6fa8b1cda58f3518 X-Google-Attributes: gid103376,public From: Andy Subject: Re: Default equality for generic formal types Date: 2000/02/22 Message-ID: <38B282F4.42A2@nospam.com.tj>#1/1 X-Deja-AN: 588351939 Cache-Post-Path: news.ozonline.com.au!unknown@melb-pool-154.ozonline.com.au Content-Transfer-Encoding: 7bit References: <38B2204B.B08162F3@kaisere.com> Content-Type: text/plain; charset=us-ascii X-Complaints-To: abuse@connect.com.au X-Trace: perki.connect.com.au 951219433 5419 203.4.248.42 (22 Feb 2000 11:37:13 GMT) Organization: Australia On Line Pty Ltd Mime-Version: 1.0 Reply-To: andy@nospam.com.tj NNTP-Posting-Date: 22 Feb 2000 11:37:13 GMT Newsgroups: comp.lang.ada Date: 2000-02-22T11:37:13+00:00 List-Id: 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