Files
swift-mirror/test/attr/require_explicit_availability.swift

175 lines
7.1 KiB
Swift

// Test the -require-explicit-availability flag
// REQUIRES: OS=macosx
// RUN: %swiftc_driver -typecheck -parse-as-library -target %target-cpu-apple-macosx10.10 -Xfrontend -verify -require-explicit-availability -require-explicit-availability-target "macOS 10.10" %s
public struct S { // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}}
public func method() { }
}
public func foo() { bar() } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
@usableFromInline
func bar() { } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
@available(macOS 10.1, *)
public func ok() { }
@available(macOS, unavailable)
public func unavailableOk() { }
@available(macOS, deprecated: 10.10)
public func missingIntro() { } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
@available(iOS 9.0, *)
public func missingTargetPlatform() { } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
func privateFunc() { }
@_alwaysEmitIntoClient
public func alwaysEmitted() { }
@available(macOS 10.1, *)
struct SOk {
public func okMethod() { }
}
precedencegroup MediumPrecedence {}
infix operator + : MediumPrecedence
public func +(lhs: S, rhs: S) -> S { } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
public enum E { } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
public class C { } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
public protocol P { } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
private protocol PrivateProto { }
extension S { // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
public func warnForPublicMembers() { } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{3-3=@available(macOS 10.10, *)\n }}
}
@available(macOS 10.1, *)
extension S {
public func okWhenTheExtensionHasAttribute() { }
}
extension S {
internal func dontWarnWithoutPublicMembers() { }
private func dontWarnWithoutPublicMembers1() { }
}
extension S : P { // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
}
extension S : PrivateProto {
}
open class OpenClass { } // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
private class PrivateClass { }
extension PrivateClass { }
@available(macOS 10.1, *)
public protocol PublicProtocol { }
@available(macOS 10.1, *)
extension S : PublicProtocol { }
@_spi(SPIsAreOK)
public func spiFunc() { }
@_spi(SPIsAreOK)
public struct spiStruct {
public func spiMethod() {}
}
extension spiStruct {
public func spiExtensionMethod() {}
}
public var publicVar = S() // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
@available(macOS 10.10, *)
public var publicVarOk = S()
public var (a, b) = (S(), S()) // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
@available(macOS 10.10, *)
public var (c, d) = (S(), S())
public var _ = S() // expected-error {{global variable declaration does not bind any variables}}
public var implicitGet: S { // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
return S()
}
@available(macOS 10.10, *)
public var implicitGetOk: S {
return S()
}
public var computed: S { // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
get { return S() }
set { }
}
public var computedHalf: S { // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
@available(macOS 10.10, *)
get { return S() }
set { }
}
// FIXME the following warning is not needed.
public var computedOk: S { // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
@available(macOS 10.10, *)
get { return S() }
@available(macOS 10.10, *)
set { }
}
@available(macOS 10.10, *)
public var computedOk1: S {
get { return S() }
set { }
}
public class SomeClass { // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
public init () {}
public subscript(index: String) -> Int {
get { return 42; }
set(newValue) { }
}
}
extension SomeClass { // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{1-1=@available(macOS 10.10, *)\n}}
public convenience init(s : S) {} // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{3-3=@available(macOS 10.10, *)\n }}
@available(macOS 10.10, *)
public convenience init(s : SomeClass) {}
public subscript(index: Int) -> Int { // expected-warning {{public declarations should have an availability attribute when building with -require-explicit-availability}} {{3-3=@available(macOS 10.10, *)\n }}
get { return 42; }
set(newValue) { }
}
@available(macOS 10.10, *)
public subscript(index: S) -> Int {
get { return 42; }
set(newValue) { }
}
}
@available(iOS 13.0, macOS 10.15, watchOS 6.0, tvOS 13.0, macCatalyst 13.0, *)
public struct StructWithImplicitMembers { }
extension StructWithImplicitMembers: Hashable { }
// expected-note @-1 {{add @available attribute to enclosing extension}}
// expected-warning @-2 {{public declarations should have an availability attribute when building with -require-explicit-availability}}
// expected-error @-3 {{'StructWithImplicitMembers' is only available in macOS 10.15 or newer}}