UNIT testunitdcls;

   INTERFACE

      PROCEDURE p;

      VAR
         a: longint;

      TYPE
         ptr    = ^integer;

      FUNCTION GardenVariety(i: integer; j: longint; k: ptr): integer;

      TYPE
         t = longint;

         Class1 = SUBCLASS OF nil
                     Class1Id: Integer;
                     Class2Id, Class3Id: Integer;
                     FUNCTION class1.create: Class1;
                     PROCEDURE Proc1; abstract;
                     PROCEDURE class1.Proc2; abstract;
                     FUNCTION class1.FunC1(i: Integer): Class1;
                  END;

      CONST
         c1 = sizeof(t);

      PROCEDURE q;

      TYPE
         Class2 = SUBCLASS OF Class1
                     Field1, Field2: Integer;
                     Field3: Integer;
                     Field4: Class1;
                     FUNCTION create: Class2;
                     PROCEDURE Proc1; Override;         {override of class1 proc}
                     PROCEDURE class2.Proc2; Override;
                     PROCEDURE Proc3(i: integer);
                     PROCEDURE Proc4;
                     FUNCTION class2.FunC2(i: integer): Class1;
                  END;

      VAR
         b: longint;

   IMPLEMENTATION

      VAR
         c, d: longint;

      PROCEDURE q;

         BEGIN
         END;

      PROCEDURE p;

         BEGIN
            a := 1;
            b := 2;
            c := 3;
            d := 4;
         END;

      PROCEDURE p1;

         BEGIN
         END;

      VAR
         v1: longint;

      FUNCTION GardenVariety(i: integer; j: longint; k: ptr): integer;
         BEGIN END;

      TYPE
         t1 = longint;

      METHODS OF Class1;

         FUNCTION class1.create: Class1;
            BEGIN {Create}
            END; {Create}
         (*
         PROCEDURE Proc1;
            BEGIN {Proc1}
            END; {proc1}
          *)
         FUNCTION class1.FunC1(i: Integer): Class1;
            BEGIN
            END;

         BEGIN
            a := 1;
         END;

      CONST
         c2 = 1;

      PROCEDURE p2;

         PROCEDURE p3;

            VAR
               v2: t1;

            TYPE
               t2 = char;

            BEGIN
            END;

         TYPE
            t3 = t1;

         VAR
            v: longint;

         BEGIN
         END;

      VAR
         v3: longint;

      METHODS OF Class2

         FUNCTION create: Class2;

            var
               c1: class1;
               c2: class2;
               i: integer;
               p: ptr;
               b: boolean;

            BEGIN {Create}
               self := c2;
               p := thisclass;
               i := GardenVariety(1, 2, thisclass);
               b := inclass(c1, class1);
               b := inclass(c2, class2);
               b := inclass(class1.func1(1), class2);
            END; {Create}

         PROCEDURE {class2 override} class2.Proc1;
            BEGIN {Proc1 override}
            END; {Proc1}

         PROCEDURE class2.Proc2;

            VAR
               c1: class1;
               c2: class2;

            BEGIN {Proc2}
               c1 := class1(c2);
               WITH class1(c2) do
                  class1id := 1;
               with c1 do
                  class1id := 1;
            END; {Proc2}

         PROCEDURE Proc3;

            Var
               c1: class1;
               c2: class2;

            BEGIN {Proc3}
               Class1.Proc1;
               Class2.Proc1;
               Class2.Proc2;
               c1 := Class1.Create;
               c2 := Class2.Create;
               c1.proc1;
               c2.proc1;
               c2.proc2;
               c2.proc3(1);
               c2 := class2(c1);
            END; {Proc3}

         PROCEDURE class2.Proc4;
            BEGIN {Proc4}
            END; {Proc4}

         FUNCTION class2.FunC2(i: integer): Class1;
            BEGIN
               FunC2 := self.field4.FunC1(self.field1);
            END;
      END;

END.

