-- CD10002.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 operational items are allowed in some contexts where
--    representation items are not:
--
--       1 - Check that the name of an incompletely defined type can be used
--           when specifying an operational item. (RM95/TC1 7.3(5)).
--
--       2 - Check that operational items can be specified for a descendant of
--           a generic formal untagged type. (RM95/TC1 13.1(10)).
--
--       3 - Check that operational items can be specified for a derived
--           untagged type even if the parent type is a by-reference type or
--           has user-defined primitive subprograms. (RM95/TC1 13.1(11/1)).
--
--    (Defect Report 8652/0009, as reflected in Technical Corrigendum 1).
--
-- CHANGE HISTORY:
--    19 JAN 2001   PHL   Initial version.
--     3 DEC 2001   RLB   Reformatted for ACATS.
--     3 OCT 2002   RLB   Corrected incorrect type derivations.
--
--!
with Ada.Streams;
use Ada.Streams;
package CD10002_0 is

    type Kinds is (Read, Write, Input, Output);
    type Counts is array (Kinds) of Natural;

    generic
        type T is private;
    package Nonlimited_Stream_Ops is

        procedure Write (Stream : access Root_Stream_Type'Class; Item : T);
        function Input (Stream : access Root_Stream_Type'Class) return T;
        procedure Read (Stream : access Root_Stream_Type'Class; Item : out T);
        procedure Output (Stream : access Root_Stream_Type'Class; Item : T);

        function Get_Counts return Counts;

    end Nonlimited_Stream_Ops;

    generic
        type T (<>) is limited private; -- Should be self-initializing.
        C : in out T;
    package Limited_Stream_Ops is

        procedure Write (Stream : access Root_Stream_Type'Class; Item : T);
        function Input (Stream : access Root_Stream_Type'Class) return T;
        procedure Read (Stream : access Root_Stream_Type'Class; Item : out T);
        procedure Output (Stream : access Root_Stream_Type'Class; Item : T);

        function Get_Counts return Counts;

    end Limited_Stream_Ops;

end CD10002_0;


package body CD10002_0 is

    package body Nonlimited_Stream_Ops is
        Cnts : Counts := (others => 0);
        X : T; -- Initialized by Write/Output.

        procedure Write (Stream : access Root_Stream_Type'Class; Item : T) is
        begin
            X := Item;
            Cnts (Write) := Cnts (Write) + 1;
        end Write;

        function Input (Stream : access Root_Stream_Type'Class) return T is
        begin
            Cnts (Input) := Cnts (Input) + 1;
            return X;
        end Input;

        procedure Read (Stream : access Root_Stream_Type'Class; Item : out T) is
        begin
            Cnts (Read) := Cnts (Read) + 1;
            Item := X;
        end Read;

        procedure Output (Stream : access Root_Stream_Type'Class; Item : T) is
        begin
            X := Item;
            Cnts (Output) := Cnts (Output) + 1;
        end Output;

        function Get_Counts return Counts is
        begin
            return Cnts;
        end Get_Counts;

    end Nonlimited_Stream_Ops;

    package body Limited_Stream_Ops is
        Cnts : Counts := (others => 0);

        procedure Write (Stream : access Root_Stream_Type'Class; Item : T) is
        begin
            Cnts (Write) := Cnts (Write) + 1;
        end Write;

        function Input (Stream : access Root_Stream_Type'Class) return T is
        begin
            Cnts (Input) := Cnts (Input) + 1;
            return C;
        end Input;

        procedure Read (Stream : access Root_Stream_Type'Class; Item : out T) is
        begin
            Cnts (Read) := Cnts (Read) + 1;
        end Read;

        procedure Output (Stream : access Root_Stream_Type'Class; Item : T) is
        begin
            Cnts (Output) := Cnts (Output) + 1;
        end Output;

        function Get_Counts return Counts is
        begin
            return Cnts;
        end Get_Counts;

    end Limited_Stream_Ops;

end CD10002_0;


with Ada.Streams;
use Ada.Streams;
package CD10002_1 is

    type Dummy_Stream is new Root_Stream_Type with null record;
    procedure Read (Stream : in out Dummy_Stream;
                    Item : out Stream_Element_Array;
                    Last : out Stream_Element_Offset);
    procedure Write (Stream : in out Dummy_Stream;
                     Item : Stream_Element_Array);

end CD10002_1;


with Report;
use Report;
package body CD10002_1 is

    procedure Read (Stream : in out Dummy_Stream;
                    Item : out Stream_Element_Array;
                    Last : out Stream_Element_Offset) is
    begin
        Failed ("Unexpected call to the Read operation of Dummy_Stream");
    end Read;

    procedure Write (Stream : in out Dummy_Stream;
                     Item : Stream_Element_Array) is
    begin
        Failed ("Unexpected call to the Write operation of Dummy_Stream");
    end Write;

end CD10002_1;


with Ada.Streams;
use Ada.Streams;
with CD10002_0;
package CD10002_Deriv is

    -- Parent has user-defined subprograms.

    type T1 is new Boolean;
    function Is_Odd (X : Integer) return T1;

    type T2 is
        record
            F : Float;
        end record;
    procedure Print (X : T2);

    type T3 is array (Boolean) of Duration;
    function "+" (L, R : T3) return T3;

    -- Parent is by-reference.  No need to check the case where the parent
    -- is tagged, because the defect report only deals with untagged types.

    task type T4 is
    end T4;

    protected type T5 is
    end T5;

    type T6 (D : access Integer := new Integer'(2)) is limited null record;

    type T7 is array (Character) of T6;

    package P is
        type T8 is limited private;
    private
        type T8 is new T5;
    end P;

    type Nt1 is new T1;
    type Nt2 is new T2;
    type Nt3 is new T3;
    type Nt4 is new T4;
    type Nt5 is new T5;
    type Nt6 is new T6;
    type Nt7 is new T7;
    type Nt8 is new P.T8;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt1'Base);
    function Input (Stream : access Root_Stream_Type'Class) return Nt1'Base;
    procedure Read (Stream : access Root_Stream_Type'Class;
                    Item : out Nt1'Base);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt1'Base);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt2);
    function Input (Stream : access Root_Stream_Type'Class) return Nt2;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt2);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt2);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt3);
    function Input (Stream : access Root_Stream_Type'Class) return Nt3;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt3);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt3);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt4);
    function Input (Stream : access Root_Stream_Type'Class) return Nt4;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt4);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt4);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt5);
    function Input (Stream : access Root_Stream_Type'Class) return Nt5;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt5);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt5);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt6);
    function Input (Stream : access Root_Stream_Type'Class) return Nt6;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt6);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt6);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt7);
    function Input (Stream : access Root_Stream_Type'Class) return Nt7;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt7);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt7);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt8);
    function Input (Stream : access Root_Stream_Type'Class) return Nt8;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt8);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt8);

    for Nt1'Write use Write;
    for Nt1'Read use Read;
    for Nt1'Output use Output;
    for Nt1'Input use Input;

    for Nt2'Write use Write;
    for Nt2'Read use Read;
    for Nt2'Output use Output;
    for Nt2'Input use Input;

    for Nt3'Write use Write;
    for Nt3'Read use Read;
    for Nt3'Output use Output;
    for Nt3'Input use Input;

    for Nt4'Write use Write;
    for Nt4'Read use Read;
    for Nt4'Output use Output;
    for Nt4'Input use Input;

    for Nt5'Write use Write;
    for Nt5'Read use Read;
    for Nt5'Output use Output;
    for Nt5'Input use Input;

    for Nt6'Write use Write;
    for Nt6'Read use Read;
    for Nt6'Output use Output;
    for Nt6'Input use Input;

    for Nt7'Write use Write;
    for Nt7'Read use Read;
    for Nt7'Output use Output;
    for Nt7'Input use Input;

    for Nt8'Write use Write;
    for Nt8'Read use Read;
    for Nt8'Output use Output;
    for Nt8'Input use Input;

    -- All these variables are self-initializing.
    C4 : Nt4;
    C5 : Nt5;
    C6 : Nt6;
    C7 : Nt7;
    C8 : Nt8;

    package Nt1_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt1'Base);
    package Nt2_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt2);
    package Nt3_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt3);
    package Nt4_Ops is new CD10002_0.Limited_Stream_Ops (Nt4, C4);
    package Nt5_Ops is new CD10002_0.Limited_Stream_Ops (Nt5, C5);
    package Nt6_Ops is new CD10002_0.Limited_Stream_Ops (Nt6, C6);
    package Nt7_Ops is new CD10002_0.Limited_Stream_Ops (Nt7, C7);
    package Nt8_Ops is new CD10002_0.Limited_Stream_Ops (Nt8, C8);

end CD10002_Deriv;


package body CD10002_Deriv is

    function Is_Odd (X : Integer) return T1 is
    begin
        return True;
    end Is_Odd;
    procedure Print (X : T2) is
    begin
        null;
    end Print;
    function "+" (L, R : T3) return T3 is
    begin
        return (False => L (False) + R (True), True => L (True) + R (False));
    end "+";
    task body T4 is
    begin
        null;
    end T4;
    protected body T5 is
    end T5;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt1'Base)
       renames Nt1_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt1'Base
       renames Nt1_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt1'Base)
       renames Nt1_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt1'Base)
       renames Nt1_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt2)
       renames Nt2_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt2
       renames Nt2_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt2)
       renames Nt2_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt2)
       renames Nt2_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt3)
       renames Nt3_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt3
       renames Nt3_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt3)
       renames Nt3_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt3)
       renames Nt3_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt4)
       renames Nt4_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt4
       renames Nt4_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt4)
       renames Nt4_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt4)
       renames Nt4_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt5)
       renames Nt5_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt5
       renames Nt5_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt5)
       renames Nt5_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt5)
       renames Nt5_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt6)
       renames Nt6_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt6
       renames Nt6_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt6)
       renames Nt6_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt6)
       renames Nt6_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt7)
       renames Nt7_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt7
       renames Nt7_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt7)
       renames Nt7_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt7)
       renames Nt7_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt8)
       renames Nt8_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt8
       renames Nt8_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt8)
       renames Nt8_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt8)
       renames Nt8_Ops.Output;

end CD10002_Deriv;


with Ada.Streams;
use Ada.Streams;
with CD10002_0;
generic
    type T1 is (<>);
    type T2 is range <>;
    type T3 is mod <>;
    type T4 is digits <>;
    type T5 is delta <>;
    type T6 is delta <> digits <>;
    type T7 is access T3;
    type T8 is new Boolean;
    type T9 is private;
    type T10 (<>) is limited private; -- Should be self-initializing.
    C10 : in out T10;
    type T11 is array (T1) of T2;
package CD10002_Gen is

    -- Direct descendants.
    type Nt1 is new T1;
    type Nt2 is new T2;
    type Nt3 is new T3;
    type Nt4 is new T4;
    type Nt5 is new T5;
    type Nt6 is new T6;
    type Nt7 is new T7;
    type Nt8 is new T8;
    type Nt9 is new T9;
    type Nt10 is new T10;
    type Nt11 is new T11;

    -- Indirect descendants (only pick two, a limited one and a non-limited
    -- one).
    type Nt12 is new Nt10;
    type Nt13 is new Nt11;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt1'Base);
    function Input (Stream : access Root_Stream_Type'Class) return Nt1'Base;
    procedure Read (Stream : access Root_Stream_Type'Class;
                    Item : out Nt1'Base);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt1'Base);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt2'Base);
    function Input (Stream : access Root_Stream_Type'Class) return Nt2'Base;
    procedure Read (Stream : access Root_Stream_Type'Class;
                    Item : out Nt2'Base);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt2'Base);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt3'Base);
    function Input (Stream : access Root_Stream_Type'Class) return Nt3'Base;
    procedure Read (Stream : access Root_Stream_Type'Class;
                    Item : out Nt3'Base);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt3'Base);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt4'Base);
    function Input (Stream : access Root_Stream_Type'Class) return Nt4'Base;
    procedure Read (Stream : access Root_Stream_Type'Class;
                    Item : out Nt4'Base);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt4'Base);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt5'Base);
    function Input (Stream : access Root_Stream_Type'Class) return Nt5'Base;
    procedure Read (Stream : access Root_Stream_Type'Class;
                    Item : out Nt5'Base);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt5'Base);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt6'Base);
    function Input (Stream : access Root_Stream_Type'Class) return Nt6'Base;
    procedure Read (Stream : access Root_Stream_Type'Class;
                    Item : out Nt6'Base);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt6'Base);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt7);
    function Input (Stream : access Root_Stream_Type'Class) return Nt7;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt7);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt7);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt8'Base);
    function Input (Stream : access Root_Stream_Type'Class) return Nt8'Base;
    procedure Read (Stream : access Root_Stream_Type'Class;
                    Item : out Nt8'Base);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt8'Base);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt9);
    function Input (Stream : access Root_Stream_Type'Class) return Nt9;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt9);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt9);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt10);
    function Input (Stream : access Root_Stream_Type'Class) return Nt10;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt10);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt10);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt11);
    function Input (Stream : access Root_Stream_Type'Class) return Nt11;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt11);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt11);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt12);
    function Input (Stream : access Root_Stream_Type'Class) return Nt12;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt12);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt12);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt13);
    function Input (Stream : access Root_Stream_Type'Class) return Nt13;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt13);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt13);

    for Nt1'Write use Write;
    for Nt1'Read use Read;
    for Nt1'Output use Output;
    for Nt1'Input use Input;

    for Nt2'Write use Write;
    for Nt2'Read use Read;
    for Nt2'Output use Output;
    for Nt2'Input use Input;

    for Nt3'Write use Write;
    for Nt3'Read use Read;
    for Nt3'Output use Output;
    for Nt3'Input use Input;

    for Nt4'Write use Write;
    for Nt4'Read use Read;
    for Nt4'Output use Output;
    for Nt4'Input use Input;

    for Nt5'Write use Write;
    for Nt5'Read use Read;
    for Nt5'Output use Output;
    for Nt5'Input use Input;

    for Nt6'Write use Write;
    for Nt6'Read use Read;
    for Nt6'Output use Output;
    for Nt6'Input use Input;

    for Nt7'Write use Write;
    for Nt7'Read use Read;
    for Nt7'Output use Output;
    for Nt7'Input use Input;

    for Nt8'Write use Write;
    for Nt8'Read use Read;
    for Nt8'Output use Output;
    for Nt8'Input use Input;

    for Nt9'Write use Write;
    for Nt9'Read use Read;
    for Nt9'Output use Output;
    for Nt9'Input use Input;

    for Nt10'Write use Write;
    for Nt10'Read use Read;
    for Nt10'Output use Output;
    for Nt10'Input use Input;

    for Nt11'Write use Write;
    for Nt11'Read use Read;
    for Nt11'Output use Output;
    for Nt11'Input use Input;

    for Nt12'Write use Write;
    for Nt12'Read use Read;
    for Nt12'Output use Output;
    for Nt12'Input use Input;

    for Nt13'Write use Write;
    for Nt13'Read use Read;
    for Nt13'Output use Output;
    for Nt13'Input use Input;

    type Null_Record is null record;

    package Nt1_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt1'Base);
    package Nt2_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt2'Base);
    package Nt3_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt3'Base);
    package Nt4_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt4'Base);
    package Nt5_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt5'Base);
    package Nt6_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt6'Base);
    package Nt7_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt7);
    package Nt8_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt8'Base);
    package Nt9_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt9);
    package Nt11_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt11);
    package Nt13_Ops is new CD10002_0.Nonlimited_Stream_Ops (Nt13);

    function Get_Nt10_Counts return CD10002_0.Counts;
    function Get_Nt12_Counts return CD10002_0.Counts;

end CD10002_Gen;


package body CD10002_Gen is

    use CD10002_0;

    Nt10_Cnts : Counts := (others => 0);
    Nt12_Cnts : Counts := (others => 0);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt1'Base)
       renames Nt1_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt1'Base
       renames Nt1_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt1'Base)
       renames Nt1_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt1'Base)
       renames Nt1_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt2'Base)
       renames Nt2_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt2'Base
       renames Nt2_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt2'Base)
       renames Nt2_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt2'Base)
       renames Nt2_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt3'Base)
       renames Nt3_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt3'Base
       renames Nt3_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt3'Base)
       renames Nt3_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt3'Base)
       renames Nt3_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt4'Base)
       renames Nt4_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt4'Base
       renames Nt4_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt4'Base)
       renames Nt4_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt4'Base)
       renames Nt4_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt5'Base)
       renames Nt5_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt5'Base
       renames Nt5_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt5'Base)
       renames Nt5_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt5'Base)
       renames Nt5_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt6'Base)
       renames Nt6_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt6'Base
       renames Nt6_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt6'Base)
       renames Nt6_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt6'Base)
       renames Nt6_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt7)
       renames Nt7_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt7
       renames Nt7_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt7)
       renames Nt7_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt7)
       renames Nt7_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt8'Base)
       renames Nt8_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt8'Base
       renames Nt8_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt8'Base)
       renames Nt8_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt8'Base)
       renames Nt8_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt9)
       renames Nt9_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt9
       renames Nt9_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt9)
       renames Nt9_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt9)
       renames Nt9_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt10) is
    begin
        Nt10_Cnts (Write) := Nt10_Cnts (Write) + 1;
    end Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt10 is
    begin
        Nt10_Cnts (Input) := Nt10_Cnts (Input) + 1;
        return Nt10 (C10);
    end Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt10) is
    begin
        Nt10_Cnts (Read) := Nt10_Cnts (Read) + 1;
    end Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt10) is
    begin
        Nt10_Cnts (Output) := Nt10_Cnts (Output) + 1;
    end Output;
    function Get_Nt10_Counts return CD10002_0.Counts is
    begin
        return Nt10_Cnts;
    end Get_Nt10_Counts;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt11)
       renames Nt11_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt11
       renames Nt11_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt11)
       renames Nt11_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt11)
       renames Nt11_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt12) is
    begin
        Nt12_Cnts (Write) := Nt12_Cnts (Write) + 1;
    end Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt12 is
    begin
        Nt12_Cnts (Input) := Nt12_Cnts (Input) + 1;
        return Nt12 (C10);
    end Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt12) is
    begin
        Nt12_Cnts (Read) := Nt12_Cnts (Read) + 1;
    end Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt12) is
    begin
        Nt12_Cnts (Output) := Nt12_Cnts (Output) + 1;
    end Output;
    function Get_Nt12_Counts return CD10002_0.Counts is
    begin
        return Nt12_Cnts;
    end Get_Nt12_Counts;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : Nt13)
       renames Nt13_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return Nt13
       renames Nt13_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out Nt13)
       renames Nt13_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : Nt13)
       renames Nt13_Ops.Output;

