понедельник, декабря 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, промежуточные не проверял, но думаю и там воспроизведется.

4 комментария:

Александр Алексеев комментирует...
Этот комментарий был удален автором.
Александр Алексеев комментирует...

QC Report #101641.

Kazantsev Alexey комментирует...

Я уже отрепортил http://qc.embarcadero.com/wc/qcmain.aspx?d=101545. Нужно было мне сразу об этом написать.

Александр Алексеев комментирует...

Я искал на QC перед отправкой своего отчёта, но поиск ничего не нашёл. Видимо, первый отчёт не проиндексировался.