Внутренняя ошибка компилятора при инициализации значения массива в VC ++ 14 (VS2015)

Я получаю ICE на Visual Studio 2015 CTP 6. К сожалению, это происходит в большом проекте, и я не могу опубликовать весь код здесь, и я не смог воспроизвести проблему на минимальном примере. Я надеюсь получить помощь в создании такого образца (для отправки в Microsoft) или, возможно, освещение того, что происходит и / или что я делаю неправильно.

Это макет того, что я делаю. (Обратите внимание, что код, который я представляю здесь не генерировать ЛЕД; Я просто использую этот простой пример, чтобы объяснить ситуацию.)

У меня есть класс A который не подлежит копированию (у него есть пара «ссылочных» членов) и не имеет конструктора по умолчанию. Другой класс, B содержит массив As (простой массив C A значения, без ссылок / указателей) и я инициализирую этот массив в конструкторе B используя единый синтаксис инициализации. Смотрите пример кода ниже.

struct B;

struct A
{
int & x;
B * b;

A (B * b_, int & x_) : x (x_), b (b_) {}
A (A const &) = delete;
A & operator = (A const &) = delete;
};

struct B
{
A a [3];
int foo;

B ()
: a {{this,foo},{this,foo},{nullptr,foo}}  // <-- THE CULPRIT!
, foo (2)
{  // <-- This is where the compiler says the error occurs
}
};

int main ()
{
B b;
return 0;
}

Я не могу использовать std::array потому что мне нужно создать элементы в их окончательном месте (не могу скопировать.) я не могу использовать std::vector потому что мне нужно B содержать As.

Обратите внимание, что если я не использую массив и использую отдельные переменные (например, A a0, a1, a2;который я Можно делать, потому что массив небольшой и фиксированного размера) ICE уходит. Но это не то, чего я хочу, так как я потеряю способность обращаться к ним по индексу, который мне нужен. Я могу использовать объединение свободных переменных над массивом, чтобы решить мою проблему ICE а также получить индексирование (конструирование с использованием переменных, доступ с использованием массива), но я думаю, что это приведет к «неопределенному поведению» и кажется запутанным.

Очевидные различия между приведенным выше образцом и моим реальным кодом (за исключением шкалы) заключаются в том, что A а также B являются классами, а не структурами, каждый объявлен / определен в своей собственной паре файлов источника / заголовка, и ни один из конструкторов не является встроенным. (Я продублировал их и до сих пор не смог воспроизвести ЛЕД.)

Для моего реального проекта я попытался очистить встроенные файлы и перестроить, но безрезультатно. Любые предложения и т. Д.?

Постскриптум Я не уверен, подходит ли мой заголовок. Любые предложения по этому поводу?!?!

ОБНОВЛЕНИЕ 1Это файл компилятора, указанный в фатальной ошибке C1001: (compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c', line 230),

ОБНОВЛЕНИЕ 2: Поскольку я забыл упомянуть, кодовая база компилируется чисто (и правильно) в соответствии с GCC 4.9.2 в режиме C ++ 14.

Кроме того, я компилирую со всеми отключенными оптимизациями.

ОБНОВЛЕНИЕ 3: Я обнаружил, что если я переставить данные члена в B и положить массив в самом конце, код компилируется. Я пробовал несколько других перестановок, и иногда он компилируется, а иногда нет. Я не вижу каких-либо паттернов относительно того, что другие члены будут приходить до того, как массив заставит компилятор работать полностью на ICE! (быть UDT или примитивами, иметь конструкторы или нет, POD или нет, ссылочный или указатель или тип значения, …)

Это означает, что у меня есть своего рода решение для моей проблемы, хотя моя внутренняя компоновка классов важна для меня и этого приложения, я могу терпеть падение производительности (из-за ошибок в кеше, возникающих из-за того, что некоторые горячие данные отделены от остальных) в порядке чтобы пройти эту вещь.

Тем не менее, мне все еще очень нравится минимальное повторение ICE, чтобы иметь возможность представить в Microsoft. Я не хочу зацикливаться на этом в течение следующих двух лет (по крайней мере!)

ОБНОВЛЕНИЕ 4: Я пробовал VS2015 RC, и ICE все еще там (хотя сообщение об ошибке относится к другой внутренней строке кода, строка 247 в том же файле «main.c».)

И я открыл отчет об ошибках в Microsoft Connect.

0

Решение

Я сообщил об этом в Microsoft, и после того, как я поделился с ними частью своего кода проекта, кажется, что проблема была обнаружена и исправлена. Они сказали, что это исправление будет включено в финальную версию VC14.

Спасибо за комментарии и указатели.

1

Другие решения


По вопросам рекламы [email protected]