2012-07-13 3 views
45

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

+0

Invia questo a QualityCentral. Inoltre, dove arrivano le dichiarazioni avanzate. L'unica dichiarazione di questo tipo non viene utilizzata. –

+0

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

+0

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. –

risposta

4

E 'possibile risolvere il problema da opzioni di ottimizzazione del compilatore?

No, non è possibile correggere l'errore da tuning, si tratta di una (molto specifico) bug nel compilatore.

[Qualcuno può dirmi] Se questo problema si ripete su qualcun altro?

posso riprodurre il codice, ma solo in aggiornamento XE2 4.

non ero in grado di controllare in XE3 (non hanno quella versione). È stato risolto in XE4 (come da commenti).

Quindi l'unico modo per avere il codice per lavoro è quello di:

a. rimuovere la dichiarazione anticipata non necessaria.
b. usa una versione diversa di Delphi.