понедельник, декабря 05, 2011

Знатные грабельки компилятора

Сегодня налетел на такое:

program nested_exception_class;

{$APPTYPE CONSOLE}

{$R *.res}

uses
SysUtils;

Type

EUnitException = Class(Exception);

//
TMyRec = Record

Type

Exception = Class(EUnitException);

EOtherException = Class(Exception);

End;
//

begin

// ожидается: TMyRec.Exception, в действительности: Exception
WriteLn(TMyRec.EOtherException.ClassParent.ClassName);

// утверждение должно быть истинным, но нарушается
Assert(TMyRec.EOtherException.ClassParent = TMyRec.Exception);

end.


Компилятор выбрал неправильного родителя для моего класса (EOtherException), хотя в редакторе, если кликнуть (Ctrl+Click) по, родителю (Class(Exception)) переход происходит к “правильному” классу (TMyRec.Exception). Баг воспроизводится в Delphi 2006, Delphi XE2 Update 2, промежуточные не проверял, но думаю и там воспроизведется.