mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
When deriving `Hashable` and `Equatable` for enums, use `Decl::isUnreachableAtRuntime()` to determine whether or not to insert `_diagnoseUnavailableCodeReached()` traps for specific enum elements. This fixes a bug where inappropriate traps were inserted for enum elements that are unavailable for app extensions. It also fixes a bug where traps were inserted when building a zippered library for macOS and enum elements were unavailable on macOS but not for macCatalyst clients. Resolves rdar://125371621
97 lines
4.3 KiB
Swift
97 lines
4.3 KiB
Swift
// RUN: %target-swift-frontend -print-ast %s | %FileCheck %s --check-prefixes=CHECK,CHECK-PRE-SWIFT5_9
|
|
// RUN: %target-swift-frontend -application-extension -print-ast %s | %FileCheck %s --check-prefixes=CHECK,CHECK-PRE-SWIFT5_9
|
|
// RUN: %target-swift-frontend -target %target-cpu-apple-macosx10.51 -print-ast %s | %FileCheck %s --check-prefixes=CHECK,CHECK-PRE-SWIFT5_9
|
|
// RUN: %target-swift-frontend -target %target-cpu-apple-macosx14 -print-ast %s | %FileCheck %s --check-prefixes=CHECK,CHECK-SWIFT5_9
|
|
// REQUIRES: OS=macosx
|
|
|
|
// CHECK-LABEL: internal enum HasElementsWithAvailability : Hashable
|
|
enum HasElementsWithAvailability: Hashable {
|
|
// CHECK: case alwaysAvailable
|
|
case alwaysAvailable
|
|
// CHECK: @available(*, unavailable)
|
|
// CHECK-NEXT: case neverAvailable
|
|
@available(*, unavailable)
|
|
case neverAvailable
|
|
// CHECK: @available(macOS, unavailable)
|
|
// CHECK-NEXT: case unavailableMacOS
|
|
@available(macOS, unavailable)
|
|
case unavailableMacOS
|
|
// CHECK: @available(macOS, obsoleted: 10.50)
|
|
// CHECK-NEXT: case obsoleted10_50
|
|
@available(macOS, obsoleted: 10.50)
|
|
case obsoleted10_50
|
|
// CHECK: @available(macOS 10.50, *)
|
|
// CHECK-NEXT: case introduced10_50
|
|
@available(macOS, introduced: 10.50)
|
|
case introduced10_50
|
|
// CHECK: @available(macOSApplicationExtension, unavailable)
|
|
// CHECK-NEXT: case unavailableMacOSAppExtension
|
|
@available(macOSApplicationExtension, unavailable)
|
|
case unavailableMacOSAppExtension
|
|
|
|
// CHECK: @_implements(Equatable, ==(_:_:)) internal static func __derived_enum_equals(_ a: HasElementsWithAvailability, _ b: HasElementsWithAvailability) -> Bool {
|
|
// CHECK-NEXT: var index_a: Int
|
|
// CHECK-NEXT: switch a {
|
|
// CHECK-NEXT: case .alwaysAvailable:
|
|
// CHECK-NEXT: index_a = 0
|
|
// CHECK-NEXT: case .neverAvailable:
|
|
// CHECK-PRE-SWIFT5_9-NEXT: _diagnoseUnavailableCodeReached_aeic()
|
|
// CHECK-SWIFT5_9-NEXT: _diagnoseUnavailableCodeReached()
|
|
// CHECK-NEXT: case .unavailableMacOS:
|
|
// CHECK-PRE-SWIFT5_9-NEXT: _diagnoseUnavailableCodeReached_aeic()
|
|
// CHECK-SWIFT5_9-NEXT: _diagnoseUnavailableCodeReached()
|
|
// CHECK-NEXT: case .obsoleted10_50:
|
|
// CHECK-NEXT: index_a = 1
|
|
// CHECK-NEXT: case .introduced10_50:
|
|
// CHECK-NEXT: index_a = 2
|
|
// CHECK-NEXT: case .unavailableMacOSAppExtension:
|
|
// CHECK-NEXT: index_a = 3
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: var index_b: Int
|
|
// CHECK-NEXT: switch b {
|
|
// CHECK-NEXT: case .alwaysAvailable:
|
|
// CHECK-NEXT: index_b = 0
|
|
// CHECK-NEXT: case .neverAvailable:
|
|
// CHECK-PRE-SWIFT5_9-NEXT: _diagnoseUnavailableCodeReached_aeic()
|
|
// CHECK-SWIFT5_9-NEXT: _diagnoseUnavailableCodeReached()
|
|
// CHECK-NEXT: case .unavailableMacOS:
|
|
// CHECK-PRE-SWIFT5_9-NEXT: _diagnoseUnavailableCodeReached_aeic()
|
|
// CHECK-SWIFT5_9-NEXT: _diagnoseUnavailableCodeReached()
|
|
// CHECK-NEXT: case .obsoleted10_50:
|
|
// CHECK-NEXT: index_b = 1
|
|
// CHECK-NEXT: case .introduced10_50:
|
|
// CHECK-NEXT: index_b = 2
|
|
// CHECK-NEXT: case .unavailableMacOSAppExtension:
|
|
// CHECK-NEXT: index_b = 3
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: return index_a == index_b
|
|
// CHECK-NEXT: }
|
|
|
|
// CHECK: internal func hash(into hasher: inout Hasher) {
|
|
// CHECK-NEXT: var discriminator: Int
|
|
// CHECK-NEXT: switch self {
|
|
// CHECK-NEXT: case .alwaysAvailable:
|
|
// CHECK-NEXT: discriminator = 0
|
|
// CHECK-NEXT: case .neverAvailable:
|
|
// CHECK-PRE-SWIFT5_9-NEXT: _diagnoseUnavailableCodeReached_aeic()
|
|
// CHECK-SWIFT5_9-NEXT: _diagnoseUnavailableCodeReached()
|
|
// CHECK-NEXT: case .unavailableMacOS:
|
|
// CHECK-PRE-SWIFT5_9-NEXT: _diagnoseUnavailableCodeReached_aeic()
|
|
// CHECK-SWIFT5_9-NEXT: _diagnoseUnavailableCodeReached()
|
|
// CHECK-NEXT: case .obsoleted10_50:
|
|
// CHECK-NEXT: discriminator = 1
|
|
// CHECK-NEXT: case .introduced10_50:
|
|
// CHECK-NEXT: discriminator = 2
|
|
// CHECK-NEXT: case .unavailableMacOSAppExtension:
|
|
// CHECK-NEXT: discriminator = 3
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: hasher.combine(discriminator)
|
|
// CHECK-NEXT: }
|
|
|
|
// CHECK: internal var hashValue: Int {
|
|
// CHECK-NEXT: get {
|
|
// CHECK-NEXT: return _hashValue(for: self)
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: }
|
|
}
|