Я начал проект на Delphi 2010, а затем перешел на XE, и теперь я пытаюсь перейти на XE2. После компиляции в XE2 (Update 4 Hotfix 1) модульные тесты начали сбой с AV. После некоторой отладки стало ясно, что следующий код некорректно скомпилирован:
program ForwardDeclaration;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
type
TEntityBase = class(TObject)
protected
FModel: Integer;
public
constructor Create(const AModel: Integer);
end;
TEntity<TKey> = class(TEntityBase)
end;
TMyEntity2 = class;
TMyEntity1 = class(TEntity<Integer>)
FData: Integer;
end;
TMyEntity2 = class(TMyEntity1)
end;
constructor TEntityBase.Create(const AModel: Integer);
begin
inherited Create;
FModel := AModel;
end;
var
MyEntity: TMyEntity1;
begin
try
Writeln(TEntityBase.ClassName, ': ', TEntityBase.InstanceSize, ' bytes');
Writeln(TMyEntity1.ClassName, ': ', TMyEntity1.InstanceSize, ' bytes');
MyEntity := TMyEntity1.Create(100);
Assert(MyEntity.FData = 0);
except
on E: Exception do Writeln(E.ClassName, ': ', E.Message);
end;
end.
Выходы программы:
TEntityBase: 12 bytes
TMyEntity1: 12 bytes <-- Must be 16 bytes!
EAssertionFailed: Assertion failure (ForwardDeclaration.dpr, line 41)
Можно ли решить проблему, настроив параметры компилятора?
Повторяется ли эта проблема у кого-то еще?
P.S. QC107110
Можно ли решить проблему, настроив параметры компилятора?
Нет, вы не можете исправить ошибку, настроив ее (очень конкретную) ошибку в компиляторе.
[Может кто-нибудь сказать мне] Повторяется ли эта проблема с кем-то еще?
Я могу воспроизвести код, но только в обновлении XE2 4.
Мне не удалось проверить его в XE3 (у вас нет этой версии). Он исправлен в XE4 (согласно комментариям).
Таким образом, единственный способ заставить код работать:
а. удалите ненужное форвардное объявление.
б. используйте другую версию Delphi.