Фатальная ошибка C++ C1001: в компиляторе произошла внутренняя ошибка

Я получаю следующую ошибку при компиляции в режиме релиза.

1>d:\users\eyal\projects\code\yalla\core\src\runbox\win32\window.cpp : fatal error C1001: An internal error has occurred in the compiler.
1>         (compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c', line 249)
1>          To work around this problem, try simplifying or changing the program near the locations listed above.
1>         Please choose the Technical Support command on the Visual C++
1>          Help menu, or open the Technical Support help file for more information
1>           link!RaiseException()+0x48
1>           link!CxxThrowException()+0x65
1>           link!std::_Xout_of_range()+0x1f
1>           link!InvokeCompilerPass()+0x1b4e2
1>           link!InvokeCompilerPass()+0x22efe
1>           link!InvokeCompilerPass()+0x2332e
1>           link!InvokeCompilerPass()+0x232f9
1>           link!InvokeCompilerPass()+0x233cb
1>           link!InvokeCompilerPass()+0x22b04
1>           link!InvokeCompilerPass()+0x22d86
1>           link!DllGetC2Telemetry()+0x115837
1>
1>     1>
1>LINK : fatal error LNK1257: code generation failed

Я использую VS2015 Update 2 RC.

Я не уверен, но, возможно, это ошибка в оптимизаторе?

Код, который вызывает это, выглядит следующим образом:

window.h

class Window {
public:
    Window();
    ~Window();
    void show();
    void hide();
private:
    class NativeControl;
    std::unique_ptr<NativeControl> _window;
};

window.cpp

class Window::NativeControl : public NativeWindow {
public:
    NativeControl() : NativeWindow() { }
};

Window::Window()
    : _window(std::make_unique<Window::NativeControl>()) {
}

Window::~Window() {
}

void Window::show() 
{
    _window->show(WindowShowMode::Show);
}

void Window::hide()
{
    _window->show(WindowShowMode::Hide);
}

NativeWindow - это родное окно любой операционной системы.

Вот рабочий код, скомпилированный с GCC 5.1: https://ideone.com/4YvjRK

Просто чтобы сделать заметку.

Если я удалю наследство и заменим его чем-то вроде этого.

class Window::NativeControl {
public:
    void show(WindowShowMode showMode)
    {
    }
};

Это будет работать нормально!

Вот тот же код, скомпилированный с GCC 5.1 без наследования: https://ideone.com/Mu0A42

То, что, кажется, вызывает это поведение, является производным NativeControl от NativeWindow.

Шаги, чтобы воспроизвести это следующим образом:

  1. Удалите объявление и определения dtor из класса Window.
  2. Попробуйте построить (не перестраивать).
  3. Компилятор пожалуется и выдаст вам кучу ошибок.

1> C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ include \ memory (1194): ошибка C2338: невозможно удалить неполный тип 1> 1> 1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\memory(1195): предупреждение C4150: удаление указателя на неполный тип 'Yalla::Window::NativeControl'; ни один деструктор не называется 1>
d: \ Users \ Eyal \ Projects \ Code \ Yalla \ core \ src \ runbox \ include \ window.h (13): примечание: см. объявление 'Yalla:: Window:: NativeControl' 1>
window.cpp 1> 1> Build Failed.

  1. Добавьте обратно dtor в класс Window.
  2. Построить снова (не перестраивать).
  3. На этом этапе компилятор должен пожаловаться на следующую ошибку "Фатальная ошибка C1001: в компиляторе произошла внутренняя ошибка".

Интересная часть заключается в том, что восстановление, похоже, решает проблему!

Чего я хочу добиться, так это в основном иметь фактическую реализацию NativeWindow в другом файле, в основном для простоты, а не для повторного использования.

Я предполагаю, что вместо того, чтобы делать это в наследовании, которое может сбить с толку шаблон unique_ptr, я также могу сделать это с помощью композиции и выставить экземпляр NativeWindow через геттер, и это может сработать, но вопрос в том, существуют ли лучшие способы сделать это?

Я переучиваю C++ после очень долгого времени, когда я его не трогал, поэтому, если некоторые из моих дел не имеют смысла, пожалуйста, расскажите мне об этом!

Обновить:

Стандарт C++ гласит:

Параметр шаблона T для unique_ptr может быть неполного типа.

Я нашел сообщение об этом в блоге Херба Саттера.

4 ответа

Аналогичная ошибка с

(файл компилятора 'f:\dd\vctools\compiler\utc\src\p2\main.c', строка 255)

было исправлено изменение Properties->Linker->Optimization->Link Time Code Generation от /LTCG:incremental в /LTCG

Студия 2015 Обновление 3

У меня была аналогичная фатальная ошибка при создании тривиального приложения командной строки на C++ и использовании Microsoft Visual Studio Community 2019 версии 16.6.2.

Изменение значения по умолчанию /LTCG:incremental к /LTCG в project -> properties -> linker -> optimization за release конфигурация устранила проблему.

Чтобы добавить, эта ошибка началась после одного из недавних обновлений VS2019 (не уверен, какое именно).

Я решил эту проблему, чтобы связать большую библиотеку в 64-битной версии. Visual Studio пытается использовать Default (32-битное связывание).

Configuration Properties -> Advanced -> Preferred Build Tool Architecture -> 64-bit (x64)

Ошибка C1001, связанная с файлом компилятора p0io.c, в основном вызвана включением параметра Использовать Unicode UTF-8 для языков мира, поддерживающих параметры региона. Вы можете увидеть ссылку о конкретной причине. Вы можете нажать Время и язык -> Регион-> Дополнительная дата, время и региональные настройки-> Регион-> Административные-> Изменить языковой стандарт системы и отключить UTF-8.

Другие вопросы по тегам