OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [ada/] [acats/] [tests/] [c3/] [c392014.a] - Rev 720

Compare with Previous | Blame | View Log

-- C392014.A
--
--                             Grant of Unlimited Rights
--
--     The Ada Conformity Assessment Authority (ACAA) holds unlimited
--     rights in the software and documentation contained herein. Unlimited
--     rights are the same as those granted by the U.S. Government for older
--     parts of the Ada Conformity Assessment Test Suite, and are defined
--     in DFAR 252.227-7013(a)(19). By making this public release, the ACAA
--     intends to confer upon all recipients unlimited rights equal to those
--     held by the ACAA. 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.
--*
--
-- OBJECTIVE:
--    Check that objects designated by X'Access (where X is of a class-wide
--    type) and new T'Class'(...) are dynamically tagged and can be used in
--    dispatching calls.  (Defect Report 8652/0010).
--
-- CHANGE HISTORY:
--    18 JAN 2001   PHL   Initial version
--    15 MAR 2001   RLB   Readied for release.
--    03 JUN 2004   RLB   Removed constraint for S0, as the subtype has
--                        unknown discriminants.

--!
package C392014_0 is

    type T (D : Integer) is abstract tagged private;

    procedure P (X : access T) is abstract;
    function Create (X : Integer) return T'Class;

    Result : Natural := 0;

private
    type T (D : Integer) is abstract tagged null record;
end C392014_0;

with C392014_0;
package C392014_1 is
    type T is new C392014_0.T with private;
    function Create (X : Integer) return T'Class;
private
    type T is new C392014_0.T with
        record
            C1 : Integer;
        end record;
    procedure P (X : access T);
end C392014_1;

package C392014_1.Child is
    type T is new C392014_1.T with private;
    procedure P (X : access T);
    function Create (X : Integer) return T'Class;
private
    type T is new C392014_1.T with
        record
            C1C : Integer;
        end record;
end C392014_1.Child;

with Report;
use Report;
with C392014_1.Child;
package body C392014_1 is

    procedure P (X : access T) is
    begin
        C392014_0.Result := C392014_0.Result + X.D + X.C1;
    end P;

    function Create (X : Integer) return T'Class is
    begin
        case X mod Ident_Int (2) is
            when 0 =>
                return C392014_1.Child.Create (X / Ident_Int (2));
            when 1 =>
                declare
                    Y : T (D => (X / Ident_Int (2)) mod Ident_Int (20));
                begin
                    Y.C1 := X / Ident_Int (40);
                    return T'Class (Y);
                end;
            when others =>
                null;
        end case;
    end Create;

end C392014_1;

with C392014_0;
with C392014_1;
package C392014_2 is
    type T is new C392014_0.T with private;
    function Create (X : Integer) return T'Class;
private
    type T is new C392014_1.T with
        record
            C2 : Integer;
        end record;
    procedure P (X : access T);
end C392014_2;

with Report;
use Report;
with C392014_1.Child;
with C392014_2;
package body C392014_0 is

    function Create (X : Integer) return T'Class is
    begin
        case X mod 3 is
            when 0 =>
                return C392014_1.Create (X / Ident_Int (3));
            when 1 =>
                return C392014_1.Child.Create (X / Ident_Int (3));
            when 2 =>
                return C392014_2.Create (X / Ident_Int (3));
            when others =>
                null;
        end case;
    end Create;

end C392014_0;

with Report;
use Report;
with C392014_0;
package body C392014_1.Child is

    procedure P (X : access T) is
    begin
        C392014_0.Result := C392014_0.Result + X.D + X.C1 + X.C1C;
    end P;

    function Create (X : Integer) return T'Class is
        Y : T (D => X mod Ident_Int (20));
    begin
        Y.C1 := (X / Ident_Int (20)) mod Ident_Int (20);
        Y.C1C := X / Ident_Int (400);
        return T'Class (Y);
    end Create;

end C392014_1.Child;

with Report;
use Report;
package body C392014_2 is

    procedure P (X : access T) is
    begin
        C392014_0.Result := C392014_0.Result + X.D + X.C2;
    end P;

    function Create (X : Integer) return T'Class is
        Y : T (D => X mod Ident_Int (20));
    begin
        Y.C2 := X / Ident_Int (600);
        return T'Class (Y);
    end Create;

end C392014_2;

with Report;
use Report;
with C392014_0;
with C392014_1.Child;
with C392014_2;
procedure C392014 is

    subtype S0 is C392014_0.T'Class;
    subtype S1 is C392014_1.T'Class;

    X0 : aliased C392014_0.T'Class := C392014_0.Create (Ident_Int (5218));
    X1 : aliased C392014_1.T'Class := C392014_1.Create (Ident_Int (8253));

    Y0 : aliased S0 := C392014_0.Create (Ident_Int (2693));
    Y1 : aliased S1 := C392014_1.Create (Ident_Int (5622));

    procedure TC_Check (Subtest : String; Expected : Integer) is
    begin
        if C392014_0.Result = Expected then
            Comment ("Subtest " & Subtest & " Passed");
        else
            Failed ("Subtest " & Subtest & " Failed");
        end if;
        C392014_0.Result := Ident_Int (0);
    end TC_Check;

begin
    Test ("C392014",
          "Check that objects designated by X'Access " &
             "(where X is of a class-wide type) and New T'Class'(...) " &
             "are dynamically tagged and can be used in dispatching " &
             "calls");

    C392014_0.P (X0'Access);
    TC_Check ("X0'Access", Ident_Int (29));
    C392014_0.P (new C392014_0.T'Class'(C392014_0.Create (Ident_Int (12850))));
    TC_Check ("New C392014_0.T'Class", Ident_Int (27));
    C392014_1.P (X1'Access);
    TC_Check ("X1'Access", Ident_Int (212));
    C392014_1.P (new C392014_1.T'Class'(C392014_1.Create (Ident_Int (2031))));
    TC_Check ("New C392014_1.T'Class", Ident_Int (65));
    C392014_0.P (Y0'Access);
    TC_Check ("Y0'Access", Ident_Int (18));
    C392014_0.P (new S0'(C392014_0.Create (Ident_Int (6893))));
    TC_Check ("New S0", Ident_Int (20));
    C392014_1.P (Y1'Access);
    TC_Check ("Y1'Access", Ident_Int (18));
    C392014_1.P (new S1'(C392014_1.Create (Ident_Int (1861))));
    TC_Check ("New S1", Ident_Int (56));

    Result;
end C392014;

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.