view gcc/testsuite/ada/acats/tests/c3/c380003.a @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
line wrap: on
line source

-- C380003.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 ACAA 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 per-object expressions are evaluated as specified for
--    protected components.  (Defect Report 8652/0002, as reflected in
--    Technical Corrigendum 1, RM95 3.6(22/1) and 3.8(18/1)).
--
-- CHANGE HISTORY:
--     9 FEB 2001   PHL   Initial version.
--    29 JUN 2002   RLB   Readied for release.
--
--!
with Report;
use Report;
procedure C380003 is

    subtype Sm is Integer range 1 .. 10;

    type Rec (D1, D2 : Sm) is
        record
            null;
        end record;

begin
    Test ("C380003",
          "Check compatibility of discriminant expressions" &
             " when the constraint depends on discriminants, " &
             "and the discriminants have defaults - protected components");

    declare
        protected type Cons (D3 : Integer := Ident_Int (11)) is
            function C1_D1 return Integer;
            function C1_D2 return Integer;
        private
            C1 : Rec (D3, 1);
        end Cons;
        protected body Cons is
            function C1_D1 return Integer is
            begin
                return C1.D1;
            end C1_D1;
            function C1_D2 return Integer is
            begin
                return C1.D2;
            end C1_D2;
        end Cons;

        function Is_Ok
                    (C : Cons; D3 : Integer; C1_D1 : Integer; C1_D2 : Integer)
                    return Boolean is
        begin
            return C.D3 = D3 and C.C1_D1 = C1_D1 and C.C1_D2 = C1_D2;
        end Is_Ok;

    begin
        begin
            declare
                X : Cons;
            begin
                Failed ("Discriminant check not performed - 1");
                if not Is_Ok (X, 1, 1, 1) then
                    Comment ("Shouldn't get here");
                end if;
            end;
        exception
            when Constraint_Error =>
                null;
            when others =>
                Failed ("Unexpected exception - 1");
        end;

        begin
            declare
                type Acc_Cons is access Cons;
                X : Acc_Cons;
            begin
                X := new Cons;
                Failed ("Discriminant check not performed - 2");
                begin
                    if not Is_Ok (X.all, 1, 1, 1) then
                        Comment ("Irrelevant");
                    end if;
                end;
            exception
                when Constraint_Error =>
                    null;
                when others =>
                    Failed ("Unexpected exception raised - 2");
            end;
        exception
            when others =>
                Failed ("Constraint checked too soon - 2");
        end;

        begin
            declare
                subtype Scons is Cons;
            begin
                declare
                    X : Scons;
                begin
                    Failed ("Discriminant check not performed - 3");
                    if not Is_Ok (X, 1, 1, 1) then
                        Comment ("Irrelevant");
                    end if;
                end;
            exception
                when Constraint_Error =>
                    null;
                when others =>
                    Failed ("Unexpected exception raised - 3");
            end;
        exception
            when others =>
                Failed ("Constraint checked too soon - 3");
        end;

        begin
            declare
                type Arr is array (1 .. 5) of Cons;
            begin
                declare
                    X : Arr;
                begin
                    Failed ("Discriminant check not performed - 4");
                    for I in Arr'Range loop
                        if not Is_Ok (X (I), 1, 1, 1) then
                            Comment ("Irrelevant");
                        end if;
                    end loop;
                end;
            exception
                when Constraint_Error =>
                    null;
                when others =>
                    Failed ("Unexpected exception raised - 4");
            end;
        exception
            when others =>
                Failed ("Constraint checked too soon - 4");
        end;

        begin
            declare
                type Nrec is
                    record
                        C1 : Cons;
                    end record;
            begin
                declare
                    X : Nrec;
                begin
                    Failed ("Discriminant check not performed - 5");
                    if not Is_Ok (X.C1, 1, 1, 1) then
                        Comment ("Irrelevant");
                    end if;
                end;
            exception
                when Constraint_Error =>
                    null;
                when others =>
                    Failed ("Unexpected exception raised - 5");
            end;
        exception
            when others =>
                Failed ("Constraint checked too soon - 5");
        end;

        begin
            declare
                type Drec is new Cons;
            begin
                declare
                    X : Drec;
                begin
                    Failed ("Discriminant check not performed - 6");
                    if not Is_Ok (Cons (X), 1, 1, 1) then
                        Comment ("Irrelevant");
                    end if;
                end;
            exception
                when Constraint_Error =>
                    null;
                when others =>
                    Failed ("Unexpected exception raised - 6");
            end;
        exception
            when others =>
                Failed ("Constraint checked too soon - 6");
        end;

    end;

    Result;

exception
    when others =>
        Failed ("Constraint check done too early");
        Result;
end C380003;