问题标签 [internal-compiler-error]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - VC++14(VS2015)中数组值初始化的内部编译器错误
我在 Visual Studio 2015 CTP 6 上获得了 ICE。不幸的是,这发生在一个大型项目中,我无法在此处发布整个代码,而且我无法在最小样本上重现该问题。我希望得到的是帮助构建这样一个样本(提交给微软),或者可能是关于正在发生的事情和/或我做错了什么的启发。
这是我正在做的事情的模型。(请注意,我在这里展示的代码不会生成 ICE;我只是使用这个简单的示例来解释这种情况。)
我有一个A
不可复制的类(它有几个“引用”成员)并且没有默认构造函数。另一个类,B
包含一个A
s 数组(纯 CA
值数组,没有引用/指针),我在B
使用统一初始化语法的构造函数中初始化这个数组。请参阅下面的示例代码。
我不能使用std::array
,因为我需要在它们的最终位置构造元素(不能复制。)我不能使用std::vector
,因为我需要B
包含A
s。
请注意,如果我不使用数组并使用单个变量(例如A a0, a1, a2;
,我可以这样做,因为数组很小且大小固定),ICE 就会消失。但这不是我想要的,因为我将失去通过索引获取它们的能力,这是我需要的。我可以在数组上使用松散变量的联合来解决我的 ICE 问题并获得索引(使用变量构造,使用数组访问),但我认为这会导致“未定义的行为”并且看起来很复杂。
上面的示例和我的实际代码(除了比例)之间的明显区别是,A
并且B
是类而不是结构,每个都在自己的源/头文件对中声明/定义,并且没有一个构造函数是内联的。(我复制了这些,但仍然无法重现 ICE。)
对于我的实际项目,我尝试清理构建文件并重建,但无济于事。有什么建议之类的吗?
PS我不确定我的标题是否合适。有什么建议吗?!?!
更新 1:这是 C1001 致命错误消息中引用的编译器文件:(compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c', line 230)
.
更新 2:由于我忘记提及,代码库在 C++14 模式下的 GCC 4.9.2 下干净(且正确)编译。
另外,我正在编译禁用所有优化。
更新3:我发现如果我重新排列成员数据B
并将数组放在最后,代码就会编译。我尝试了其他几种排列方式,它有时会编译,有时不会。我看不到任何关于在数组之前出现的其他成员使编译器完全运行 ICE 的模式!(作为 UDT 或原语,是否有构造函数,是否有 POD,引用或指针或值类型,...)
这意味着我对我的问题有某种解决方案,虽然我的内部类布局对我和这个应用程序很重要,但我可以容忍性能损失(由于将一些热数据与其他数据分开导致缓存未命中)克服这件事。
但是,我仍然非常喜欢能够提交给 Microsoft 的 ICE 的最小复制品。我不想在接下来的两年里被这个困住(至少!)
更新 4:我已经尝试过 VS2015 RC 并且 ICE 仍然存在(尽管错误消息指的是不同的内部代码行,即同一“main.c”文件中的第 247 行。)
visual-c++ - 如何获取触发内部编译器错误的预处理行?
分类选项
实际上,我正在构建一个内核 dll。
该mio.cpp
文件在我的系统上不存在,所以我认为这是 cl.exe 源代码的一部分。使用 gcc,有一个选项可以让您知道代码的哪一行触发了编译器错误。
我试图禁用已编译的标头;所有优化将目标更改为 R10000,但错误仍然附加在同一位置。
微软肯定不会纠正错误。我找不到另一个支持这个平台的编译器。
另外我真的需要使用包含文件,因为导出是结构结构的结构。
c++ - MSVC ICE 在使用 void-cast 表达式的 decltype 部分特化类模板时?
摘要: MSVC 2013 是否有权在代码段之后拒绝此 MCVE,即使它以不太理想的方式这样做?
- MSVC 2013,更新 5
- 海合会 5.2.0
- 铿锵声 3.7.0
在尝试创建类型特征以检查从单个其他类型构造一种类型的大括号的有效性时
它在 MSVC2013 中通过调整此答案中的代码来尝试解决 MSVC 缺乏表达式 SFINAE 支持的问题。我一直在收到:
错误 C1001:编译器发生内部错误。
与位置
编译器文件'f:\dd\vctools\compiler\cxxfe\sl\p1\c\cast.c',第 725 行
下面的 MCVE 会触发此 ICE,即使在 /Od 下也是如此:
正如在coliru上所见,gcc 和 clang 都很好(即使在 -O2 下)。然而,虽然 ICE 肯定是 MSVC 中的一个错误,但 gcc 和 clang 都接受所述代码并不能保证它最终是有效的代码。
Arg
从模板中删除并替换Arg
declval 中的int
不会重现错误:
并且 gcc 和 clang再次很好。
MSVC 是否正在从有效代码生成 ICE?
visual-studio-2015 - 使用 VC14 平台工具集构建 OpenCV 3.0 时编译器崩溃
我正在尝试使用 Visual Studio 2015 C/C++ 编译器编译最新版本的 OpenCV (3.0)。
我已经从 GitHub 下载了最新的源代码,并使用 CMake 3.4.0-rc1 生成了解决方案。我只想构建没有任何附加功能的库(Contrib 模块、CUDA、VTK、OpenNI 等)
生成解决方案后(CMake 未显示任何错误),我尝试使用 Microsoft Visual Studio 2015 构建它。构建开始后,会弹出一个窗口,提示“Microsoft C/C++ 编译器驱动程序已停止工作"并在排序期间自动关闭。
当构建停止时,我收到以下错误:
我的bin和lib文件夹是空的(没有生成 dll/libs)。
当编译器崩溃时,在输出窗口中出现以下错误:
任何帮助表示赞赏,在此先感谢您!:)
c++ - 使用 cygwin 在 Windows 上编译 praat 时出现问题 - 内部编译器错误
我正在尝试用 Cygwin编译 Praat ( http://www.fon.hum.uva.nl/praat/ )。我尝试按照 GitHub 页面 ( https://github.com/praat/praat ) 上的说明进行操作。当我运行'make'时,几个文件编译没有问题,但后来我得到:
我尝试在 Praat 用户组上发布一个问题,但没有成功。我怀疑它可以与以前版本的 x86_64-w64-mingw32-gcc 一起使用,但我不确定如何确定哪个版本可以使用,或者老实说,如何降级。(我也不确定 x86_64-w64-mingw32-gcc 和plain ol' gcc 之间有什么区别。)我想避免任何涉及编辑源代码的解决方案,因为它显然已经按原样编译了没有问题。
任何建议或指示是正确的方向将不胜感激!:)
c++ - Struct 可以在方法体中声明,但前提是它不包含成员字段初始值设定项。编译器错误与否?
我花了一个小时才找到这个问题。以下代码
产生编译错误:
1>error C2327: 'Test::_member' : 不是类型名称、静态或枚举
器 1>error C2065: '_member' : 未声明的标识符
一旦我替换为 ,错误就会int s = 0;
消失int s;
。
这只发生在 MSVC 2013 中,而不是 2015 年。我很确定这是一个编译器错误,但我想确保它不是我不熟悉的 C++ 特性(在 C++11 和 C++ 之间发生了变化14)。
c++ - C++11 constexpr 导致编译器的内部错误 (C1001)
我正在使用 Visual Studio 2015 更新 3。
我收到一个致命错误:
(代码 C1001):编译器发生内部错误。
这是代码:
我读到它已在 Visual Studio Update 2 中修复。有人可以解释我为什么会收到此错误吗?提前致谢。
c++ - 数组的放置新运算符周围的括号
玩弄新的数组放置,我(偶然/错误地)想到了以下代码:
中的第三行main
不正确,尽管它可以编译。不应该有任何括号。铿锵++吐出来
警告:当类型在括号中时,数组不能有动态大小
而 gcc6 输出
警告:ISO C++ 禁止变长数组 [-Wvla] X* p = new (buf) (X[n]);
警告:非常量数组的新长度必须在 type-id [-Wvla] X* p = new (buf) (X[n]) 周围不带括号的情况下指定;
然后在tree_to_uhwi 中的 tree.h:4044 处因内部编译器错误 (ICE)而崩溃。内部编译器错误仅出现在 gcc >= 6 中。
我的问题:标记为“不正确”的行是如何解析/解释的,为什么有这些括号是“错误的”?*
*对于ICE,无论如何我都会填写一个错误。
编辑 1我刚刚意识到 ICE/警告与用户定义的类型无关,因此观察到相同的行为int
而不是struct X
.
编辑 2 gcc6 错误在这里填充。在 gcc5 或更早的版本中没有出现 ICE(只有警告出现,这是正确的)。
java - 调试内部编译器错误 (Java) 以查找有问题的源代码
由于 JDK 错误,我设法编写了一些在使用 JDK 1.8.0_131 进行编译期间导致错误的代码。我只需要几行代码就可以重现这个问题——但我找不到在我的项目中的哪个位置使用了导致错误的模式。
我的目标是找出我的项目中的哪些代码导致了这个错误,并应用了解决方法。
问题和复制
该问题在JDK-8074381 错误报告中进行了概述,并且只需几行代码即可复制。
当使用非参数化的 lambda 而不是非参数化的内部类(根据我相信的语言规范,这两者都应该是有效的)时,这个问题就会显现出来。所以
工作正常。有问题的堆栈跟踪开始(为了您的理智而截断):
鉴别
我知道这个问题在 JDK9 中得到修复,但是这个项目要求我使用 JDK 8。
因此,我不需要更新到 JDK9,而是需要找出该项目中的哪些代码产生了错误。这是我尝试过的。
我的第一个想法是检查发生此错误时正在编译的文件。但是,我无法弄清楚在遇到错误时如何检查正在编译的源文件。如果这是可能的,那么该信息将很有帮助。
我的第二个想法是对我的所有代码进行正则表达式搜索,以查找任何类型参数化接口或扩展通用接口的接口。这些搜索都没有产生明显匹配问题产生代码的代码——没有未使用的泛型(在示例中更改
interface Foo<L>
为interface Foo
可以解决问题)。因此,我认为对编译器内部实际导致此错误的原因进行更微妙的了解可能有助于确定负责的代码段,因为它可能会扩大我的搜索标准。(对于完全不同的问题,我也有可能遇到具有完全相同堆栈跟踪的错误,但这对我来说似乎不太可能,我不确定从哪里开始,有什么想法吗?)
我认为最值得检查编译器日志或其他东西来检查这个问题出现时正在编译的内容。有任何想法吗?
谢谢。