问题标签 [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 回答
1394 浏览

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/上发布了错误报告。如果/当它们被接受时,我会在这里发布链接。

0 投票
1 回答
781 浏览

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

0 投票
3 回答
78 浏览

c# - 为什么空作业编译时没有错误

这是我的片段:

见第二行:

它编译成功并发布到云端。奇怪的!

0 投票
0 回答
257 浏览

scala - 我是否发现了 Scala 编译器错误?

在 Scala 2.9.1 中,这不会编译,失败并没有找到: value b

但是,这样做:

唯一的区别是注释行。如果这不是错误,为什么这是预期的行为?

0 投票
1 回答
870 浏览

c++ - POD的零初始化

使用如下:

Bounds并且Vector是非 POD 类,distint64_t.

但是,经过优化的 VC++11 32 位发布版本似乎至少line在 while 循环中留下了未初始化的部分。为什么?根据类型名称后的括号是否与新的有所不同?,它应该对它进行零初始化,对吧?

我将结构成员的值记录到文件中:

  • after Line line = {};: 非 POD 类型默认初始化,其他为 0。
  • after line = Line();:POD 类型仍然默认初始化,其他包含随机值。
0 投票
1 回答
126 浏览

c++ - 解决编译器错误

我有很大的计算几何库。它的内核有问题。我们有定义标量 taits 和自由函数形式的辅助访问器,可以简单地编写cg::epsilon<T>()而不是cg::scalar_traits<T>::epsilon. 但是在 vs2008 和 vs2010 下有时会争辩说它无法为Tin推导出模板参数的问题cg::epsilon<T>。在 LWS 中的其他编译器上工作正常。

简化版重现:

是否有一些解决方法可以使访问器工作?

PS:我们使用cg::scalar_traits<S>::epsilon(),这有助于发生错误的地方,但是太冗长了

研究:甚至被宣布为

编译器抱怨他无法为 cg::epsilon 推导出 S。

0 投票
1 回答
656 浏览

c++ - VS2012 - Decltype 作为尾随返回类型中的模板参数

以下代码适用于 gcc 甚至 VC11 Nov CTP,但无法使用 VC11 RTM 进行编译。

VC11 RTM 似乎失败了 decltype 作为返回值中的模板参数传递:它认为“T=unknown”。请注意f,尽管在其中使用 decltype ,但编译得很好。

这是 RTM 中的编译器错误吗?如果是这样,有没有办法解决它?

0 投票
2 回答
163 浏览

java - 无法获得实现接口的 Java 枚举,该接口扩展了另一个接口以进行编译

我想创建一个实现的枚举I2,它扩展I1

它一直在工作,直到我添加I1并制作了I2extend I1。现在它可以工作了,但它找不到 E1A(之前有静态,所以这不是问题):

为什么?

0 投票
1 回答
132 浏览

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.

0 投票
2 回答
1020 浏览

c# - 为什么在构建将运算符 == 提升为可为空的表达式时,泛型和非泛型结构的处理方式不同?

这看起来像是将泛型结构上的操作数提升为 null 的错误。

考虑以下虚拟结构,它覆盖operator==

现在考虑以下表达式:

所有三个都按预期编译和运行。

当它们被编译(使用.Compile())时,它们会生成以下代码(从 IL 解释为英语):

  1. 第一个只接受MyStruct(不可为空)args 的表达式,简单地调用op_Equality(我们的实现operator ==

  2. 第二个表达式在编译时会生成检查每个参数以查看它是否为 的代码HasValue。如果两者都不(都相等null),则返回true。如果只有一个有值,则返回false。否则,调用op_Equality这两个值。

  3. 第三个表达式检查可空参数以查看它是否有值 - 如果没有,则返回 false。否则,调用op_Equality.

到目前为止,一切都很好。

下一步:对泛型类型执行完全相同的操作 - 更改类型MyStruct定义MyStruct<T>中的任何位置,并MyStruct<int>在表达式中更改为。

现在第三个表达式编译但抛出运行时异常InvalidOperationException并显示以下消息:

运算符“Equal”的操作数与方法“op_Equality”的参数不匹配。

我希望泛型结构的行为与非泛型结构完全相同,具有上述所有可空提升。

所以我的问题是:

  1. 为什么泛型和非泛型结构之间存在差异?
  2. 这个异常是什么意思?
  3. 这是 C#/.NET 中的错误吗?

此 gist 上提供了重现此内容的完整代码。