Mehdi Saada
2018-03-19 13:01:32 UTC
Je me demande pourquoi dans le cas ou le type paramêtre formel d'un générique est a pour ancêtre un certain type étiquetté on peut changer la représentation:
with AAA; use AAA;
generic
type NT is new type_A with private;
package TENTATIVE is
type B_Type is new Nt with SIZE => 300;
procedure P1 (B : B_Type);
end TENTATIVE;
package AAA is
type Type_A is tagged
record
INT: INTEGER;
end record;
end AAA;
with AAA, TENTATIVE; use AAA;
procedure MAIN is
package TEST is new TENTATIVE(b_type);
begin
end;
Légal ou pas ça compile, tandis que ceci, ou NT est seulement privé, ne marche pas "
De façon amusante, ça ne marche à nouveau plus non plus quand on change
"type NT is new type_A with private;" par
"type T (<>) is tagged private;"
Pourquoi ceci par contre est illégal:
et: "type derived from tagged type must have extension"
"representation item not allowed for generic type"
with Ada.TExt_Io; use Ada.Text_Io;
with Aaa; use Aaa;
generic
type NT is private;
package TENTATIVE is
type B_Type is new Type_A with Size => 300;
end TENTATIVE;
avec comme paramêtre effectif type article NON étiquetté.
Donc on a pas le droit de donner un type étiquetté en paramêtre effectif, quand le paramêtre formel ne l'est pas ?
Merci
with AAA; use AAA;
generic
type NT is new type_A with private;
package TENTATIVE is
type B_Type is new Nt with SIZE => 300;
procedure P1 (B : B_Type);
end TENTATIVE;
package AAA is
type Type_A is tagged
record
INT: INTEGER;
end record;
end AAA;
with AAA, TENTATIVE; use AAA;
procedure MAIN is
package TEST is new TENTATIVE(b_type);
begin
end;
Légal ou pas ça compile, tandis que ceci, ou NT est seulement privé, ne marche pas "
De façon amusante, ça ne marche à nouveau plus non plus quand on change
"type NT is new type_A with private;" par
"type T (<>) is tagged private;"
Pourquoi ceci par contre est illégal:
et: "type derived from tagged type must have extension"
"representation item not allowed for generic type"
with Ada.TExt_Io; use Ada.Text_Io;
with Aaa; use Aaa;
generic
type NT is private;
package TENTATIVE is
type B_Type is new Type_A with Size => 300;
end TENTATIVE;
avec comme paramêtre effectif type article NON étiquetté.
Donc on a pas le droit de donner un type étiquetté en paramêtre effectif, quand le paramêtre formel ne l'est pas ?
Merci