I have the following problem and I don't really understand why:
procedure Main is
type Component_t (Id : Natural) is tagged limited null record;
type Root_t (Id : Natural) is tagged limited null record;
type Child_t is limited new Root_t with
record
component : Component_t(Id => Id);
end record;
begin
-- Insert code here.
null;
end Main;
9:38 -> error: Id is not visible
error: non-visible declaration at line 5
error: inherited discriminant not allowed here (RM 3.8 (12), 3.8.1 (6))
I'm not sure if the mentioned RM's are the following:
3.8 12/3 A name that denotes a noninherited discriminant is allowed within the declaration of the type, but not within the discriminant_part. If the discriminant is used to define the constraint of a component, the bounds of an entry family, or the constraint of the parent subtype in a derived_type_definition, then its name shall appear alone as a direct_name (not as part of a larger expression or expanded name). A discriminant shall not be used to define the constraint of a scalar component.
3.8.1 6 The discriminant_direct_name shall resolve to denote a discriminant (called the discriminant of the variant_part) specified in the known_discriminant_part of the full_type_declaration that contains the variant_part. The expected type for each discrete_choice in a variant is the type of the discriminant of the variant_part.
If I declare child_t as follows it compiles, but it seems really weird to me. Is it ok and acceptable? Are there any less verbose options to solve it?
type Child_t (Id : Natural) is limited new Root_t (Id => Id) with
record
component : Component_t(Id => Id);
end record;
IIUC the reason is:
type Child_t is limited new Root_t with
So, what you have here is Root_T
doesn't supply a value to the discriminant. (You could, for example have Type Numeric is limited Root_Type( ID => A_Type ) --...
, which says that Numeric and its descendants are have ID
set to A_Type
.)
If I declare child_t as follows it compiles, but it seems really weird to me. Is it ok and acceptable? Are there any less verbose options to solve it?
type Child_t (Id : Natural) is limited new Root_t (Id => Id) with
record
component : Component_t(Id => Id);
end record;
This is the correct way to say "Child_t is discriminated and supplies its discriminant's value to Root_T's discriminant-value."