问题标签 [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.
c++ - 静态 const 成员变量、可变参数模板和 && 的编译器错误或正确行为?
在尝试编译下面包含的代码时,我注意到了一个奇怪的行为。我有4个文件如下
创建共享.h:
静态初始化类.h
静态初始化类.cpp:
主.cpp:
没有标志,程序编译并运行良好。
好吧,因为 default_i 是一个整数类型,我们可以在 header 中初始化它。让我们这样做
很好,仍然可以编译并且工作正常。现在,让我们添加 && 和 std::forward
链接器错误。好吧,现在让我们尝试在 .cpp 中初始化我们的 default_i 成员
它再次起作用。使用 clang 会产生相同的结果,这会让我相信这不仅仅是一个孤立的编译器错误,而且可能是语言本身的某些东西阻止了静态初始化。我似乎无法连接为什么添加 && 会导致中断。
目前我在 Ubuntu 14.04 上使用 g++ 4.8.2 和 clang++ 3.5
使用 -DINITIALIZE_IN_HEADER 和 -DUSE_REFREF 时有什么想法?
generics - 生成的静态方法调用未在 Java 8 中编译
长话短说,以下代码未在Java 8中编译,但在Java 7中编译和执行良好:
错误发生在提到的行并带有消息:The method meth(Class<T>) in the type AnotherSpike is not applicable for the arguments (Class)
。
虽然我完全理解这样的代码不是 100% 类型安全的,但我需要在Java 8的生产代码中使用非常相似的调用(并且它在编译时带有警告并且在Java 7中运行良好)。
有趣的是,上面的代码在以下情况下编译得很好(带有警告,但这没关系):
如果
/li>& IAliased<K>
从方法签名中删除:if
/li>& IAliased<K>
替换为& IAliased
in 签名:
以上两个观察使我认为这更像是 Java 8 中的编译器错误,而不是对 Java 8 编译器的深思熟虑的增强,尽管我可能弄错了。
无论如何,有人可以建议我如何将原始实例传递Class
给 meth
具有这种签名的方法而不会出现编译器错误?
提前感谢您的帮助!
c++ - 大括号初始值设定项列表中是否允许显式转换运算符?
以下代码使用 GCC 4.9.2 编译,但不使用 Clang 3.5.0:
铿锵++ 说:
奇怪的是,如果std::string
替换为原始类型(如int
.
c++ - 嵌套两次的 sizeof 可以是依赖表达式吗?
我注意到 gcc 5.0 拒绝以下代码,而 clang 3.6 接受它。
这两个编译器似乎在sizeof(sizeof(T))
是依赖于类型还是依赖于值的表达式上有所不同。如果表达式是依赖的,那么它I<sizeof(sizeof(T))>
就是依赖类型,这意味着typename
应该是必需的。
C++11 标准中的以下措辞涵盖了这一点:
[温度.dep.type]/8
一个类型是依赖的,如果它是
- 一个 simple-template-id,其中模板名称是模板参数或任何模板参数是依赖类型或依赖于类型或值的表达式
[温度.dep.expr]/4
以下形式的表达式从不依赖类型(因为表达式的类型不能依赖):
[temp.dep.constexpr]/2
如果一元表达式或表达式是类型相关的或类型 ID 是相关的,则以下形式的表达式是值相关的:
我的解释是sizeof(T)
永远不能依赖于类型,意思sizeof(sizeof(T))
永远不能依赖于类型或依赖于值。
这是gcc中的错误吗?
c++ - throw 或 delete 表达式可以依赖吗?
gcc 5.0 和 clang 3.6 都需要typename
以下示例中的关键字:
C++11 标准中的以下措辞涵盖了这一点:
[除外]/2
throw 表达式的类型为 void。
[expr.delete]/1
操作数应具有指向对象类型的指针,或具有指向对象类型指针的单个非显式转换函数的类类型。结果类型为 void。
所以我假设在这两种情况下都会decltype
产生void
。
[expr.const]/2
条件表达式是核心常量表达式,除非它涉及以下之一作为潜在评估的子表达式
新表达
抛出表达式
这表明包含throw
或delete
不能是常量表达式的表达式。
[温度.dep.type]/8
一个类型是依赖的,如果它是
一个 simple-template-id,其中模板名称是模板参数或任何模板参数是依赖类型或依赖于类型或值的表达式
由 表示
decltype(expression)
,其中表达式依赖于类型
仅当表达式依赖于类型时, SoB<decltype(..)>
才依赖。
[温度.dep.expr]/4
以下形式的表达式从不依赖类型(因为表达式的类型不能依赖):
这表明两个表达式都不能依赖于类型。
gcc 和 clang 都错了吗?
c++ - 具有单个非类型模板形参实参的函数调用表达式是否依赖于类型?
typename
在以下示例中,clang 3.6 和 gcc 5.0 都需要:
C++11 标准中的以下措辞涵盖了这一点:
[温度.dep.type]/5
一个名字是一个未知专业化的成员,如果它是
- 一个限定 ID,其中嵌套名称说明符命名了一个不是当前实例化的依赖类型。
[温度.dep.type]/8
一个类型是依赖的,如果它是
未知专业的成员,
一个 simple-template-id,其中模板名称是模板参数或任何模板参数是依赖类型或依赖于类型或值的表达式
由 表示
decltype(expression)
,其中表达式依赖于类型
这表明B<decltype(f(n))>::Type
仅当依赖于B<decltype(f(n))>
类型时才依赖于类型。同样,B<decltype(f(n))>
仅当依赖于f(n)
类型时才依赖。
[temp.dep.expr]/1
除非下面描述,如果任何子表达式是类型相关的,则表达式是类型相关的。
[temp.dep.expr]/3
一个 id 表达式是依赖于类型的,如果它包含
一个标识符,通过名称查找与使用依赖类型声明的一个或多个声明相关联,
一个依赖的模板ID,
指定依赖类型的转换函数 ID,或
命名未知专业化成员的嵌套名称说明符或限定 ID;
或者,如果它为某些 T 命名当前实例化的具有类型“T 的未知边界数组”的静态数据成员
这表明f(n)
仅当依赖于类型时才依赖n
于类型,而不依赖于类型。n
我错过了什么,或者这是一个编译器错误?
c++ - C++ - “最重要的常量”不适用于表达式?
根据 Herb Sutter 的文章http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/,以下代码是正确的:
即生命周期v
延长到v
常量引用的生命周期。事实上,根据 valgrind,这可以很好地使用 gcc 和 clang 编译并且运行时没有泄漏。
但是,当我这样更改main
功能时:
它仍然可以编译,但 valgrind 警告我在函数的第二行中读取无效,因为内存在第一行中被释放。
这是符合标准的行为还是可能是 g++ (4.7.2) 和 clang (3.5.0-1~exp1) 中的错误?
如果它符合标准,那对我来说似乎很奇怪......哦,好吧。
swift - Swift @autoclosure 评估受类型注释影响?(编译器错误?)
我今天又玩了 Swift,需要一个undefined()
函数。基本上是一个函数,可以是您想要的任何类型,但在实际运行/评估时会崩溃。如果您还没有时间实现某个表达式但想查看程序类型是否检查,这将非常有用。
我还实现了一个Result<T>
和一个(有问题的)函数,如果不成功则chain
返回 left ,否则返回 right 。因此,签名是。我将右边定义为因为如果左边是失败的,则不需要评估它。Result<>
Result<>
chain<L,R>(l : Result<L>, r : @autoclosure () -> Result<R>) -> Result<R>
Result<>
@autoclosure
我对其中任何一个的有用性(或改进)不感兴趣,我只是对为什么我的程序在标记的行中崩溃感兴趣[L3]
。
请注意
- 正如预期的那样
[L1]
工作正常(||
被懒惰评估) [L2]
工作正常(chain
在正确的论点中也很懒惰)
但是,奇怪的是
[L3]
使评估程序崩溃undefined()
根据我的理解,L2 和 L3 在运行时应该是等价的:L3 只是告诉类型检查器它已经知道的东西......如果你将类型更改undefined
为() -> Result<T>
(而不是() -> T
),同样的效果也会发生,那么它甚至都可以工作没有as Result<String>
.
这是我的所有代码:
信不信由你,程序的输出是:
这不可能!为什么as Result<String>
(这是 L2 和 L3 之间的唯一区别)会改变程序的输出?这应该完全在类型检查器中处理,这意味着在编译时,不是吗?编译器错误?
您重现此问题的最快方法应该是:
- 将我所有的代码复制到剪贴板
cd /tmp
pbpaste > main.swift
xcrun -sdk macosx swiftc main.swift
./main
实际输出:
预期输出:
templates - gcc/g++ 内部错误(c++ 模板化 lambda)
我刚刚对我的程序进行了一些更改,突然 g++ 抱怨内部编译器错误。
然而,Clang 编译它没有任何问题,也没有给出任何警告,这表明任何奇怪的事情。
我将问题归结为:
我尝试了 GCC 4.9.2 和 4.8.4,但都失败了(内部编译器错误)。
我使用的标志:
g++ -std=c++11 -O0 -g -Wall main.cpp -o gccBin
clang++ -std=c++11 -O0 -g -Wall main.cpp -o clangBin
正如我所提到的,Clang++(3.5.1) 可以毫无问题地编译它。我还尝试了多台机器,到处都一样。
我忽略了某种错误吗?我在互联网上搜索了一下,我能找到的唯一类似问题现在应该已经修复(如 bugtracker 所述)。
也许有人可以尝试在他们的机器上运行此代码或提供其他建议?
谢谢,
拉撒路
swift - Swift EXC_BAD_INSTRUCTION on call to typealias / typed / defined closure w/o compiler error or warning
给定一个结构、一个类和类型化闭包:
以下代码崩溃EXC_BAD_INSTRUCTION
:
projectile
调试器显示和的两个不同值ball
。mass
中的字段projectile
无效。然而,对封闭的内部和外部都mass
有效。ball
没有编译器错误或警告但在执行EXC_BAD_INSTRUCTION
时抛出projectile.mass
?
ForceComputation
尽管有误导性的调试数据,但问题与闭包的参数无关。问题是返回的结构在以下定义为可选typealias
:
但是使用非可选的返回类型构造(注意缺少?
after Vector3d
):
更改上面的代码以删除输入:
将修复代码或确保返回类型是可选的(注意?
后面Vector3d
):
也将使这项工作。我的问题是,如果这是一个编译器错误,是否应该报告给 Apple,或者EXC_BAD_INSTRUCTION
抛出代码是否应该编译?