with Instrument;
use Instrument;

------------------------
-- Parameter Association 01
------------------------

-- This test evaluates the code efficiency of a call to a procedure
-- that has a single formal in out parameter of the formal generic type.

-- The procedure Param_Assoc is called in the test version using the
-- global variable as the actual parameter.  The global variable is
-- referenced inside the procedure through the formal parameter to ensure
-- that the required parameter passing is performed.  In the noise
-- version, the procedure Param_Assoc is parameterless and references
-- the global variable directly so that there is no parameter passing
-- overhead incurred.  Both the test and noise versions of the procedure
-- perform the same camouflaged assignment.

-- The test does not preclude the opportunity for the compiler to optimize
-- each version of the procedure call since this would not compromise
-- the code efficiency metrics.

procedure Fpaaa1 is
    package Pc_Cs is new Procs (Integer);
    use Pc_Cs;

    P_Test : Ref_T := new T'(Init);

    procedure Param_Assoc
--            (Formal : in out Ref_T      -- included in test version
                  is
    begin

        --    Let(Formal.all, Ident(Formal.all)); -- included in test version
        Let (Global, Ident (Global));         -- included in noise version

    end Param_Assoc;

begin
    Start ("FPAAA1",
           "Formal in/out Param. Assoc. w/1 param., Access type (Control)");
    for I in 1 .. 10000 loop

        Let (Global, Ident (Init));
        --  Param_Assoc(P_Test);                  -- included in test version
        Param_Assoc;                          -- included in noise version

    end loop;
    Stop;

end Fpaaa1;