with Instrument;
use Instrument;


--------------------------
-- LOCAL REFERENCE 01 LEVEL 3
--------------------------

-- THIS TEST EVALUATES THE CODE EFFICIENCY OF REFERENCING A THIRD LEVEL
-- COMPONENT OF A LOCAL RECORD VARIABLE, I.E., A REFERENCE TO A RECORD
-- THAT IS DECLARED IMMEDIATELY WITHIN THE DECLARATIVE REGION IN WHICH
-- THE COMPONENT IS REFERENCED.

-- THE TEST VERSION INCLUDES THE COMPONENT REFERENCE TO BE EVALUATED BY
-- ASSIGNING A THIRD LEVEL COMPONENT OF A LOCAL RECORD, LOCAL_01, TO THE
-- GLOBAL VARIABLE.  PRIOR TO THIS ASSIGNMENT, CAMOUFLAGED ASSIGNMENTS
-- ARE MADE TO BOTH THE LOCAL RECORD AND THE GLOBAL VARIABLE. THE
-- GLOBAL VARIABLE IS USED IN A CONDITIONAL STATEMENT TO GUARD THE TEST
-- ASSIGNMENT FROM OPTIMIZATIONS.  BECAUSE OF THIS GUARD, THE LOCAL
-- RECORD COMPONENT MUST BE UPDATED WITH ITS INITIAL VALUE SINCE THE
-- CONDITIONAL STATEMENT REQUIRES DYNAMIC EVALUATION.  ADDITIONAL
-- CAMOUFLAGED ASSIGNMENTS ARE MADE TO MAINTAIN THE VALIDITY OF THE
-- CONDITIONAL STATEMENT AND TO PREVENT ELIMINATION OF THE OTHERWISE
-- UNREFERENCED LOCAL RECORD COMPONENT IN THE NOISE VERSION.

-- THE NOISE VERSION IS IDENTICAL TO THE TEST VERSION EXCEPT THAT THE
-- TEST REFERENCE TO THE COMPONENT OF THE LOCAL RECORD IS REMOVED SO
-- THAT THE CODE EFFICIENCY METRICS FOR THE LOCAL REFERENCE CAN BE
-- DERIVED AS A PART OF ASSIGNMENT.

procedure Lrr3a2 is
    package Dr_Cs is new Procs (Integer);
    use Dr_Cs;


    type Level_1 is
        record
            Item_1a : T;
            Item_1b : T;
        end record;

    type Level_2 is
        record
            Item_2a : T;
            Item_2b : Level_1;
        end record;

    type Level_3 is
        record

            Item_3a : T;
            Item_3b : Level_2;
        end record;

    Local_01 : Level_3;

begin
    Start ("LRR3A2", "Third-level Local Record var. Ref. (test)");
    for I in 1 .. 10000 loop

        Let (Global, Ident (Init));
        Let (Local_01.Item_3a, Ident (Init));
        Let (Local_01.Item_3b.Item_2a, Ident (Init));
        Let (Local_01.Item_3b.Item_2b.Item_1a, Ident (Init));
        Let (Local_01.Item_3b.Item_2b.Item_1b, Ident (Init));

        if Global = Init then
            Global := Local_01.Item_3b.Item_2b.Item_1a; -- COMMTD OUT IN NOISE
            Let (Local_01.Item_3a, Ident (Init));
        end if;

        Let (Global, Ident (Local_01.Item_3b.Item_2b.Item_1a));

    end loop;
    Stop;

end Lrr3a2;