1--  Copyright 2019-2023 Free Software Foundation, Inc.
2--
3--  This program is free software; you can redistribute it and/or modify
4--  it under the terms of the GNU General Public License as published by
5--  the Free Software Foundation; either version 3 of the License, or
6--  (at your option) any later version.
7--
8--  This program is distributed in the hope that it will be useful,
9--  but WITHOUT ANY WARRANTY; without even the implied warranty of
10--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11--  GNU General Public License for more details.
12--
13--  You should have received a copy of the GNU General Public License
14--  along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16with System;
17with Pck; use Pck;
18
19procedure Foo is
20   type Key is (Alpha, Beta, Omega);
21
22   type Inner(Disc : Key := Omega) is record
23      case Disc is
24         when Alpha =>
25            Small : Integer range 0..255;
26            Second : Integer range 0..255;
27         when Beta =>
28            Bval : Integer range 0..255;
29         when others =>
30            Large : Integer range 255..510;
31            More : Integer range 255..510;
32      end case;
33   end record;
34   pragma Unchecked_Union (Inner);
35
36   type Outer(Disc : Key := Alpha) is record
37      case Disc is
38         when Alpha =>
39            Field_One : Integer range 0..255;
40         when others =>
41            Field_Two : Integer range 255..510;
42      end case;
43   end record;
44   pragma Unchecked_Union (Outer);
45
46   type Pair is record
47      Pone : Inner;
48      Ptwo : Outer;
49   end record;
50
51   Value : Pair;
52
53begin
54   Do_Nothing (Value'Address);          -- BREAK
55end Foo;
56