Ho avviato il progetto su Delphi 2010, quindi sono migrato a XE e ora provo a migrare a XE2. Dopo la compilazione in XE2 (aggiornamento 4 hotfix 1), i test delle unità hanno avuto esito negativo con AV. Dopo un po 'di debug, è diventato chiaro che il seguente codice non viene compilato correttamente: usciteErrore del compilatore quando si utilizzano i generici e la dichiarazione di inoltro in 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.
programma:
TEntityBase: 12 bytes
TMyEntity1: 12 bytes <-- Must be 16 bytes!
EAssertionFailed: Assertion failure (ForwardDeclaration.dpr, line 41)
è possibile risolvere il problema da opzioni di ottimizzazione del compilatore?
Se questo problema si ripete su qualcun altro?
P.S. QC107110
Invia questo a QualityCentral. Inoltre, dove arrivano le dichiarazioni avanzate. L'unica dichiarazione di questo tipo non viene utilizzata. –
Il codice è più semplice, in modo che l'errore del compilatore sia stato riprodotto. In un progetto reale vengono utilizzate dichiarazioni di inoltro. Se questo non riguarda solo me, allora scrivo a QC. – Chaa
OK. Quando invii il bug, devi sminuirlo ulteriormente. Sembra che la dichiarazione anticipata non sia pertinente. Semplicemente un problema con codegen con InstanceSize. Se hai un contratto di supporto potresti aprire un problema di supporto anche se anche farlo non significa necessariamente che riceverai una risposta. –