Hi All, About 3 months I posted a question on comp.lang.ada. Tucker responded. I posted some follow up questions, but never saw a response. I hope that Tucker or someone on this mail list might be able to answer my questions. Take care, Ed ---------------------------------------------------------------- "Always do right. It will please a few and astonish the rest." Mark Twain ---------------------------------------------------------------- Edward Colbert President Absolute Software Co., Inc. 1444 Sapphire Dr. Carlsbad, CA 92009-1200 Phone: (760) 929-0612 FAX: (760) 929-0236 E-Mail: [log in to unmask] Website: www.abssw.com -----Original Message----- Hi Tucker, > > Hi All, > > > > Below is a simplified example from Richard Riehle's & my course on > > Ada. GNAT v3.13p says that the call Is_Item is an ambiguous > > expression, and ObjectAda v 7.2 says the statement is illegal > > based on LRM 5.2(6). Both Richard and I thought that the > > expression is tag indeterminate, LRM 3.9.2(6), and would static > > resolved, LRM 3.9.2(19). Are Richard and I missing something or > > are both compilers wrong? > > The call on Is_Item is ambiguous, even though one of the possible > interpretations (the one returning type T1) violates 5.2(6). This > is one of those cases where the overload resolution rules are less > picky than the legality rules, which can be a bit confusing. > > ObjectAda is not being very helpful by telling you that one of the > interpretations is illegal, without first telling you that the > expression is considered ambiguous by the overloading rules. > Why is the expression ambiguous? Isn't the tag of C, which in this case is compile time determinable, used to resolve the call to Is_Item per 5.2(9)? I suppose it could be ambiguous if the expression is evaluated first as allowed by 5.2(7); but then when would 5.2(8-10) apply? > In any case, if only the Is_Item that returned type T1 were directly > visible, the expression would not be ambiguous, and the call would > be legal. It would involve a "dispatching on result" where the tag > of "C" would determine which body of Is_Item were called. > > In general the overload resolution and legality rules relating to > classwide assignment are confusing at best. We tried other rules, > but they had worse problems, so I suppose the current rules are the > best of a set of unpleasant alternatives. ObjectAda's error message > was unfortunately only adding to the confusion. > Clearly, something is confusing Richard & I. > > > > package Dispatching_Examples > > is > > type T1 is tagged private; > > function Is_Item return T1; > > > > type T2 is new T1 with private; > > function Is_Item return T2; > > > > private > > -- full definition of T1 and T2 > > type T1 is tagged null record; > > type T2 is new T1 with null record; > > end Dispatching_Examples; > > > > with Dispatching_Examples; > > use Dispatching_Examples; > > procedure Dispatching_Examples_Driver is > > A, B : T1; -- simple variables > > Q, R : T2; -- simple variables > > C : T1'Class := A; -- class-wide variable > > D : T2'Class := R ; -- class-wide variable > > begin > > C := Is_Item ; -- static resolution? > > end Dispatching_Examples_Driver; > > -- > -Tucker Taft [log in to unmask] http://www.avercom.net > Chief Technology Officer, AverCom Corporation (A Titan Company) > Bedford, MA USA (AverCom was formerly the Commercial Division of AverStar: > http://www.averstar.com/~stt) >