2012-07-13 13 views
45

Comencé el proyecto en Delphi 2010, luego migré a XE y ahora trato de migrar a XE2. Después de compilar en XE2 (Actualización 4 Hotfix 1), las pruebas unitarias comenzaron a fallar con AV. Después de algún depuración, se hizo evidente que el siguiente código no está correctamente compilada: salidasError del compilador al usar genéricos y declaración de reenvío en 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. 

programa:

TEntityBase: 12 bytes 
TMyEntity1: 12 bytes <-- Must be 16 bytes! 
EAssertionFailed: Assertion failure (ForwardDeclaration.dpr, line 41) 

¿Es posible resolver el problema mediante las opciones de optimización del compilador?

Si este problema se repite en otra persona?

P.S. QC107110

+0

Envíelo a QualityCentral. Además, ¿dónde entran las declaraciones directas? La única declaración de este tipo no se usa. –

+0

El código es muy simplificado, por lo que se reprodujo el error del compilador. En un proyecto real se utilizan declaraciones futuras. Si esto no solo me afecta, entonces escribo a QC. – Chaa

+0

OK. Cuando envíe el error, debe desmantelarlo aún más. Parece que la declaración de avance no es relevante. Simplemente un problema de codegen con InstanceSize. Si tiene un contrato de soporte, puede abrir un problema de soporte, aunque incluso hacerlo no necesariamente significa que obtendrá una respuesta. –

Respuesta

4

¿Es posible resolver el problema mediante las opciones de optimización del compilador?

Sin, no se puede corregir el error mediante la sintonización, es un error (muy específico) en el compilador.

[¿Alguien me puede decir] Si este problema se repite en otra persona?

puedo reproducir el código, pero sólo en la actualización XE2 4.

no he podido comprobarlo en XE3 (no tienen esa versión). Se corrigió en XE4 (según los comentarios).

Así que la única manera de tener el código de trabajo es:

a. eliminar la declaración adelante innecesaria.
b. usa una versión diferente de Delphi.

Cuestiones relacionadas