【发布时间】:2014-07-25 20:19:46
【问题描述】:
在尝试处理一个小型 Swift 项目时,我经常遇到以下编译器错误:
var item : T?
^
LLVM ERROR: unimplemented IRGen feature! non-fixed class layout
产生这种错误的代码非常简单:
class Foo<T> {
var item : T?
}
有趣的是,如果您从 class 更改为 struct,一切都可以正常编译。
其他人可以验证这一点,所以我可以回头把它归咎于一个尚未完成的编译器,而不是我的编译器工具链中的一些奇怪的混淆?
更新:
试图用以下替代实现来超越明显有缺陷的编译器会导致更可笑的编译器错误。比如下面的
class Foo<T> {
// Let's try with an inner struct
struct OptionalWrapper {
var item: T?
}
var item : OptionalWrapper
init(item: T?) { self.item = OptionalWrapper(item: item) }
}
给予
0 swift 0x000000011075a608 llvm::sys::PrintStackTrace(__sFILE*) + 40
1 swift 0x000000011075aaf4 SignalHandler(int) + 452
2 libsystem_platform.dylib 0x00007fff901095aa _sigtramp + 26
3 libsystem_platform.dylib 0x0000000111b5ba00 _sigtramp + 2175083632
4 swift 0x0000000110a54a67 swift::BoundGenericType::getSubstitutions(swift::Module*, swift::LazyResolver*) + 55
5 swift 0x000000010fb696a9 emitNominalMetadataRef(swift::irgen::IRGenFunction&, swift::NominalTypeDecl*, swift::CanType) + 537
6 swift 0x000000010fb5841c llvm::Value* swift::CanTypeVisitor<(anonymous namespace)::EmitTypeMetadataRef, llvm::Value*>::visit<>(swift::CanType) + 124
7 swift 0x000000010fb58395 swift::irgen::IRGenFunction::emitTypeMetadataRef(swift::CanType) + 21
8 swift 0x000000010fb9b7e9 swift::irgen::WitnessSizedTypeInfo<(anonymous namespace)::NonFixedStructTypeInfo>::allocateStack(swift::irgen::IRGenFunction&, swift::CanType, llvm::Twine const&) const + 89
9 swift 0x000000010fbc81a2 swift::SILVisitor<(anonymous namespace)::IRGenSILFunction, void>::visit(swift::ValueBase*) + 34626
10 swift 0x000000010fbbf266 swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 8678
11 swift 0x000000010fb406f8 swift::irgen::IRGenModule::emitGlobalTopLevel() + 184
12 swift 0x000000010fbac6e3 performIRGeneration(swift::IRGenOptions&, swift::Module*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 1859
13 swift 0x000000010fbad033 swift::performIRGeneration(swift::IRGenOptions&, swift::SourceFile&, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, unsigned int) + 51
14 swift 0x000000010fb1f65a frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 4842
15 swift 0x000000010fb1e35d main + 1533
16 libdyld.dylib 0x00007fff8b2d05fd start + 1
17 libdyld.dylib 0x0000000000000040 start + 1959983684
将 struct OptionalWrapper 更改为 struct OptionalWrapper<T> 甚至会使 swift 编译器似乎陷入无限循环(例如,您仍然可以使用 XCode 中的停止按钮取消它)。
所以我目前的建议是:暂时不要在classes 中使用 Swift 泛型,这似乎是非常不稳定的地形……
【问题讨论】:
-
在我看来是个错误
-
另外,将
class Foo<T>更改为class Foo<T:NSObject>阻止了操场对我的崩溃,并允许我使用NSString构造泛型 -
我们现在是 Swift 3.0,很遗憾地报告泛型仍处于令人震惊的状态;如果您收到编译器不喜欢的错误消息,您很幸运,通常它只是 SegFault 11。差。
标签: generics compiler-errors swift xcode6