Ошибка компилятора при использовании обобщений и прямого объявления в Delphi XE2

45

Я начал проект на Delphi 2010, а затем перешел на XE, и теперь я пытаюсь перейти на XE2. После компиляции в XE2 (Update 4 Hotfix 1) модульные тесты начали сбой с AV. После некоторой отладки стало ясно, что следующий код некорректно скомпилирован:

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.

Выходы программы:

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

Можно ли решить проблему, настроив параметры компилятора?

Повторяется ли эта проблема у кого-то еще?

P.S. QC107110

  • 0
    Отправьте это в QualityCentral. Кроме того, куда поступают предварительные декларации. Единственная такая декларация не используется.
  • 0
    Код максимально упрощен, так что ошибка компилятора была воспроизведена. В реальном проекте используются предварительные декларации. Если это проблемы не только у меня, то я пишу в КК.
Показать ещё 5 комментариев
Теги:
delphi-xe2

1 ответ

4
Лучший ответ

Можно ли решить проблему, настроив параметры компилятора?

Нет, вы не можете исправить ошибку, настроив ее (очень конкретную) ошибку в компиляторе.

[Может кто-нибудь сказать мне] Повторяется ли эта проблема с кем-то еще?

Я могу воспроизвести код, но только в обновлении XE2 4.

Мне не удалось проверить его в XE3 (у вас нет этой версии). Он исправлен в XE4 (согласно комментариям).

Таким образом, единственный способ заставить код работать:

а. удалите ненужное форвардное объявление.
б. используйте другую версию Delphi.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню