aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/ada/acats/tests/c3/c393008.a
blob: d2d2aefed929cf3af4f11c6fbe85e41ae1275940 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
-- C393008.A
--
--                             Grant of Unlimited Rights
--
--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained 
--     unlimited rights in the software and documentation contained herein.
--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making 
--     this public release, the Government intends to confer upon all 
--     recipients unlimited rights  equal to those held by the Government.  
--     These rights include rights to use, duplicate, release or disclose the 
--     released technical data and computer software in whole or in part, in 
--     any manner and for any purpose whatsoever, and to have or permit others 
--     to do so.
--
--                                    DISCLAIMER
--
--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED 
--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE 
--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
--     PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- TEST OBJECTIVE:
--      Check that an extended type can be derived from an abstract type.
--
-- TEST DESCRIPTION:
--      Declare a tagged record; declare an abstract 
--      primitive operation and a non-abstract primitive operation of the 
--      type.  Derive an extended type from it, including a new component.
--      Use the derived type, the overriding operation and the inherited 
--      operation to instantiate a generic package.  The overriding operation
--      calls a new primitive operation and an inherited operation [so the 
--      instantiation must get this sorted out correctly].
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!

with Report;
with TCTouch;
procedure C393008 is

package C393008_0 is

  type Status_Enum is (No_Status, Handled, Unhandled, Pending);

  type Alert_Type is abstract tagged record
      Status : Status_Enum;
      Reply  : Boolean;
      Urgent : Boolean;
  end record;

  subtype Serial_Number is Integer range 0..Integer'last;
  Serial_Num : Serial_Number := 0;

  procedure Handle   (A : in out Alert_Type) is abstract; 
                                        -- abstract primitive operation

  -- the procedure Init would be _nice_ have this procedure be non_abstract
  -- and create a "base" object with a "null" constraint.  The language
  -- will not allow this due to the restriction that an object of an
  -- abstract type cannot be created.  Hence Init must be abstract,
  -- requiring any type derived directly from Alert_Type to declare
  -- an Init.
  --
  -- In light of this, I have changed init to a function to more closely
  -- model the typical usage of OO features...

  function  Init return Alert_Type is abstract;

  procedure No_Reply (A : in out Alert_Type);

end C393008_0;

--=======================================================================--

package body C393008_0 is

  procedure No_Reply (A : in out Alert_Type) is
    begin                              -- primitive operation, not abstract
      TCTouch.Touch('A');  ------------------------------------------------- A
      if A.Status = Handled then
        A.Reply  := False;
      end if;
    end No_Reply;

end C393008_0;

--=======================================================================--

  generic
                        -- pass in the Alert_Type object, including its 
                        -- operations
    type Data_Type is new C393008_0.Alert_Type with private; 
                        -- note that Alert_Type is abstract, so it may not be
                        -- used as an actual parameter
    with procedure Update     (P : in out Data_Type) is <>;  -- generic formal
    with function  Initialize return Data_Type is <>;        -- generic formal

  package C393008_1 is
       -- Utilities

    procedure Modify (Item : in out Data_Type);

  end C393008_1;
   -- Utilities

--=======================================================================--

  package body C393008_1 is
            -- Utilities

      procedure Modify (Item : in out Data_Type) is
        begin
          TCTouch.Touch('B');  --------------------------------------------- B
          Item := Initialize;
          Update (Item);
        end Modify;

  end C393008_1;

--=======================================================================--

  package C393008_2 is

    type Low_Alert_Type is new C393008_0.Alert_Type with record
      Serial : C393008_0.Serial_Number;
    end record;
  
    procedure Serialize (LA : in out Low_Alert_Type);
  
    -- inherit No_Reply

    procedure Handle (LA : in out Low_Alert_Type);

    function Init return Low_Alert_Type;
  end C393008_2;

  package body C393008_2 is
    procedure Serialize (LA : in out Low_Alert_Type) is
    begin                          -- new primitive operation
      TCTouch.Touch('C');  ------------------------------------------------- C
      C393008_0.Serial_Num := C393008_0.Serial_Num + 1;
      LA.Serial := C393008_0.Serial_Num;
    end Serialize;
  
  -- inherit No_Reply

    function Init return Low_Alert_Type is
      TA: Low_Alert_Type;
    begin
      TCTouch.Touch('D');  ------------------------------------------------- D
      Serialize( TA );
      TA.Status := C393008_0.No_Status;
      return TA;
    end Init;

    procedure Handle (LA : in out Low_Alert_Type) is    
    begin                          -- overrides abstract inherited Handle
      TCTouch.Touch('E');  ------------------------------------------------- E
      Serialize (LA);
      LA.Reply := False;
      LA.Status := C393008_0.Handled;
      No_Reply (LA);
    end Handle;

  end C393008_2;

  use C393008_2;
  
  package Alert_Utilities is new
    C393008_1 (Data_Type   => Low_Alert_Type,
               Update      => Handle,   -- Low_Alert's Handle
               Initialize  => Init);    -- inherited from Alert

  Item : Low_Alert_Type;

  use type C393008_0.Status_Enum;

begin

  Report.Test ("C393008", "Check that an extended type can be derived "&
                          "from an abstract type");

  Item := Init;
  if (Item.Status /= C393008_0.No_Status) or (Item.Serial /=1)  then
    Report.Failed ("Wrong initialization");
  end if;
  TCTouch.Validate("DC", "Initialization Call");

  Alert_Utilities.Modify (Item);
  if (Item.Status /= C393008_0.Handled) or (Item.Serial /= 3) then 
    Report.Failed ("Wrong results from Modify");
  end if;
  TCTouch.Validate("BDCECA", "Generic Instance Call");

  Report.Result;

end C393008;