On 2016-12-30 10:45, Ondrej Pokorny wrote:

var
  O: TMyClass1;
begin
  O := TMyClass1.Create;
  TMyClass2(O).Free; // << 219-runtime error if compiled with -CR
end.

If I compile it with "-CR", I get a 219-runtime error when casting O
to TMyClass2. Is this wanted/documented? I see that {$OBJECTCHECKS
OFF} fixes it.

Yes, this is by design. The above code is invalid and relies on implementation details to work. E.g. with a JVM or CIL backend, the code would be rejected by the bytecode verifier too.

Why I ask: this hack is used in the LCL to access protected methods -
i.e. the LCL doesn't work correctly with -CR.

Class crackers are an unsupported hack. In case you access fields, it can also cause other problems: http://wiki.freepascal.org/FPC_New_Features_3.0#Class_field_reordering . In the future, more such situations may arise.

The compiler is supposed to be able to rely on the fact that the type hierarchy you declare is in fact the real type hierarchy, and not just a collection of statements that you use like a macro-assembler with the expectation of ending up with a particular memory layout.


Jonas
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to