Rozpocząłem projekt na Delphi 2010, a następnie zmigrowałem do XE, a teraz próbuję przeprowadzić migrację do XE2. Po kompilacji w XE2 (Update 4 Hotfix 1) testy jednostkowe zaczęły się niepowodzeniem z AV. Po pewnym debugowania, stało się jasne, że poniższy kod nie został poprawnie skompilowany: wyjśćBłąd kompilatora przy użyciu generycznych i przekazywanie deklaracji w Delphi XE2
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.
Program:
TEntityBase: 12 bytes
TMyEntity1: 12 bytes <-- Must be 16 bytes!
EAssertionFailed: Assertion failure (ForwardDeclaration.dpr, line 41)
to możliwe, aby rozwiązać ten problem opcji strojenia kompilatora?
Czy ten problem powtarza się u kogoś innego?
P.S. QC107110
Prześlij do QualityCentral. Również, gdzie przychodzą do niego deklaracje forward. Jedyna taka deklaracja nie jest używana. –
Kod jest najbardziej uproszczony, więc błąd kompilatora został odtworzony. W prawdziwym zgłoszeniu przekazania projektu jest używany. Jeśli problem ten dotyczy nie tylko mnie, to piszę do QC. – Chaa
OK. Po zgłoszeniu błędu powinieneś go rozebrać jeszcze bardziej. Wygląda na to, że deklaracja przekazania nie jest istotna. Po prostu problem z kodowaniem za pomocą InstanceSize. Jeśli masz umowę o wsparcie, możesz otworzyć problem z pomocą techniczną, chociaż nawet wykonanie tego nie musi oznaczać, że otrzymasz odpowiedź. –