mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
When `-unavailable-decl-optimization=complete` is specified, exclude unavailable enum cases from the runtime layout of enums with payloads. Without this, the type metadata for unavailable types may be referenced by enum cases with unavailable payloads and cause linker failures. Resolves rdar://107483852
59 lines
1.3 KiB
Swift
59 lines
1.3 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-build-swift %s -Xfrontend -unavailable-decl-optimization=complete -o %t/a.out
|
|
// RUN: %target-codesign %t/a.out
|
|
// RUN: %target-run %t/a.out
|
|
// REQUIRES: executable_test
|
|
|
|
import StdlibUnittest
|
|
|
|
@available(*, unavailable)
|
|
class UnavailableClass {
|
|
var x: UInt8 = 0
|
|
}
|
|
|
|
enum SingletonTrivial {
|
|
@available(*, unavailable)
|
|
case unavailable(UInt8)
|
|
}
|
|
|
|
enum SingletonClass {
|
|
@available(*, unavailable)
|
|
case unavailable(UnavailableClass)
|
|
}
|
|
|
|
enum NoPayload {
|
|
case x
|
|
@available(*, unavailable)
|
|
case unavailable
|
|
case y
|
|
}
|
|
|
|
enum SinglePayloadTrivial {
|
|
case x
|
|
@available(*, unavailable)
|
|
case unavailable(UInt8)
|
|
case y
|
|
}
|
|
|
|
enum MultiPayloadTrivial {
|
|
case x(UInt8)
|
|
@available(*, unavailable)
|
|
case unavailable(UInt8, UInt8)
|
|
case y
|
|
}
|
|
|
|
enum MultiPayloadGeneric<T, U> {
|
|
case x(T)
|
|
@available(*, unavailable)
|
|
case unavailable(T, U)
|
|
case y
|
|
}
|
|
|
|
expectEqual(MemoryLayout<SingletonTrivial>.size, 0)
|
|
expectEqual(MemoryLayout<SingletonClass>.size, 0)
|
|
expectEqual(MemoryLayout<NoPayload>.size, 1)
|
|
expectEqual(MemoryLayout<SinglePayloadTrivial>.size, 1)
|
|
expectEqual(MemoryLayout<MultiPayloadTrivial>.size, 2)
|
|
expectEqual(MemoryLayout<MultiPayloadGeneric<UInt8, UInt8>>.size, 2)
|
|
expectEqual(MemoryLayout<MultiPayloadGeneric<UInt32, UInt32>>.size, 5)
|