问题标签 [compiler-bug]

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.

0 投票
3 回答
188 浏览

c++ - 为什么 SFINAE 在更改类模板专业化的位置时会搞砸?这是一个 C++ 错误吗?

以下代码给出了预期的编译器错误(Demo):

现在,如果我交换第 5 行和第 7 行。然后没有编译器错误演示

对于o1,没有错误是可以理解的,因为(value > 2)尚不可见 for 的特化。但是为什么也没有错误o2,它看到了 2 个匹配的专业化!?
我的猜测是,编译器第一次遇到时应该选择Unique<3>::type具有任意名称的 ,然后用Unique<3>::type该名称替换任何地方。

这是编译错误还是 C++ 错误或 C++“功能”?

0 投票
2 回答
4667 浏览

c# - 在 C# 中混合输出和命名参数:为什么输出参数也需要命名?

简短版本:参数后面的命名参数out会产生编译器错误,但我在语言规范中找不到对这种行为的任何支持。

长版

我正在使用Enum.TryParse<TEnum>三参数重载,但我更愿意命名ignoreCase参数以使我的代码更清晰,这样的调用:

使布尔值的含义不清楚(除非此方法已知1)。因此我想使用:

但是编译器将此报告为错误:

命名参数 'ignoreCase' 指定一个已经给出位置参数的参数

IDE 会突出显示该ignoreCase参数。针对 .NET 4 的 VS2010 和针对 4 或 4.5 的 VS11 Beta 都给出了相同的结果。在所有情况下,命名out参数都会消除错误。

我已经在框架和我的程序集中尝试了许多不同的方法(包括避免泛型)2:总是相同的结果:一个out参数后跟一个命名参数会产生错误。

我看不出这个错误的原因,并且C# 语言规范的§7.5.1参数列表:版本 4.0似乎没有提供任何原因说明out后面的命名参数应该给出错误。错误的文本似乎支持将其解释为错误:没有位置参数可以有效匹配ignoreCase.

我对规范的阅读是错误的吗?或者这是一个编译器错误?

C# 7.2 更新

当使用 C# 7.2 取消调用时,对所有命名参数的限制必须遵循位置参数。

请参阅https://docs.microsoft.com/en-gb/dotnet/csharp/whats-new/csharp-7-2#non-trailing-named-arguments


1因此,框架设计指南中的建议是首选enum参数。

2例如:给定:

out除非参数也被命名,否则此调用也会在命名参数上给出相同的错误:

0 投票
4 回答
5234 浏览

java - 为什么 java 5+ 中的 volatile 不能确保来自另一个线程的可见性?

根据:

http://www.ibm.com/developerworks/library/j-jtp03304/

在新的内存模型下,当线程 A 写入 volatile 变量 V,而线程 B 从 V 中读取时,在写入 V 时对 A 可见的任何变量值现在保证对 B 可见

互联网上的许多地方都声明以下代码永远不应该打印“错误”:

b 当为 1时,所有线程都应a为 1。

但是我有时会打印“错误”。这怎么可能?

0 投票
2 回答
3527 浏览

gcc - 位域的 GCC 实现中的一个错误

在 C11 中工作,以下结构:

由 GCC 布局为一个unsigned(4 个字节),其中使用了 4 个位,然后是一个_Bool(4 个字节),其中使用了 1 个位,总大小为 8 个字节。

请注意,C99 和 C11 特别允许_Bool作为位域成员。C11 标准(可能还有 C99)还在 §6.7.2.1 'Structure and union specifiers' ¶11 中声明:

实现可以分配任何大到足以容纳位字段的可寻址存储单元。如果有足够的空间剩余,紧跟在结构中另一个位域之后的位域将被打包到同一单元的相邻位中。

所以我认为b上面的 member 应该已经被打包到为 member 分配的存储单元中a,从而产生了一个总大小为 4 字节的结构。

GCC 行为正确,并且在对两个成员使用相同类型时,或者当一个 isunsigned和另一个时,确实会发生打包,但是GCC 似乎认为signed类型unsigned和类型过于不同,无法正确处理它们。_Bool

