This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug ada/33769] New: Object prefixed notation in Ada 2005.
- From: "abo dot pignard at wanadoo dot fr" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 14 Oct 2007 10:24:12 -0000
- Subject: [Bug ada/33769] New: Object prefixed notation in Ada 2005.
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
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