From: mockturtle <framefritti@gmail.com>
Subject: Primitive curiosity...
Date: Wed, 17 Sep 2008 13:29:55 -0700 (PDT)
Date: 2008-09-17T13:29:55-07:00 [thread overview]
Message-ID: <447b8b2a-b7bb-4ff5-89bf-a6b7eecc054e@a70g2000hsh.googlegroups.com> (raw)
Dear *,
I was doing some experiments with dispatching operations
and I discovered something that made me curious... Consider
the following 3-file set: 1 package (base.ad?) with a
"root" abstract type (Root) and two derived types
(Derived_1 and Derived_2) and 1 "main" (test_bas.adb)
----------------------- Filename : base.ads ----------------
package Base is
type Root is abstract tagged null record;
-- Uncomment LINE A or LINE B, but not both
-- === LINE A ===
-- procedure Print(X : Root) is abstract;
type Derived_1 is new Root with
record
A : Integer;
end record;
type Derived_2 is new Root with
record
B : Float;
end record;
-- === LINE B ===
-- procedure Print(X : Root) is abstract;
procedure Print(X : Derived_1);
procedure Print(X : Derived_2);
end Base;
------------------ Filename : base.adb ----------------------
with Ada.Text_Io;
package body Base is
procedure Print(X : Derived_1) is
begin
Ada.Text_Io.Put_Line ("[1] " & Integer'Image(X.A));
end Print;
procedure Print(X : Derived_2) is
begin
Ada.Text_Io.Put_Line ("[2] " & Float'Image(X.B));
end Print;
end Base;
-------------------------------------------------------------
----------------- Filename : test_base.adb -----------
-------------------------------------------------------------
with Base;
procedure Test_Base is
function Gimme (X : Boolean)
return Base.Root'Class is
begin
if (X) then
return Base.Derived_1'(A => 42);
else
return Base.Derived_2'(B => 3.1415);
end if;
end Gimme;
begin
Base.Print(Gimme(True));
Base.Print(Gimme(False));
end Test_Base;
--------------------------------------------------------------------
--------------------------------------------------------------------
--------------------------------------------------------------------
The idea is that the first line in Test_Base should call
Print of Derived_1 and the second line should call
procedure Print of Derived_2. In order to compile, one must
uncomment LINE A or LINE B (but not both) in
base.ads.
Now the fun bit comes
1) If I uncomment LINE A everything is fine, but...
2) if I uncomment LINE B gcc (4.1.3) complaints with
.... other lines ....
base.ads:19:14: this primitive operation is declared too late
I interpreted the "immediately within" in the sentence
[AARM05 3.2.3(2/6)]
"The primitive subprograms of a specific type are
defined as follows:
[...]
* For a specific type declared immediately within
a package_specification, any subprograms
(in addition to the enumeration literals) that are
explicitly declared _immediately_within_ the same
package_specification and that operate on the type;"
as "declared in the same file as the type", but according
to the behaviour described above (and some other
experiments) it seems that there is
a further constraint "before the declaration of any
derived type."
Is this actually implied by the RM description or is gcc
being strict? (Maybe "immediately within" was given a
technical sense, but I was not able to find the definition)
Why this? There is some deep technical reason or is it
just to enforce the programmer to be "order" and declare
primitive subprograms close to the type definition?
Thank you in advance
next reply other threads:[~2008-09-17 20:29 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-17 20:29 mockturtle [this message]
2008-09-17 21:13 ` Primitive curiosity Jeffrey R. Carter
2008-09-17 21:19 ` Adam Beneschan
2008-09-18 19:27 ` mockturtle
2008-09-24 14:02 ` Martin
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox