Delphi programming blog
Источник: http://teran.karelia.pro/articles/item_4480.html
 

Очередной DCC Internal error

Опубликовано 22.06.2011 г. 16:23

А вы часто получаете внутренние ошибки компилятора?

Обычно подобные ошибки вызваны тем, что вы действительно что-то написали некорректно, и немного повозившись можно найти в чем же причина, и исправить ее. Вчера коллега при разработке дочернего класса столкнулся с ошибкой, которую решить так и не удалось. Тест достаточно простой:
  1. Создаем новый проект, например, консольный
  2. Добавляем в проект два новых модуля
  3. Секцию интерфейса первого юнита расширяем следующими типами данных:
    uses generics.collections;
    
    type
        TItemCollection = TObjectList<TObject>;
    
        TBaseItem = class(TObject)
            items : TItemCollection;
        end;
    Т.е некоторая коллекция, и базовый класс с указателем на экземпляр такой коллекции.
  4. Во секцию uses второго модуля подключаем первый.
  5. В интерфейсной части второго модуля описываем дочерний класс:
    type
        TItem<T> = class(TBaseItem)
            procedure test(); 
        end;
    
  6. В реализации метода Test() мы создаем экземпляр коллекции:
    procedure TItem<T>.Test();
    begin
        items := TItemCollection.Create();
    end;
Все на этом тест закончен. Пробуем скомпилировать (Delphi 2010):
[DCC Fatal Error] Unit2.pas(23): F2084 Internal Error: URW1111
Каковы причины возникновения ошибки видимо понятны только самим разработчикам Delphi, но что-то подсказывает что связано это с использованием обобщений. Можно провести несколько манипуляций и ошибка исчезает. Например:
  1. Поместить описания этих двух классов в один модуль - все компилируется
  2. Если используется не generic список, а просто объект, то все работает (TItemsCollection = TObject)
  3. Если член класса items поместить в дочерний класс, ну или вообще убрать, то снова все хорошо.
Так что, скажем так, способов решить данную проблему в Delphi 2010 я не нашел. Кто использует Delphi XE, у вас компилируется? (: зы: embarcadero ведь не балует нас исправленными версиями компилятора, кроме апдейтов, которые резво выходят по нескольку штук после релиза новой версии? или я чего то не знаю?
Метки:  error 

Комментарии

Oleg
23.06.2011 в 10:05
В Delphi XE компилируется без проблем
ter
28.06.2011 в 10:08
вот даже не знаю переходить ли на ХЕ (:
Алексей Тимохин
04.03.2012 в 09:07
Я в основном в Delphi 6 работаю, чуть меньше в 2010. С ошибками (Internal Error) в IDE сталкиваюсь с незавидной регулярностью. А вот с ошибками в DCC всего пару раз.
ter
04.03.2012 в 12:22
плохо когда такие ошибки реально практической работе мешают =/
fd00ch
01.12.2012 в 23:16
фиксим:
TItemCollection = class(TObjectList);

готово :)
Николай Зверев
27.11.2013 в 20:43
Сегодня получил F2084 Internal Error: URW1111
Причём не на дженериках. А просто добавил метод-функцию в класс, причем в секции реализации не указал тип возвращаемого значения (т.е. описал как процедуру).
При компиляции получил сабж в совсем другом модуле, косвенно ссылавшимся на модифицированный.
Сделал Build - и показалась обычная ошибка о не соответствии декларации функции.
I always spent my half an hour to read this weblog's articles
every day along with a cup of coffee.
Quality articles or reviews is the important to be a focus for
the visitors to go to see the web site, that's what
this web page is providing.
- Имя
- e-mail*
- Сайт
вы можете использовать теги [i],[b],[code],[quote]
Дополнительно