-- { dg-do run } with System; procedure SSO5 is type Short_Int is mod 2**16; type Rec1 is record F1 : Short_Int; F2 : Short_Int; end record; for Rec1 use record F1 at 0 range 0 .. 15; F2 at 0 range 16 .. 31; end record; for Rec1'Bit_Order use System.High_Order_First; for Rec1'Scalar_Storage_Order use System.High_Order_First; type Rec2 is record R1 : Rec1; end record; for Rec2 use record R1 at 0 range 1 .. 32; end record; for Rec2'Bit_Order use System.High_Order_First; for Rec2'Scalar_Storage_Order use System.High_Order_First; type Rec3 is record Data : Rec1; end record; for Rec3 use record Data at 0 range 0 .. 31; end record; for Rec3'Bit_Order use System.High_Order_First; for Rec3'Scalar_Storage_Order use System.High_Order_First; procedure Copy (Message : in Rec3) is Local : Rec2; begin Local := (R1 => Message.Data); if Local.R1 /= Message.Data then raise Program_Error; end if; end; Message : Rec3; begin Message := (Data => (2, 3)); Copy(Message); end;