问题标签 [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.
java - 可能的 Java 编译器错误!某些编译器无法编译程序
首先,一些背景知识(如果不感兴趣,请略略略过)。我很生气和困惑!这应该是一个非常简单的用例,实际上我的代码已经用 Eclipse JDT 编译器编译得很好,所以直到现在我一直在配置 Maven 以确保这样做。尽管它不能与 Oracle JDK 和 OpenJDK 一起编译,但它一直困扰着我,因为我认为这实际上可能是我的代码有问题,所以我再次调查了它。
我认为这个错误可能是在 JDT 编译器中允许它编译,而不是 Oracle JDK 和 OpenJDK 不允许它,我也测试过这两者。有问题的原始代码要复杂得多,因此我更难看出问题出在哪里,事实上,我很惊讶地看到在仍未编译的情况下可以将其减少到何种程度。
Eclipse JDT 编译器或 Oracle JDK 和 OpenJDK 都有一个相当大的(恕我直言)错误。
TL;博士
这是有问题的代码的一个相当小的表示。(anything 的类型绑定可以被任何接口替换,编译器行为不会改变):
总而言之,我认为这应该编译得很好,但是 Oracle JDK 7 & 8 和 OpenJDK 7 不同意。它确实使用 Eclipse Juno 为我编译。
当使用这些编译器中的任何一个进行编译时,上面的代码会出现类似以下错误,但使用 JDT 编译器可以正常工作:
这是没有意义的。返回类型显然是相关的,因为引用的两种方法之一必然会覆盖另一个。我几乎 99% 相信这应该会起作用,事实上,最后 1% 缺失的唯一原因是泛型的使用太基本了,以至于没有被发现,但我没有发现相关的错误报告给它。(诚然,我并没有努力,因为http://bugs.sun.com/是最糟糕的。你甚至可以通过错误报告是否仍然打开来过滤关键字搜索结果吗?呃。)
对我来说最令人困惑的部分是,当您删除 X 上任何东西的类型边界时,它编译得很好,即使额外的接口与错误无关。
谁能让我放心?任何人都知道为此存在的错误报告,或者以前有过相关经验并且可以告诉我问题是什么?如果我没有得到任何确凿的答案,我会提交一些错误报告。
编辑:
有几个人指出我在使用 <S extends C, C> 时遇到了前向引用错误。不知道为什么我没有收到这个错误,它甚至在 Eclipse 中用 JDT 编译...
无论如何,它仍然无法使用 OpenJDK 7 或 Oracle JDK 7 / 8 为我编译,因此我修改了问题以消除该问题。
编辑2:
快速检查确认这种前向引用现在在 Java 7 中是合法的。应该如此!
编辑3:
我已经在http://bugs.sun.com/上发布了错误报告。如果/当它们被接受时,我会在这里发布链接。
generics - Oracle JDK 和 Eclipse JDT 编译器不同意!哪个编译不正确?不寻常的泛型和推理
我有一段代码在 Oracle JDK 7 和 Eclipse JDT 7 之间编译不一致,但由于我不确定哪个编译器犯了错误,我想在提交任何错误报告之前我应该在这里征求意见。
这是我能想出的最简单的测试来证明不一致:
Oracle JDK 在方法 1 上给出错误,但在方法 2 上没有,而 Eclipse 对这两种方法都没有问题。我什至不确定这两种方法都应该编译...
如果这两种方法都不应该从一开始就编译,那么以下几点就没有实际意义,但我觉得如果我们添加以下代码,两个编译器都会出错:
当我们为方法 1 和方法 2 提供显式参数时,我找不到任何会导致有效调用返回 Double 的参数(即,当使用 Double 参数化 Y 时,我找不到 X 的有效参数)。这是我所期望的行为,据我所知,这里的 Y 应该只能使用 Integer 进行参数化。
但是,当我们让编译器推断参数化时,Oracle JDK 和 Eclipse JDT 都允许将 Y 推断为 Double 的调用。如果您将鼠标悬停在 Eclipse 中的调用上,它甚至会显示参数化与我们手动失败的参数设置完全相同,那么为什么会有不同的行为呢?
(此时分配给新变量 bobble 和 babble 的原因是悬停文本显示不同的参数 - 出于某种原因将 Double 替换为 Object - 如果我们再次分配给 bubble。它仍然编译调用并分配给 Doubles ,所以我不知道这是为什么。)
所以,这可能是我提出的另一个相当模糊的问题,但这里的任何人都可以为我解释一下吗?
编辑:
Eclipse 的错误报告:https ://bugs.eclipse.org/bugs/show_bug.cgi?id=398011
c# - 为什么空作业编译时没有错误
这是我的片段:
见第二行:
它编译成功并发布到云端。奇怪的!
scala - 我是否发现了 Scala 编译器错误?
在 Scala 2.9.1 中,这不会编译,失败并没有找到: value b:
但是,这样做:
唯一的区别是注释行。如果这不是错误,为什么这是预期的行为?
c++ - POD的零初始化
使用如下:
Bounds
并且Vector
是非 POD 类,dist
是int64_t
.
但是,经过优化的 VC++11 32 位发布版本似乎至少line
在 while 循环中留下了未初始化的部分。为什么?根据类型名称后的括号是否与新的有所不同?,它应该对它进行零初始化,对吧?
我将结构成员的值记录到文件中:
- after
Line line = {};
: 非 POD 类型默认初始化,其他为 0。 - after
line = Line();
:POD 类型仍然默认初始化,其他包含随机值。
c++ - 解决编译器错误
我有很大的计算几何库。它的内核有问题。我们有定义标量 taits 和自由函数形式的辅助访问器,可以简单地编写cg::epsilon<T>()
而不是cg::scalar_traits<T>::epsilon
. 但是在 vs2008 和 vs2010 下有时会争辩说它无法为T
in推导出模板参数的问题cg::epsilon<T>
。在 LWS 中的其他编译器上工作正常。
简化版重现:
是否有一些解决方法可以使访问器工作?
PS:我们使用cg::scalar_traits<S>::epsilon()
,这有助于发生错误的地方,但是太冗长了
研究:甚至被宣布为
编译器抱怨他无法为 cg::epsilon 推导出 S。
c++ - VS2012 - Decltype 作为尾随返回类型中的模板参数
以下代码适用于 gcc 甚至 VC11 Nov CTP,但无法使用 VC11 RTM 进行编译。
- VC11 RTM:http ://rise4fun.com/Vcpp/9u2
- VC11 CTP:http ://rise4fun.com/Vcpp/6lS
VC11 RTM 似乎失败了 decltype 作为返回值中的模板参数传递:它认为“T=unknown”。请注意f
,尽管在其中使用 decltype ,但编译得很好。
这是 RTM 中的编译器错误吗?如果是这样,有没有办法解决它?
java - 无法获得实现接口的 Java 枚举,该接口扩展了另一个接口以进行编译
我想创建一个实现的枚举I2
,它扩展I1
:
它一直在工作,直到我添加I1
并制作了I2
extend I1
。现在它可以工作了,但它找不到 E1A(之前有静态,所以这不是问题):
为什么?
c# - Why does this covariance declaration compile?
Consider this interface:
It compiles without errors or warnings.
As discussed in this question, and mentioned in the Covariance and Contravariance FAQ:
Variance is supported only if a type parameter is a reference type.
So why does the above interface compile? It would make sense to fail (or at least warn) on the "out" keyword. I guess the question boils down to - is there any case where using out
keyword in the above example makes any difference?
Update: Here's an example misleading behavior that may slip through for the unaware developer who looks at the Interface above:
If the coder isn't aware of variance not working for value types, they would expect the second line to return true
- because of the out
keyword - but it never will. This is exactly the bug that prompted me to ask this question...
Another example of code that would compile but produce unexpected results:
I would expect this to work (not knowing about the limitation of covariance to reference types) but it causes a System.InvalidCastException.
c# - 为什么在构建将运算符 == 提升为可为空的表达式时,泛型和非泛型结构的处理方式不同?
这看起来像是将泛型结构上的操作数提升为 null 的错误。
考虑以下虚拟结构,它覆盖operator==
:
现在考虑以下表达式:
所有三个都按预期编译和运行。
当它们被编译(使用.Compile()
)时,它们会生成以下代码(从 IL 解释为英语):
第一个只接受
MyStruct
(不可为空)args 的表达式,简单地调用op_Equality
(我们的实现operator ==
)第二个表达式在编译时会生成检查每个参数以查看它是否为 的代码
HasValue
。如果两者都不(都相等null
),则返回true
。如果只有一个有值,则返回false
。否则,调用op_Equality
这两个值。第三个表达式检查可空参数以查看它是否有值 - 如果没有,则返回 false。否则,调用
op_Equality
.
到目前为止,一切都很好。
下一步:对泛型类型执行完全相同的操作 - 更改类型MyStruct
定义MyStruct<T>
中的任何位置,并MyStruct<int>
在表达式中更改为。
现在第三个表达式编译但抛出运行时异常InvalidOperationException
并显示以下消息:
运算符“Equal”的操作数与方法“op_Equality”的参数不匹配。
我希望泛型结构的行为与非泛型结构完全相同,具有上述所有可空提升。
所以我的问题是:
- 为什么泛型和非泛型结构之间存在差异?
- 这个异常是什么意思?
- 这是 C#/.NET 中的错误吗?
此 gist 上提供了重现此内容的完整代码。