blob: 0cfce32bc9578e5c728954521c28b842b2e22523 [file] [log] [blame]
-- C731001.A
--
-- Grant of Unlimited Rights
--
-- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687 and
-- F08630-91-C-0015, 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 WHATSOVER, 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.
--*
--
-- OBJECTIVE
-- Check that inherited operations can be overridden, even when they are
-- inherited in a body.
-- The test cases here are inspired by the AARM examples given in
-- the discussion of AARM-7.3.1(7.a-7.v).
-- This discussion was confirmed by AI95-00035.
--
-- TEST DESCRIPTION
-- See AARM-7.3.1.
--
-- CHANGE HISTORY:
-- 29 JUN 1999 RAD Initial Version
-- 23 SEP 1999 RLB Improved comments, renamed, issued.
-- 20 AUG 2001 RLB Corrected 'verbose' flag.
--
--!
with Report; use Report; pragma Elaborate_All(Report);
package C731001_1 is
pragma Elaborate_Body;
private
procedure Check_String(X, Y: String);
function Check_String(X, Y: String) return String;
-- This one is a function, so we can call it in package specs.
end C731001_1;
package body C731001_1 is
Verbose: Boolean := False;
procedure Check_String(X, Y: String) is
begin
if Verbose then
Comment("""" & X & """ = """ & Y & """?");
end if;
if X /= Y then
Failed("""" & X & """ should be """ & Y & """");
end if;
end Check_String;
function Check_String(X, Y: String) return String is
begin
Check_String(X, Y);
return X;
end Check_String;
end C731001_1;
private package C731001_1.Parent is
procedure Call_Main;
type Root is tagged null record;
subtype Renames_Root is Root;
subtype Root_Class is Renames_Root'Class;
function Make return Root;
function Op1(X: Root) return String;
function Call_Op2(X: Root'Class) return String;
private
function Op2(X: Root) return String;
end C731001_1.Parent;
procedure C731001_1.Parent.Main;
with C731001_1.Parent.Main;
package body C731001_1.Parent is
procedure Call_Main is
begin
Main;
end Call_Main;
function Make return Root is
Result: Root;
begin
return Result;
end Make;
function Op1(X: Root) return String is
begin
return "Parent.Op1 body";
end Op1;
function Op2(X: Root) return String is
begin
return "Parent.Op2 body";
end Op2;
function Call_Op2(X: Root'Class) return String is
begin
return Op2(X);
end Call_Op2;
begin
Check_String(Op1(Root'(Make)), "Parent.Op1 body");
Check_String(Op1(Root_Class(Root'(Make))), "Parent.Op1 body");
Check_String(Op2(Root'(Make)), "Parent.Op2 body");
Check_String(Op2(Root_Class(Root'(Make))), "Parent.Op2 body");
end C731001_1.Parent;
with C731001_1.Parent; use C731001_1.Parent;
private package C731001_1.Unrelated is
type T2 is new Root with null record;
subtype T2_Class is T2'Class;
function Make return T2;
function Op2(X: T2) return String;
end C731001_1.Unrelated;
with C731001_1.Parent; use C731001_1.Parent;
pragma Elaborate(C731001_1.Parent);
package body C731001_1.Unrelated is
function Make return T2 is
Result: T2;
begin
return Result;
end Make;
function Op2(X: T2) return String is
begin
return "Unrelated.Op2 body";
end Op2;
begin
Check_String(Op1(T2'(Make)), "Parent.Op1 body");
Check_String(Op1(T2_Class(T2'(Make))), "Parent.Op1 body");
Check_String(Op1(Root_Class(T2'(Make))), "Parent.Op1 body");
Check_String(Op2(T2'(Make)), "Unrelated.Op2 body");
Check_String(Op2(T2_Class(T2'(Make))), "Unrelated.Op2 body");
Check_String(Call_Op2(T2'(Make)), "Parent.Op2 body");
Check_String(Call_Op2(T2_Class(T2'(Make))), "Parent.Op2 body");
Check_String(Call_Op2(Root_Class(T2'(Make))), "Parent.Op2 body");
end C731001_1.Unrelated;
package C731001_1.Parent.Child is
pragma Elaborate_Body;
type T3 is new Root with null record;
subtype T3_Class is T3'Class;
function Make return T3;
T3_Obj: T3;
T3_Class_Obj: T3_Class := T3_Obj;
T3_Root_Class_Obj: Root_Class := T3_Obj;
X3: constant String :=
Check_String(Op1(T3_Obj), "Parent.Op1 body") &
Check_String(Op1(T3_Class_Obj), "Parent.Op1 body") &
Check_String(Op1(T3_Root_Class_Obj), "Parent.Op1 body") &
Check_String(Call_Op2(T3_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T3_Class_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T3_Root_Class_Obj), "Parent.Op2 body");
package Nested is
type T4 is new Root with null record;
subtype T4_Class is T4'Class;
function Make return T4;
T4_Obj: T4;
T4_Class_Obj: T4_Class := T4_Obj;
T4_Root_Class_Obj: Root_Class := T4_Obj;
X4: constant String :=
Check_String(Op1(T4_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Class_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Root_Class_Obj), "Parent.Op1 body") &
Check_String(Call_Op2(T4_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Class_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Root_Class_Obj), "Parent.Op2 body");
private
XX4: constant String :=
Check_String(Op1(T4_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Class_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Root_Class_Obj), "Parent.Op1 body") &
Check_String(Call_Op2(T4_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Class_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Root_Class_Obj), "Parent.Op2 body");
end Nested;
use Nested;
XXX4: constant String :=
Check_String(Op1(T4_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Class_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Root_Class_Obj), "Parent.Op1 body") &
Check_String(Call_Op2(T4_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Class_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Root_Class_Obj), "Parent.Op2 body");
private
XX3: constant String :=
Check_String(Op1(T3_Obj), "Parent.Op1 body") &
Check_String(Op1(T3_Class_Obj), "Parent.Op1 body") &
Check_String(Op1(T3_Root_Class_Obj), "Parent.Op1 body") &
Check_String(Call_Op2(T3_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T3_Class_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T3_Root_Class_Obj), "Parent.Op2 body") &
Check_String(Op2(T3_Obj), "Parent.Op2 body") &
Check_String(Op2(T3_Class_Obj), "Parent.Op2 body") &
Check_String(Op2(T3_Root_Class_Obj), "Parent.Op2 body");
XXXX4: constant String :=
Check_String(Op1(T4_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Class_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Root_Class_Obj), "Parent.Op1 body") &
Check_String(Call_Op2(T4_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Class_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Root_Class_Obj), "Parent.Op2 body") &
Check_String(Op2(T4_Root_Class_Obj), "Parent.Op2 body");
end C731001_1.Parent.Child;
with C731001_1.Unrelated; use C731001_1.Unrelated;
pragma Elaborate(C731001_1.Unrelated);
package body C731001_1.Parent.Child is
XXX3: constant String :=
Check_String(Op1(T3_Obj), "Parent.Op1 body") &
Check_String(Op1(T3_Class_Obj), "Parent.Op1 body") &
Check_String(Op1(T3_Root_Class_Obj), "Parent.Op1 body") &
Check_String(Call_Op2(T3_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T3_Class_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T3_Root_Class_Obj), "Parent.Op2 body") &
Check_String(Op2(T3_Obj), "Parent.Op2 body") &
Check_String(Op2(T3_Class_Obj), "Parent.Op2 body") &
Check_String(Op2(T3_Root_Class_Obj), "Parent.Op2 body");
XXXXX4: constant String :=
Check_String(Op1(T4_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Class_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Root_Class_Obj), "Parent.Op1 body") &
Check_String(Call_Op2(T4_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Class_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Root_Class_Obj), "Parent.Op2 body") &
Check_String(Op2(T4_Root_Class_Obj), "Parent.Op2 body");
function Make return T3 is
Result: T3;
begin
return Result;
end Make;
package body Nested is
function Make return T4 is
Result: T4;
begin
return Result;
end Make;
XXXXXX4: constant String :=
Check_String(Op1(T4_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Class_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Root_Class_Obj), "Parent.Op1 body") &
Check_String(Call_Op2(T4_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Class_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Root_Class_Obj), "Parent.Op2 body") &
Check_String(Op2(T4_Obj), "Parent.Op2 body") &
Check_String(Op2(T4_Class_Obj), "Parent.Op2 body") &
Check_String(Op2(T4_Root_Class_Obj), "Parent.Op2 body");
end Nested;
type T5 is new T2 with null record;
subtype T5_Class is T5'Class;
function Make return T5;
function Make return T5 is
Result: T5;
begin
return Result;
end Make;
XXXXXXX4: constant String :=
Check_String(Op1(T4_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Class_Obj), "Parent.Op1 body") &
Check_String(Op1(T4_Root_Class_Obj), "Parent.Op1 body") &
Check_String(Call_Op2(T4_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Class_Obj), "Parent.Op2 body") &
Check_String(Call_Op2(T4_Root_Class_Obj), "Parent.Op2 body") &
Check_String(Op2(T4_Root_Class_Obj), "Parent.Op2 body");
end C731001_1.Parent.Child;
procedure C731001_1.Main;
with C731001_1.Parent;
procedure C731001_1.Main is
begin
C731001_1.Parent.Call_Main;
end C731001_1.Main;
with C731001_1.Parent.Child;
use C731001_1.Parent;
use C731001_1.Parent.Child;
use C731001_1.Parent.Child.Nested;
with C731001_1.Unrelated; use C731001_1.Unrelated;
procedure C731001_1.Parent.Main is
Root_Obj: Root := Make;
Root_Class_Obj: Root_Class := Root'(Make);
T2_Obj: T2 := Make;
T2_Class_Obj: T2_Class := T2_Obj;
T2_Root_Class_Obj: Root_Class := T2_Class_Obj;
T3_Obj: T3 := Make;
T3_Class_Obj: T3_Class := T3_Obj;
T3_Root_Class_Obj: Root_Class := T3_Obj;
T4_Obj: T4 := Make;
T4_Class_Obj: T4_Class := T4_Obj;
T4_Root_Class_Obj: Root_Class := T4_Obj;
begin
Test("C731001_1", "Check that inherited operations can be overridden, even"
& " when they are inherited in a body");
Check_String(Op1(Root_Obj), "Parent.Op1 body");
Check_String(Op1(Root_Class_Obj), "Parent.Op1 body");
Check_String(Call_Op2(Root_Obj), "Parent.Op2 body");
Check_String(Call_Op2(Root_Class_Obj), "Parent.Op2 body");
Check_String(Op1(T2_Obj), "Parent.Op1 body");
Check_String(Op1(T2_Class_Obj), "Parent.Op1 body");
Check_String(Op1(T2_Root_Class_Obj), "Parent.Op1 body");
Check_String(Op2(T2_Obj), "Unrelated.Op2 body");
Check_String(Op2(T2_Class_Obj), "Unrelated.Op2 body");
Check_String(Call_Op2(T2_Obj), "Parent.Op2 body");
Check_String(Call_Op2(T2_Class_Obj), "Parent.Op2 body");
Check_String(Call_Op2(T2_Root_Class_Obj), "Parent.Op2 body");
Check_String(Op1(T3_Obj), "Parent.Op1 body");
Check_String(Op1(T3_Class_Obj), "Parent.Op1 body");
Check_String(Op1(T3_Root_Class_Obj), "Parent.Op1 body");
Check_String(Call_Op2(T3_Obj), "Parent.Op2 body");
Check_String(Call_Op2(T3_Class_Obj), "Parent.Op2 body");
Check_String(Call_Op2(T3_Root_Class_Obj), "Parent.Op2 body");
Check_String(Op1(T4_Obj), "Parent.Op1 body");
Check_String(Op1(T4_Class_Obj), "Parent.Op1 body");
Check_String(Op1(T4_Root_Class_Obj), "Parent.Op1 body");
Check_String(Call_Op2(T4_Obj), "Parent.Op2 body");
Check_String(Call_Op2(T4_Class_Obj), "Parent.Op2 body");
Check_String(Call_Op2(T4_Root_Class_Obj), "Parent.Op2 body");
Result;
end C731001_1.Parent.Main;
with C731001_1.Main;
procedure C731001 is
begin
C731001_1.Main;
end C731001;