0

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

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

У меня есть класс A, который не является копируемым (она имеет несколько «ссылочных» членов) и не имеет конструктора по умолчанию. Другой класс, B, содержит массив A s (простой массив 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 содержать A с.

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

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

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

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

UPDATE 1: Это файл компилятора, на который ссылается сообщение об ошибке со смертельным исходом C1001: (compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c', line 230).

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

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

UPDATE 3: Я обнаружил, что если я реорганизовать данные членов в B и поместить массив в самом конце, код компилируется. Я пробовал несколько других перестановок и иногда компилируется, а иногда нет. Я не вижу никаких шаблонов, касающихся того, что другие участники, входящие в массив, делают компилятор полным, ICE!(являющийся UDT или примитивами, имеющими конструкторы или нет, POD или нет, ссылка или указатель или тип значения, ...)

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

Тем не менее, мне по-прежнему очень нравится минимальное воспроизведение ICE, чтобы он мог отправить Microsoft. Я не хочу быть застрял с этим в течение следующих двух лет

UPDATE 4 (по крайней мере!): Я пробовал VS2015 RC и ICE по-прежнему существует (хотя сообщение об ошибке относится к другой внутренней строка кода 247 в том же файле «main.c».)

И я открыл bug report on Microsoft Connect.

+0

A имеет B и B имеет A, вы уверены, что нужна такая грязная организация? –

+1

ICE не обязательно означает, что код не может быть скомпилирован из-за ошибки в компиляторе. Иногда это означает, что вы используете комбинацию функций, которые в настоящее время не обрабатываются компилятором. Постарайтесь следовать рекомендациям [здесь] (https://msdn.microsoft.com/en-us/library/y19zxzb2.aspx). –

+0

Возьмите исходный код, который ICE. Makr - контрольная полка. Теперь удалите кучу вещей, которые, по вашему мнению, не имеют значения. Компиляция. ICE? Полка, повторите. Нет ICE? Полка, сделайте резервную копию, удалите разные вещи. Повторение. Если вы выберете достаточно насыщенный материал, вы можете сделать ваш пример действительно маленьким, действительно быстрым таким образом. Помните, что ваша цель состоит в компиляции, * not * link: ошибки компоновщика - это хорошо! – Yakk

ответ

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^