45 votes

Bogue du compilateur lors de l'utilisation des génériques et de la déclaration de transfert dans Delphi XE2

J'ai commencé un projet sur Delphi 2010, ensuite migré vers XE et maintenant, j'essaie de migrer vers XE2. Après la compilation dans XE2 (mise à Jour 4 Correctif 1), les tests unitaires ont commencé à échouer avec AV. Après un peu de débogage, il est devenu clair que le code suivant n'est pas correctement compilé:

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.

Programme des sorties:

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

Est-il possible de résoudre le problème en réglant les options du compilateur?

Si ce problème se répète à quelqu'un d'autre?

P. S. QC107110

4voto

Johan Points 34755

Est-il possible de résoudre le problème en réglant les options du compilateur?

Non, vous ne pouvez pas corriger l'erreur en tuning, c'est un (très spécifique) bug dans le compilateur.

[Quelqu'un peut me dire] Si ce problème se répète à quelqu'un d'autre?

Je peux reproduire le code, mais seulement dans XE2 mise à jour 4.

Je n'étais pas en mesure de le vérifier dans XE3 (n'ont pas cette version). Il est fixé dans XE4 (selon les commentaires).

Donc le seul moyen d'avoir le code de travail est de:

un. supprimer les inutiles avant de déclaration.
b. utiliser une autre version de Delphi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X