2012-07-13 6 views
45

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

+0

Prześlij do QualityCentral. Również, gdzie przychodzą do niego deklaracje forward. Jedyna taka deklaracja nie jest używana. –

+0

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

+0

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

Odpowiedz

4

Czy to możliwe, aby rozwiązać ten problem opcji strojenia kompilatora?

nr, nie można naprawić błąd poprzez strojenie, to (bardzo specyficzne) Błąd w kompilatora.

[Czy ktoś może mi powiedzieć] Czy problem powtarza się u kogoś innego?

mogę odtworzyć kodu, ale tylko w aktualizacji XE2 4.

I nie był w stanie sprawdzić w XE3 (nie masz tej wersji). Naprawiono w XE4 (zgodnie z komentarzami).

Więc jedynym sposobem, aby mieć kod do pracy jest:

a. usunąć niepotrzebne oświadczenie terminowe.
b. użyj innej wersji Delphi.

Powiązane problemy