comp.lang.ada
 help / color / mirror / Atom feed
* Primitive curiosity...
@ 2008-09-17 20:29 mockturtle
  2008-09-17 21:13 ` Jeffrey R. Carter
  2008-09-17 21:19 ` Adam Beneschan
  0 siblings, 2 replies; 5+ messages in thread
From: mockturtle @ 2008-09-17 20:29 UTC (permalink / 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



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2008-09-24 14:02 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-09-17 20:29 Primitive curiosity mockturtle
2008-09-17 21:13 ` Jeffrey R. Carter
2008-09-17 21:19 ` Adam Beneschan
2008-09-18 19:27   ` mockturtle
2008-09-24 14:02   ` Martin

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