This only occurs with optimization enabled, but the expanded code is always
wrong because it reuses the formal parameter of an initialization procedure
associated with a discriminant (a discriminal in GNAT parlance) outside of
the initialization procedure.
gcc/ada/
* checks.adb (Selected_Length_Checks.Get_E_Length): For a
component of a record with discriminants and if the expression is
a selected component, try to build an actual subtype from its
prefix instead of from the discriminal.
if Ekind (Scope (E)) = E_Record_Type
and then Has_Discriminants (Scope (E))
then
- N := Build_Discriminal_Subtype_Of_Component (E);
+ -- If the expression is a selected component, in other words,
+ -- has a prefix, then build an actual subtype from the prefix.
+ -- Otherwise, build an actual subtype from the discriminal.
+
+ if Nkind (Expr) = N_Selected_Component then
+ N := Build_Actual_Subtype_Of_Component (E, Expr);
+ else
+ N := Build_Discriminal_Subtype_Of_Component (E);
+ end if;
if Present (N) then
Insert_Action (Expr, N);