{$MODE OBJFPC}
program test;

type
   TBaseClass = class
      function PrintSelf(): TBaseClass; inline; // has to be inline for the bug to manifest
   end;
   
   TSubClass = class(TBaseClass)
   end;

function TBaseClass.PrintSelf(): TBaseClass; inline;
begin
   Writeln(PtrUInt(Self));
   Result := nil;
   Writeln(PtrUInt(Self)); // prints 0!
   if not assigned(self) then
     halt(1);
end;

procedure NoOp(var Dummy: TBaseClass);
begin
end;


var
   Instance, Variable: TBaseClass;
   res: longint;
begin
   Instance := TSubClass.Create();
   Variable := nil;

   NoOp(Variable); // this call is important for the bug to manifest
   Variable := Instance;
   // object being invoked has to be cast to a different type for the bug to manifest
   // return value has to be assigned to the variable being used as "self"
   Variable := TSubClass(Variable).PrintSelf();

   Instance.Free();
end.