1-- { dg-do run }
2-- { dg-options "-O" }
3
4with Interfaces; use Interfaces;
5with Unchecked_Conversion;
6
7procedure Opt31 is
8
9  type Unsigned_24 is new Unsigned_32 range 0 .. 2**24 - 1;
10  subtype Time_T is Unsigned_24 range 0 .. 24 * 60 * 60 * 128 - 1;
11
12  type Messages_T is array (Positive range <>) of Unsigned_8;
13  subtype T_3Bytes is Messages_T (1 .. 3);
14
15  type Rec1 is record
16    F : Time_T;
17  end record;
18  for Rec1 use record
19    F at 0 range 0 .. 23;
20  end record;
21  for Rec1'Size use 24;
22
23  type Rec2 is record
24    I1,I2,I3,I4 : Integer;
25    R1 : Rec1;
26  end record;
27
28  function Conv is new Unchecked_Conversion (T_3Bytes, Rec1);
29
30  procedure Decode (M : Messages_T) is
31    My_Rec2 : Rec2;
32  begin
33    My_Rec2.R1 := Conv (M (1 .. 3));
34    if not My_Rec2.R1.F'Valid then
35      raise Program_Error;
36    end if;
37  end;
38
39  Message : Messages_T (1 .. 4) := (16#18#, 16#0C#, 16#0C#, 16#18#);
40
41begin
42  Decode (Message);
43end;
44