On Mar 18, 8:22 am, Tony <truand.t...@[EMAIL PROTECTED]
> wrote:
> I just do not understand why the following code compiles with the Aonix
> compiler and not with the Gnat GPL 2007?
Because one of the compilers has a bug.
Or did you want a *helpful* answer??? :) :) :)
>
> package A_Pkg is
> type A (L : Natural) is tagged null record;
> end A_Pkg;
>
> package A_Pkg.B_Pkg is
> type B is new A with record
> T : String(1..L);
> end record;
> end A_Pkg.B_Pkg;
>
> with A_Pkg.B_Pkg;
> procedure Strange is
> begin
> null;
> end Strange;
>
> => RM95 3.7 (18) ??
Yes, B inherits the discriminant L, but this doesn't make L
*visible*. In order to use L by itself, as you did in the definition
of the component T, L has to be directly visible. The rules for this
are in 8.1 and 8.2, and aren't easy to understand. The applicable
rules here are that: The declaration of L (when the discriminant is
first declared) is visible up to the end of the declarative region
immediately enclosing it, which is the definition of the type A. But
this declarative region does *not* encompass the declarations of any
type extensions. (Also, the fact that B "inherits" L is not
equivalent to there being an implicit declaration of L; unlike
inherited subprograms, inherited discriminants aren't implicitly
declared.) Thus, L is not directly visible within the declaration of
B.
However, I tried changing the declaration of T as follows:
T : String (1 .. B.L);
and GNAT accepted it. (I haven't done enough testing to make sure
GNAT handles it correctly in other ways, though.) Here, B refers to
the "current instance" of the type (8.6(17)), and 3.7(18) means that
all instances of the type will have a component L that is inherited
from A, so this should be legal unless there are some other rules that
I've missed (and that GNAT also missed).
Hope this helps,
-- Adam


|