C++11 constexpr вызывает внутреннюю ошибку компилятора (C1001)

Я использую Visual Studio 2015 Обновление 3.

Я получаю фатальную ошибку:

(код C1001): в компиляторе произошла внутренняя ошибка.

Вот код:

template<typename T>
constexpr T epsilon = std::numeric_limits<T>::epsilon();

Я прочитал, что это было исправлено в Visual Studio Update 2. Может кто-нибудь объяснить мне, почему я получаю эту ошибку? Заранее спасибо.

2 ответа

Любая внутренняя ошибка (ICE) является ошибкой компилятора. Вы получаете это, потому что вы случайно вызвали эту ошибку. Об этом компиляторе вы можете сообщить в Microsoft Connect.

Для такого отчета вам нужен пример с ожидаемым правильным результатом и ошибочным результатом.

Следующая тестовая программа прекрасно компилируется и работает с MinGW g++ 5.1

#include <limits>

template<typename T>
constexpr T epsilon = std::numeric_limits<T>::epsilon();

#include <iostream>
using namespace std;
auto main() -> int
{
    cout << epsilon<double> << endl;
}

Выход:

2.22045e-016

В Visual C++ 2015 с обновлением 2 он создает ICE:

foo.cpp(10): фатальная ошибка C1001: в компиляторе произошла внутренняя ошибка.
(файл компилятора 'f:\dd\vctools\compiler\cxxfe\sl\p1\c\symbols.c', строка 28114)
 Чтобы обойти эту проблему, попробуйте упростить или изменить программу рядом с местами, перечисленными выше.
Пожалуйста, выберите команду технической поддержки на Visual C++
 Меню справки или откройте файл справки технической поддержки для получения дополнительной информации
foo.cpp(10): примечание: см. ссылку на компилируемый шаблон переменной 'const double epsilon'

Версия компилятора:

> cl / nologo- 2> & 1 | найти "++"
Оптимизирующий компилятор Microsoft (R) C/C++ версии 19.00.23725 для x86

Я назвал это ошибкой в ​​Microsoft, но с начала 2017 года они исправили ошибку, которая не была выпущена из того, что я вижу на сегодняшний день.

Я также предоставил проект на GitLab и предоставил Microsoft информацию для этого проекта здесь: https://gitlab.com/cppocl/tostring

Загрузка.sln и компиляция в настоящее время приводит к сбоям в Visual Studio 2015 с обновлением 2 или 3 и Visual Studio Enterprise 2017 версии 15.3.1.

Кажется, что сочетание шаблона и constexpr приводит к сбою компилятора.

Я видел отчеты для Visual Studio 2017, описывающие подобные типы проблем.

Эта ссылка говорит об исправлении в ожидании выпуска: https://developercommunity.visualstudio.com/content/problem/18155/msvc-2017-c-fatal-error-c1001-constexpr-initializa.html

Визуальный список ошибок, связанных с constexpr, в Visual Studio 2015 находится здесь: https://blogs.msdn.microsoft.com/vcblog/2015/12/02/constexpr-in-vs2015-update-1/

РЕДАКТИРОВАТЬ: Я также не верю, что изменение настроек оптимизации будет иметь значение, как это было рекомендовано в других сообщениях. Я экспериментировал с этими настройками и безуспешно применял рекомендуемые патчи.

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