end CD10002_Gen;


with Ada.Streams;
use Ada.Streams;
with CD10002_0;
package CD10002_Priv is

    External_Tag_1 : constant String := "Isaac Newton";
    External_Tag_2 : constant String := "Albert Einstein";

    type T1 is tagged private;
    type T2 is tagged
        record
            C : T1;
        end record;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : T1);
    function Input (Stream : access Root_Stream_Type'Class) return T1;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out T1);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : T1);

    procedure Write (Stream : access Root_Stream_Type'Class; Item : T2);
    function Input (Stream : access Root_Stream_Type'Class) return T2;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out T2);
    procedure Output (Stream : access Root_Stream_Type'Class; Item : T2);

    for T1'Write use Write;
    for T1'Input use Input;

    for T2'Read use Read;
    for T2'Output use Output;
    for T2'External_Tag use External_Tag_2;

    function Get_T1_Counts return CD10002_0.Counts;
    function Get_T2_Counts return CD10002_0.Counts;

private

    for T1'Read use Read;
    for T1'Output use Output;
    for T1'External_Tag use External_Tag_1;

    for T2'Write use Write;
    for T2'Input use Input;

    type T1 is tagged null record;

    package T1_Ops is new CD10002_0.Nonlimited_Stream_Ops (T1);
    package T2_Ops is new CD10002_0.Nonlimited_Stream_Ops (T2);

end CD10002_Priv;


package body CD10002_Priv is
    procedure Write (Stream : access Root_Stream_Type'Class; Item : T1)
       renames T1_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return T1
       renames T1_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out T1)
       renames T1_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : T1)
       renames T1_Ops.Output;

    procedure Write (Stream : access Root_Stream_Type'Class; Item : T2)
       renames T2_Ops.Write;
    function Input (Stream : access Root_Stream_Type'Class) return T2
       renames T2_Ops.Input;
    procedure Read (Stream : access Root_Stream_Type'Class; Item : out T2)
       renames T2_Ops.Read;
    procedure Output (Stream : access Root_Stream_Type'Class; Item : T2)
       renames T2_Ops.Output;

    function Get_T1_Counts return CD10002_0.Counts renames T1_Ops.Get_Counts;
    function Get_T2_Counts return CD10002_0.Counts renames T2_Ops.Get_Counts;
end CD10002_Priv;


with Ada.Streams;
use Ada.Streams;
with Report;
use Report;
with System;
with CD10002_0;
with CD10002_1;
with CD10002_Deriv;
with CD10002_Gen;
with CD10002_Priv;
procedure CD10002 is

    package Deriv renames CD10002_Deriv;
    generic package Gen renames CD10002_Gen;
    package Priv renames CD10002_Priv;

    type Stream_Ops is (Read, Write, Input, Output);
    type Counts is array (Stream_Ops) of Natural;

    S : aliased CD10002_1.Dummy_Stream;

begin
    Test ("CD10002",
          "Check that operational items are allowed in some contexts " &
             "where representation items are not");

    Test_Priv:
        declare
            X1 : Priv.T1;
            X2 : Priv.T2;
            use CD10002_0;
        begin
            Comment
               ("Check that the name of an incompletely defined type can be " &
                "used when specifying an operational item");

            -- Partial view of a private type.
            Priv.T1'Write (S'Access, X1);
            Priv.T1'Read (S'Access, X1);
            Priv.T1'Output (S'Access, X1);
            X1 := Priv.T1'Input (S'Access);

            if Priv.Get_T1_Counts /= (1, 1, 1, 1) then
                Failed ("Incorrect calls to the stream attributes for Priv.T1");
            elsif Priv.T1'External_Tag /= Priv.External_Tag_1 then
                Failed ("Incorrect external tag for Priv.T1");
            end if;

            -- Incompletely defined but not private.
            Priv.T2'Write (S'Access, X2);
            Priv.T2'Read (S'Access, X2);
            Priv.T2'Output (S'Access, X2);
            X2 := Priv.T2'Input (S'Access);

            if Priv.Get_T2_Counts /= (1, 1, 1, 1) then
                Failed ("Incorrect calls to the stream attributes for Priv.T2");
            elsif Priv.T2'External_Tag /= Priv.External_Tag_2 then
                Failed ("Incorrect external tag for Priv.T2");
            end if;

        end Test_Priv;

    Test_Gen:
        declare

            type Modular is mod System.Max_Binary_Modulus;
            type Decimal is delta 1.0 digits 1;
            type Access_Modular is access Modular;
            type R9 is null record;
            type R10 (D : access Integer) is limited null record;
            type Arr is array (Character) of Integer;

            C10 : R10 (new Integer'(19));

            package Inst is new Gen (T1 => Character,
                                     T2 => Integer,
                                     T3 => Modular,
                                     T4 => Float,
                                     T5 => Duration,
                                     T6 => Decimal,
                                     T7 => Access_Modular,
                                     T8 => Boolean,
                                     T9 => R9,
                                     T10 => R10,
                                     C10 => C10,
                                     T11 => Arr);

            X1 : Inst.Nt1 := 'a';
            X2 : Inst.Nt2 := 0;
            X3 : Inst.Nt3 := 0;
            X4 : Inst.Nt4 := 0.0;
            X5 : Inst.Nt5 := 0.0;
            X6 : Inst.Nt6 := 0.0;
            X7 : Inst.Nt7 := null;
            X8 : Inst.Nt8 := Inst.False;
            X9 : Inst.Nt9 := (null record);
            X10 : Inst.Nt10 (D => new Integer'(5));
            Y10 : Integer;
            X11 : Inst.Nt11 := (others => 0);
            X12 : Inst.Nt12 (D => new Integer'(7));
            Y12 : Integer;
            X13 : Inst.Nt13 := (others => 0);
            use CD10002_0;
        begin
            Comment ("Check that operational items can be specified for a " &
                     "descendant of a generic formal untagged type");

            Inst.Nt1'Write (S'Access, X1);
            Inst.Nt1'Read (S'Access, X1);
            Inst.Nt1'Output (S'Access, X1);
            X1 := Inst.Nt1'Input (S'Access);

            if Inst.Nt1_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Inst.Nt1");
            end if;

            Inst.Nt2'Write (S'Access, X2);
            Inst.Nt2'Read (S'Access, X2);
            Inst.Nt2'Output (S'Access, X2);
            X2 := Inst.Nt2'Input (S'Access);

            if Inst.Nt2_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Inst.Nt2");
            end if;

            Inst.Nt3'Write (S'Access, X3);
            Inst.Nt3'Read (S'Access, X3);
            Inst.Nt3'Output (S'Access, X3);
            X3 := Inst.Nt3'Input (S'Access);

            if Inst.Nt3_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Inst.Nt3");
            end if;

            Inst.Nt4'Write (S'Access, X4);
            Inst.Nt4'Read (S'Access, X4);
            Inst.Nt4'Output (S'Access, X4);
            X4 := Inst.Nt4'Input (S'Access);

            if Inst.Nt4_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Inst.Nt4");
            end if;

            Inst.Nt5'Write (S'Access, X5);
            Inst.Nt5'Read (S'Access, X5);
            Inst.Nt5'Output (S'Access, X5);
            X5 := Inst.Nt5'Input (S'Access);

            if Inst.Nt5_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Inst.Nt5");
            end if;

            Inst.Nt6'Write (S'Access, X6);
            Inst.Nt6'Read (S'Access, X6);
            Inst.Nt6'Output (S'Access, X6);
            X6 := Inst.Nt6'Input (S'Access);

            if Inst.Nt6_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Inst.Nt6");
            end if;

            Inst.Nt7'Write (S'Access, X7);
            Inst.Nt7'Read (S'Access, X7);
            Inst.Nt7'Output (S'Access, X7);
            X7 := Inst.Nt7'Input (S'Access);

            if Inst.Nt7_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Inst.Nt7");
            end if;

            Inst.Nt8'Write (S'Access, X8);
            Inst.Nt8'Read (S'Access, X8);
            Inst.Nt8'Output (S'Access, X8);
            X8 := Inst.Nt8'Input (S'Access);

            if Inst.Nt8_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Inst.Nt8");
            end if;

            Inst.Nt9'Write (S'Access, X9);
            Inst.Nt9'Read (S'Access, X9);
            Inst.Nt9'Output (S'Access, X9);
            X9 := Inst.Nt9'Input (S'Access);

            if Inst.Nt9_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Inst.Nt9");
            end if;

            Inst.Nt10'Write (S'Access, X10);
            Inst.Nt10'Read (S'Access, X10);
            Inst.Nt10'Output (S'Access, X10);
            Y10 := Inst.Nt10'Input (S'Access).D.all;

            if Inst.Get_Nt10_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Inst.Nt10");
            end if;

            Inst.Nt11'Write (S'Access, X11);
            Inst.Nt11'Read (S'Access, X11);
            Inst.Nt11'Output (S'Access, X11);
            X11 := Inst.Nt11'Input (S'Access);

            if Inst.Nt11_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Inst.Nt11");
            end if;

            Inst.Nt12'Write (S'Access, X12);
            Inst.Nt12'Read (S'Access, X12);
            Inst.Nt12'Output (S'Access, X12);
            Y12 := Inst.Nt12'Input (S'Access).D.all;

            if Inst.Get_Nt12_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Inst.Nt12");
            end if;

            Inst.Nt13'Write (S'Access, X13);
            Inst.Nt13'Read (S'Access, X13);
            Inst.Nt13'Output (S'Access, X13);
            X13 := Inst.Nt13'Input (S'Access);

            if Inst.Nt13_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Inst.Nt13");
            end if;
        end Test_Gen;

    Test_Deriv:
        declare
            X1 : Deriv.Nt1 := Deriv.False;
            X2 : Deriv.Nt2 := (others => 0.0);
            X3 : Deriv.Nt3 := (others => 0.0);
            X4 : Deriv.Nt4;
            Y4 : Boolean;
            X5 : Deriv.Nt5;
            Y5 : System.Address;
            X6 : Deriv.Nt6;
            Y6 : Integer;
            X7 : Deriv.Nt7;
            Y7 : Integer;
            X8 : Deriv.Nt8;
            Y8 : Integer;
            use CD10002_0;
        begin
            Comment ("Check that operational items can be specified for a " &
                     "derived untagged type even if the parent type is a " &
                     "by-reference type, or has user-defined primitive " &
                     "subprograms");

            Deriv.Nt1'Write (S'Access, X1);
            Deriv.Nt1'Read (S'Access, X1);
            Deriv.Nt1'Output (S'Access, X1);
            X1 := Deriv.Nt1'Input (S'Access);

            if Deriv.Nt1_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Deriv.Nt1");
            end if;

            Deriv.Nt2'Write (S'Access, X2);
            Deriv.Nt2'Read (S'Access, X2);
            Deriv.Nt2'Output (S'Access, X2);
            X2 := Deriv.Nt2'Input (S'Access);

            if Deriv.Nt2_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Deriv.Nt2");
            end if;

            Deriv.Nt3'Write (S'Access, X3);
            Deriv.Nt3'Read (S'Access, X3);
            Deriv.Nt3'Output (S'Access, X3);
            X3 := Deriv.Nt3'Input (S'Access);

            if Deriv.Nt3_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Deriv.Nt3");
            end if;

            Deriv.Nt4'Write (S'Access, X4);
            Deriv.Nt4'Read (S'Access, X4);
            Deriv.Nt4'Output (S'Access, X4);
            Y4 := Deriv.Nt4'Input (S'Access)'Terminated;

            if Deriv.Nt4_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Deriv.Nt4");
            end if;

            Deriv.Nt5'Write (S'Access, X5);
            Deriv.Nt5'Read (S'Access, X5);
            Deriv.Nt5'Output (S'Access, X5);
            Y5 := Deriv.Nt5'Input (S'Access)'Address;

            if Deriv.Nt5_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Deriv.Nt5");
            end if;

            Deriv.Nt6'Write (S'Access, X6);
            Deriv.Nt6'Read (S'Access, X6);
            Deriv.Nt6'Output (S'Access, X6);
            Y6 := Deriv.Nt6'Input (S'Access).D.all;

            if Deriv.Nt6_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Deriv.Nt6");
            end if;

            Deriv.Nt7'Write (S'Access, X7);
            Deriv.Nt7'Read (S'Access, X7);
            Deriv.Nt7'Output (S'Access, X7);
            Y7 := Deriv.Nt7'Input (S'Access) ('a').D.all;

            if Deriv.Nt7_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Deriv.Nt7");
            end if;

            Deriv.Nt8'Write (S'Access, X8);
            Deriv.Nt8'Read (S'Access, X8);
            Deriv.Nt8'Output (S'Access, X8);
            Y8 := Deriv.Nt8'Input (S'Access)'Size;

            if Deriv.Nt8_Ops.Get_Counts /= (1, 1, 1, 1) then
                Failed
                   ("Incorrect calls to the stream attributes for Deriv.Nt8");
            end if;
        end Test_Deriv;

    Result;
end CD10002;


