mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
If a conformance is defined in an extension, we now look for references to the conformance in types and expressions and respect's the extension's availability (or deprecation, etc). The conformance checker itself still needs to check conformance availability of associated conformances and the like; that will be a separate change. Note that conformances defined on types don't require any special handling, since they are as available as the intersection of the conforming type and the protocol. By default, we diagnose conformance availability violations where the OS version is not sufficiently new as warnings, to avoid breaking source compatibility. Stricter behavior where these violations are diagnosed as errors is enabled by passing the -enable-conformance-availability-errors flag. There are test cases that run both with and without this flag. In the future, we hope to make the stricter behavior the default, since after all, violations here can result in link errors and runtime crashes. Uses of completely unavailable conformances are still always diagnosed as errors, even when this flag is not passed in. Progress on <rdar://problem/35158274>.
41 lines
1.5 KiB
Swift
41 lines
1.5 KiB
Swift
// RUN: %target-typecheck-verify-swift -swift-version 5
|
|
|
|
// REQUIRES: OS=macosx
|
|
|
|
public protocol Horse {}
|
|
func takesHorse<T : Horse>(_: T) {}
|
|
|
|
extension Horse {
|
|
func giddyUp() {}
|
|
}
|
|
|
|
struct UsesHorse<T : Horse> {}
|
|
|
|
// Availability with version
|
|
public struct HasAvailableConformance1 {}
|
|
|
|
@available(macOS 100, *)
|
|
extension HasAvailableConformance1 : Horse {}
|
|
|
|
// These availability violations are warnings because this test does not
|
|
// pass the -enable-conformance-availability-errors flag. See the other
|
|
// test case in test/Sema/conformance_availability.swift for the same
|
|
// example but with this flag.
|
|
|
|
func passAvailableConformance1(x: HasAvailableConformance1) { // expected-note 3{{add @available attribute to enclosing global function}}
|
|
takesHorse(x) // expected-warning {{conformance of 'HasAvailableConformance1' to 'Horse' is only available in macOS 100 or newer}}
|
|
// expected-note@-1 {{add 'if #available' version check}}
|
|
|
|
x.giddyUp() // expected-warning {{conformance of 'HasAvailableConformance1' to 'Horse' is only available in macOS 100 or newer}}
|
|
// expected-note@-1 {{add 'if #available' version check}}
|
|
|
|
_ = UsesHorse<HasAvailableConformance1>.self // expected-warning {{conformance of 'HasAvailableConformance1' to 'Horse' is only available in macOS 100 or newer}}
|
|
// expected-note@-1 {{add 'if #available' version check}}
|
|
}
|
|
|
|
@available(macOS 100, *)
|
|
func passAvailableConformance1a(x: HasAvailableConformance1) {
|
|
takesHorse(x)
|
|
x.giddyUp()
|
|
_ = UsesHorse<HasAvailableConformance1>.self
|
|
} |