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



我正在获得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。)

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

注:我不确定我的头衔是否合适。对此有什么建议吗?

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

UPDATE 2:由于我忘记提到,代码库在GCC 4.9.2下在c++ 14模式下编译得干净(并且正确)。

同时,我在编译时禁用了所有的优化。

UPDATE 3:我发现如果我重新排列B中的成员数据并将数组放在最后,代码会编译。我试过其他几种排列,有时可以编译,有时不能。我看不到任何关于数组之前的其他成员使编译器完全执行ICE的模式!(是udt还是原语,是否有构造函数,是否有POD,引用或指针或值类型,…)

这意味着我对我的问题有了某种解决方案,尽管我的内部类布局对我和这个应用程序很重要,但我可以容忍性能下降(由于将一些热数据与其他数据分开导致缓存丢失),以克服这个问题。

然而,我仍然很想要一个ICE的最小复制品,以便能够提交给微软。我不想在接下来的两年里(至少!)

UPDATE 4:我已经尝试过VS2015 RC和ICE仍然存在(尽管错误消息指的是不同的内部代码行,行247在同一个"main.c"文件。)

我已经打开了Microsoft Connect的bug报告

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

感谢您的评论和指点。

相关内容

  • 没有找到相关文章