!standard 4.3.2(8) 11-11-08 AI12-0008-1/01 !class binding interpretation 11-11-08 !status work item 11-11-08 !status received 11-09-26 !priority Low !difficulty Easy !qualifier Omission !subject Bad ancestor constraints for extension aggregates !summary ** TBD. !question 4.3.2(8) does not seem to apply if the ancestor is constrained. Consider: procedure Foo is type Root (D : natural) is tagged record F1 : String (1 .. D) := (others => 'x'); end record; subtype S1 is Root (1); subtype S2 is Root (2); type Ext is new S1 with record F2 : Integer; end record; Var : Ext := (S2 with F2 => 123); begin null; end Foo; One would hope that this would raise Constraint_Error, but nothing seems to have that effect. !recommendation ** TBD. !wording ** TBD. !discussion Perhaps a static matching rule would be better if the target type is constrained?? !ACATS Test !ASIS !appendix From: Steve Baird Sent: Monday, September 26, 2011 5:28 PM The following example obviously should raise Constraint_Error (assuming that it is not rejected at compile time - one could imagine adding some sort of "statically matching subtype" legality rule, but that seems outside the scope of this discussion): procedure Foo is type Root (D : natural) is tagged record F1 : String (1 .. D) := (others => 'x'); end record; subtype S1 is Root (1); subtype S2 is Root (2); type Ext is new S1 with record F2 : Integer; end record; Var : Ext := (S2 with F2 => 123); begin null; end Foo; It seems that the present RM wording fails to capture this intent. Note that 4.3.2(8) does not apply because it begins with "If the type of the ancestor_part has discriminants that are not inherited by the type of the extension_aggregate, ..." Perhaps this condition needs to be expanded to include the case of inherited discriminants and a constrained ancestor subtype_mark. ****************************************************************