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