-- { dg-do run } -- { dg-options "-O" } with Interfaces; use Interfaces; with Unchecked_Conversion; procedure Opt31 is type Unsigned_24 is new Unsigned_32 range 0 .. 2**24 - 1; subtype Time_T is Unsigned_24 range 0 .. 24 * 60 * 60 * 128 - 1; type Messages_T is array (Positive range <>) of Unsigned_8; subtype T_3Bytes is Messages_T (1 .. 3); type Rec1 is record F : Time_T; end record; for Rec1 use record F at 0 range 0 .. 23; end record; for Rec1'Size use 24; type Rec2 is record I1,I2,I3,I4 : Integer; R1 : Rec1; end record; function Conv is new Unchecked_Conversion (T_3Bytes, Rec1); procedure Decode (M : Messages_T) is My_Rec2 : Rec2; begin My_Rec2.R1 := Conv (M (1 .. 3)); if not My_Rec2.R1.F'Valid then raise Program_Error; end if; end; Message : Messages_T (1 .. 4) := (16#18#, 16#0C#, 16#0C#, 16#18#); begin Decode (Message); end;