1-- { dg-do run }
2-- { dg-options "-O" }
3
4with System; use System;
5
6procedure Boolean_Bitfield is
7
8  Units_Per_Integer : constant :=
9    (Integer'Size + System.Storage_Unit - 1) / System.Storage_Unit;
10
11  type E_type is (Red, Blue, Green);
12
13  type Parent_Type is record
14    I : Integer range 0 .. 127 := 127;
15    C : Character := 'S';
16    B : Boolean := False;
17    E : E_Type := Blue;
18  end record;
19
20  for Parent_Type use record
21    C at 0 * Units_Per_Integer range 0 .. Character'Size - 1;
22    B at 1 * Units_Per_Integer range 0 .. Boolean'Size - 1;
23    I at 2 * Units_Per_Integer range 0 .. Integer'Size/2 - 1;
24    E at 3 * Units_Per_Integer range 0 .. Character'Size - 1;
25  end record;
26
27  type Derived_Type is new Parent_Type;
28
29  for Derived_Type use record
30    C at 1 * Units_Per_Integer range 1 .. Character'Size + 1;
31    B at 3 * Units_Per_Integer range 1 .. Boolean'Size + 1;
32    I at 5 * Units_Per_Integer range 1 .. Integer'Size/2 + 1;
33    E at 7 * Units_Per_Integer range 1 .. Character'Size + 1;
34  end record;
35
36  Rec   : Derived_Type;
37
38begin
39  Rec := (12, 'T', True, Red);
40
41  if (Rec.I /= 12) or (Rec.C /= 'T') or (not Rec.B) or (Rec.E /= Red) then
42    raise Program_Error;
43  end if;
44end;
45