VC ++ 14(VS2015)中数组值初始化的内部编译器错误

时间:2015-05-23 19:56:25

标签: c++ c++11 visual-studio-2015 array-initialization internal-compiler-error

我在Visual Studio 2015 CTP 6上获得了ICE。不幸的是,这是在一个大项目中发生的,我无法在这里发布整个代码,而且我无法在最小的样本上重现问题。我希望得到的是帮助构建这样一个样本(提交给微软),或者可能关于正在发生的事情和/或我做错的事情。

这是我正在做的事情的模型。 (请注意,我在这里提出的代码不会生成ICE;我只是用这个简单的例子来解释这种情况。)

我有一个类A,它不可复制(它有几个“引用”成员)并且没有默认构造函数。另一个类B包含A s的数组(A值的普通C数组,没有引用/指针),我在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 s。

注意如果我不使用数组并使用单个变量(例如A a0, a1, a2;,我可以做,因为数组很小并且已修复在尺寸上)ICE消失了。但这不是我想要的,因为我将失去通过索引获取它们的能力,这是我需要的。我可以在数组上使用松散变量的联合来解决我的ICE问题获取索引(使用变量构造,使用数组访问),但我认为这会导致“未定义的行为”而且似乎很复杂。

上述示例与我的实际代码(除了比例)之间的明显差异是AB是类而不是结构,每个都在其自己的源/头中声明/定义文件对,并且没有任何构造函数是内联的。 (我复制了这些,仍然无法复制ICE。)

对于我的实际项目,我已经尝试清理构建的文件并重建,但无济于事。有什么建议吗?

P.S。我不确定我的头衔是否合适。有什么建议吗?!?!

UPDATE 1 :这是C1001致命错误消息中引用的编译器文件:(compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c', line 230)

UPDATE 2 :由于我忘了提及,代码库在C ++ 14模式下在GCC 4.9.2下干净地(并且正确地)编译。

此外,我正在编译禁用所有优化。

更新3 :我发现如果我重新排列B中的成员数据并将数组放在最后,代码就会编译。我已经尝试了其他几种排列,它有时会编译,有时则不会。关于阵列之前的其他成员是什么让编译器充满ICE,我看不到任何模式! (是UDT还是原语,是否有构造函数,POD与否,引用或指针或值类型,......)

这意味着我对我的问题有一些解决方案,虽然我的内部类布局对我和这个应用程序很重要,我可以容忍性能损失(由于缓存未命中导致的一些热数据) )为了超越这件事。

然而,我仍然非常喜欢能够提交给微软的ICE的最小代表。我不想在接下来的两年里坚持这一点(至少!)

更新4 :我已经尝试过VS2015 RC并且ICE仍在那里(尽管错误消息指的是不同的内部代码行,同一个“main.c”文件中的第247行)。 )

我打开了bug report on Microsoft Connect

1 个答案:

答案 0 :(得分:1)

我确实向微软报告了这个问题,在与他们分享了我的一些项目代码后,似乎已经跟踪并修复了问题。他们表示修复将包含在最终的VC14版本中。

感谢您的评论和指示。