comp.lang.ada
 help / color / mirror / Atom feed
From: Tucker Taft <stt@avercom.net>
Subject: Re: Dispatching Example
Date: Tue, 04 Sep 2001 17:30:01 -0400
Date: 2001-09-04T21:30:02+00:00	[thread overview]
Message-ID: <3B9547D9.BE2CC282@avercom.net> (raw)
In-Reply-To: G9Nk7.77$K35.2047@news.pacbell.net

Ed Colbert wrote:
> 
> 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 mbiguous 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.

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.

-Tucker Taft  stt@avercom.net 
> 
> 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   stt@avercom.net   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)



  parent reply	other threads:[~2001-09-04 21:30 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-09-03 15:16 Dispatching Example Ed Colbert
2001-09-04 10:55 ` Jacob Sparre Andersen
2001-09-04 21:30 ` Tucker Taft [this message]
2001-09-04 22:18   ` Pat Rogers
2001-09-05 16:02     ` Tucker Taft
2001-09-05 21:19       ` Florian Weimer
2001-09-10  0:50   ` Ed Colbert
replies disabled

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