When using object prefixed notation of Ada 2005 with GNAT GPL 2007 on Mac OS X,
I come to different results.
$ gcc -v
Using built-in specs.
Target: powerpc-apple-darwin8.9.0
Configured with: ../src/configure
--prefix=/Users/pascal/Documents/Extraction/070521/gnat
--enable-languages=c,ada --disable-nls --disable-libada --disable-checking
--disable-libssp --disable-libgomp --disable-libgcj
Thread model: posix
gcc version 4.1.3 20070403 for GNAT GPL 2007 (20070402)

a) Notation "Ada 95" :

   package Figure is
      type Coordonnee is range -100 .. 100;
      type Instance is abstract tagged private;
      subtype Class is Instance'Class;
      procedure Positionne (Objet : in out Instance; X, Y : Coordonnee);
      function RetourneX (Objet : in Instance) return Coordonnee;
      function RetourneY (Objet : in Instance) return Coordonnee;
      procedure Allume (Objet : in Instance) is abstract;
      procedure Eteins (Objet : in Instance) is abstract;
      procedure Affiche (Objet : in Class; EstVisible : Boolean);
      procedure Deplace (Objet : in out Class; DX, DY : Coordonnee);
   private
      type Instance is abstract tagged record
         X, Y : Coordonnee := 0;
      end record;
   end Figure;

   package body Figure is
      procedure Positionne (Objet : in out Instance; X, Y : Coordonnee) is
      begin
         Objet.X := X;
         Objet.Y := Y;
      end Positionne;
      function RetourneX (Objet : in Instance) return Coordonnee is
      begin
         return Objet.X;
      end RetourneX;
      function RetourneY (Objet : in Instance) return Coordonnee is
      begin
         return Objet.Y;
      end RetourneY;
      procedure Affiche (Objet : in Class; EstVisible : Boolean) is
      begin
         if EstVisible then
            Allume (Objet);
         else
            Eteins (Objet);
         end if;
      end Affiche;
      procedure Deplace (Objet : in out Class; DX, DY : Coordonnee) is
      begin
         Affiche (Objet, False);
         Positionne (Objet, Objet.X + DX, Objet.Y + DY);
         Affiche (Objet, True);
      end Deplace;
   end Figure;

No error, note usage of sub-type Class.

b) Notation "Ada 2005" :

   package Figure is
      type Coordonnee is range -100 .. 100;
      type Instance is abstract tagged private;
      subtype Class is Instance'Class;
      procedure Positionne (Objet : in out Instance; X, Y : Coordonnee);
      function RetourneX (Objet : in Instance) return Coordonnee;
      function RetourneY (Objet : in Instance) return Coordonnee;
      procedure Allume (Objet : in Instance) is abstract;
      procedure Eteins (Objet : in Instance) is abstract;
      procedure Affiche (Objet : in Class; EstVisible : Boolean);
      procedure Deplace (Objet : in out Class; DX, DY : Coordonnee);
   private
      type Instance is abstract tagged record
         X, Y : Coordonnee := 0;
      end record;
   end Figure;

   package body Figure is
      procedure Positionne (Objet : in out Instance; X, Y : Coordonnee) is
      begin
         Objet.X := X;
         Objet.Y := Y;
      end Positionne;
      function RetourneX (Objet : in Instance) return Coordonnee is
      begin
         return Objet.X;
      end RetourneX;
      function RetourneY (Objet : in Instance) return Coordonnee is
      begin
         return Objet.Y;
      end RetourneY;
      procedure Affiche (Objet : in Class; EstVisible : Boolean) is
      begin
         if EstVisible then
            Objet.Allume;
         else
            Objet.Eteins;
         end if;
      end Affiche;
      procedure Deplace (Objet : in out Class; DX, DY : Coordonnee) is
      begin
         Objet.Affiche (False);  -- error
         Objet.Positionne (Objet.X + DX, Objet.Y + DY);
         Objet.Affiche (True);   -- error
      end Deplace;
   end Figure;

I've got with sub-type Class the following errors:
figures_abstraites2005.adb:49:15: no selector "Affiche" for type
"Instance'Class" defined at line 6
figures_abstraites2005.adb:53:15: no selector "Affiche" for type
"Instance'Class" defined at line 6

c) Modified code without usage of sub-type Class:

   package Figure is
      type Coordonnee is range -100 .. 100;
      type Instance is abstract tagged private;
      subtype Class is Instance'Class;
      procedure Positionne (Objet : in out Instance; X, Y : Coordonnee);
      function RetourneX (Objet : in Instance) return Coordonnee;
      function RetourneY (Objet : in Instance) return Coordonnee;
      procedure Allume (Objet : in Instance) is abstract;
      procedure Eteins (Objet : in Instance) is abstract;
      procedure Affiche (Objet : in Instance'Class; EstVisible : Boolean);
      procedure Deplace (Objet : in out Instance'Class; DX, DY : Coordonnee);
   private
      type Instance is abstract tagged record
         X, Y : Coordonnee := 0;
      end record;
   end Figure;

   package body Figure is
      procedure Positionne (Objet : in out Instance; X, Y : Coordonnee) is
      begin
         Objet.X := X;
         Objet.Y := Y;
      end Positionne;
      function RetourneX (Objet : in Instance) return Coordonnee is
      begin
         return Objet.X;
      end RetourneX;
      function RetourneY (Objet : in Instance) return Coordonnee is
      begin
         return Objet.Y;
      end RetourneY;
      procedure Affiche (Objet : in Instance'Class; EstVisible : Boolean) is
      begin
         if EstVisible then
            Objet.Allume;
         else
            Objet.Eteins;
         end if;
      end Affiche;
      procedure Deplace (Objet : in out Instance'Class; DX, DY : Coordonnee) is
      begin
         Objet.Affiche (False);
         Objet.Positionne (Objet.X + DX, Objet.Y + DY);
         Objet.Affiche (True);
      end Deplace;
   end Figure;

No more errors!?

What is this mystery?
Is there an Ada 2005 rule preventing from usage of sub-types in object
pre-fixed notation?
Restriction from GNAT?


-- 
           Summary: Object prefixed notation in Ada 2005.
           Product: gcc
           Version: 4.1.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ada
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: abo dot pignard at wanadoo dot fr
 GCC build triplet: powerpc-apple-darwin8.9.0
  GCC host triplet: powerpc-apple-darwin8.9.0
GCC target triplet: powerpc-apple-darwin8.9.0


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33769

Reply via email to