Files
swift-mirror/test/Interpreter/enum_unavailable_cases.swift
Allan Shortlidge ce97377218 IRGen: Exclude unavailable enum cases from runtime layout calculations.
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
2023-05-22 21:49:41 -07:00

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)