有人可以确认我对标准的解释,这确实是一个 GCC 错误吗?

我也对解决方法感兴趣(一些编译器开关,编译指示,__attribute__...)。

我正在使用 gcc 4.7.0 -std=c11(尽管其他设置显示相同的行为。)

0 投票
1 回答
733 浏览

c - gcc 内联 asm 语句得到优化 - 错误的约束?

我在使用 gcc 内联 asm 语句时遇到问题;gcc 似乎认为结果是一个常数(它不是)并优化了语句。我认为我正确地使用了操作数约束,但想就此事发表第二意见。如果问题不在于我对约束的使用,我会尝试为 gcc 错误报告隔离一个测试用例,但这可能很困难,因为即使周围代码中的细微变化也会导致问题消失。

有问题的内联汇编是

这是一个单词除数的两个单词除数的相当普通的剩余部分。请注意,输入的高位字 a2 和余数输出 *r 通过“1”约束绑定到同一个寄存器 %rdx。

从周围的代码中,ularith_div_2ul_ul_ul_r()被有效地调用,就好像

所以输入的高位字 a2 是常数 1UL。gcc -S -fverbose_asm 生成的 asm 输出如下所示:

效果是ularith_div_2ul_ul_ul_r()调用的结果被假定为常量 1;divq 永远不会出现在输出中。

各种变化使问题消失;不同的编译器标志、不同的代码上下文或标记 asm 块__asm__ __volatile__ (...)。然后输出正确地包含 divq 指令:

所以,我在这里向内联汇编人员提出问题:我对约束做错了吗?

0 投票
4 回答
57030 浏览

c - 使用 printf 的 %s 说明符打印 NULL 的行为是什么?

遇到一个有趣的面试问题:

尽管这在某些系统上可能运行良好,但至少我的系统抛出了分段错误。这种行为的最佳解释是什么?上面的代码在 C 中。

以下是我的 gcc 信息:

0 投票
1 回答
102 浏览

c++ - 导出一个类是否应该有所作为?

以下代码在编译时VS 2010/2012会出现以下错误:

错误 C4716:“DI_1::operator=”:必须返回一个值

而我期望它也会为DI_2类返回相同的错误。

这是一个编译器错误,没有将DI_2类标记为错误吗?

如果不是,有人可以解释原因吗?

编辑:我用 Solaris Compiler 确认,它对两个类都抛出错误。

0 投票
2 回答
1990 浏览

c++ - Visual C++ 2012 (x86) 中可能的编译器错误?

我目前在使用VC++ 11 (CTP Update 1)为 x86 目标编译时遇到随机浮点错误。请参阅下面的简短示例“test.cpp”,并使用以下命令进行编译:

输出应该是10 == 10,但它在启用(整个程序优化)10 == 0时产生。/GL问题似乎是get_scaling_factor()将结果推送到浮点堆栈上,但调用函数期望它在 SSE 寄存器XMM0中。

问题:我是否遗漏了一些明显的东西,或者这真的是一个错误?当然,测试程序没有意义,因为它是一个精简的测试用例。

测试.cpp:


更新

Microsoft 确认的问题。它甚至会影响这样的直接代码:

0 投票
3 回答
610 浏览

javascript - 为什么 e += 1 和 e = e + 1 在 CoffeeScript 中的编译方式不同?

我一直假设<var> += 1并且<var> = <var> + 1在 JS 中具有相同的语义。
现在,这个 CoffeeScript 代码在应用于全局变量时编译为不同的 JavaScript e

注意b使用全局变量,而a定义局部变量:

自己试试。
这是一个错误还是有原因?

0 投票
1 回答
609 浏览

c++ - 可变参数模板函数参数的编译错误

我正在尝试编写一些参数包装帮助器代码,如下所示

此代码适用于没有命名空间的固定参数函数或类型的左值引用,但我的编译器拒绝尝试将右值引用参数与某个命名空间一起使用。我用的是vc11 ctp版本,报错信息有点看不懂(见下文)

它看起来像一个编译器错误,但我对此没有信心。这是错误吗?如果不是,那么我应该怎么做才能解决这个问题?