tw8150f.pp 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. { %fail }
  2. { %norun }
  3. program WithForClassTypes;
  4. {$IFDEF FPC}
  5. {$mode delphi}
  6. {$ENDIF}
  7. type
  8. TMyObject = class
  9. x: Integer;
  10. class procedure Foo; virtual;
  11. procedure Bar; virtual;
  12. end;
  13. TMyObject2 = class(TMyObject)
  14. class procedure Foo; override;
  15. procedure Bar; override;
  16. end;
  17. TMyClass = class of TMyObject;
  18. { TMyObject }
  19. procedure TMyObject.Bar;
  20. begin
  21. WriteLn('Bar ', Integer(Pointer(Self)),' ', x);
  22. end;
  23. class procedure TMyObject.Foo;
  24. begin
  25. WriteLn('Foo');
  26. end;
  27. { TMyObject2 }
  28. procedure TMyObject2.Bar;
  29. begin
  30. WriteLn('2Bar ', Integer(Pointer(Self)),' ', x);
  31. end;
  32. class procedure TMyObject2.Foo;
  33. begin
  34. WriteLn('2Foo');
  35. end;
  36. var
  37. MyClass : TMyClass = TMyObject2;
  38. begin
  39. with MyClass do begin
  40. Foo; // should work
  41. with Create do try // should work
  42. x := 3; // should work
  43. Bar; // should work
  44. finally
  45. Free; // should work
  46. end;
  47. Foo; // should work
  48. // x := 1; // should not be allowed
  49. Bar; // should not be allowed
  50. // Free; // should not be allowed
  51. end;
  52. end.