Files
swift-mirror/test/Sema/api-availability-only.swift
2021-12-15 12:42:50 -08:00

157 lines
5.5 KiB
Swift

/// Test that -check-api-availability-only skips what is expected while checking
/// the module API and SPI.
// RUN: %target-typecheck-verify-swift -module-name MyModule -target %target-cpu-apple-macosx10.14 -check-api-availability-only -enable-library-evolution
/// The flag -check-api-availability-only should reject builds going up to IR and further.
// RUN: not %target-build-swift -emit-executable %s -g -o %t -emit-module -Xfrontend -check-api-availability-only 2>&1 | %FileCheck %s
// CHECK: the flag -check-api-availability-only does not support emitting IR
// REQUIRES: OS=macosx
// REQUIRES: CPU=x86_64
@available(macOS 11.0, *)
public protocol NewProto {}
@available(macOS 11.0, *)
public struct NewStruct {
public init() {}
}
@available(macOS 11.0, *)
public func newFunc() {}
// expected-note @+1 {{add @available attribute to enclosing}}
public func apiFunc(s : NewProto) { // expected-error {{'NewProto' is only available in macOS 11.0 or newer}}
let _: NewProto
newFunc()
}
// expected-note @+1 {{add @available attribute to enclosing}}
@usableFromInline func usableFromInline(s : NewProto) { // expected-error {{'NewProto' is only available in macOS 11.0 or newer}}
let _: NewProto
newFunc()
}
// expected-note @+1 6 {{add @available attribute to enclosing}}
@inlinable func inlinable(s : NewProto) { // expected-error {{'NewProto' is only available in macOS 11.0 or newer}}
// expected-note @+1 {{add 'if #available' version check}}
let _: NewProto // expected-error {{'NewProto' is only available in macOS 11.0 or newer}}
// expected-note @+1 {{add 'if #available' version check}}
newFunc() // expected-error {{'newFunc()' is only available in macOS 11.0 or newer}}
// expected-note @+1 {{add 'if #available' version check}}
let _ = NewStruct() // expected-error {{'NewStruct' is only available in macOS 11.0 or newer}}
// expected-note @+2 {{add 'if #available' version check}}
// expected-warning @+1 {{initialization of immutable value 'a' was never used}}
let a = NewStruct() // expected-error {{'NewStruct' is only available in macOS 11.0 or newer}}
// expected-note @+2 {{add 'if #available' version check}}
// expected-warning @+1 {{result of 'NewStruct' initializer is unused}}
NewStruct() // expected-error {{'NewStruct' is only available in macOS 11.0 or newer}}
}
// expected-note @+1 {{add @available attribute to enclosing}}
@_spi(SomeSPI) public func spiFunc(s : NewProto) { // expected-error {{'NewProto' is only available in macOS 11.0 or newer}}
let _: NewProto
newFunc()
}
func internalFunc(s : NewProto) {
let _: NewProto
newFunc()
}
private func privateFunc(s : NewProto) {
let _: NewProto
newFunc()
}
fileprivate func fileprivateFunc(s : NewProto) {
let _: NewProto
newFunc()
}
// expected-note @+1 8 {{add @available attribute to enclosing struct}}
public struct Struct {
public var publicVar: NewProto // expected-error {{'NewProto' is only available in macOS 11.0 or newer}}
internal var internalVar: NewProto
private var privateVar: NewProto
fileprivate var fileprivateVar: NewProto
public var publicAssigned = NewStruct() // expected-error {{'NewStruct' is only available in macOS 11.0 or newer}}
internal var internalAssigned = NewStruct()
private var privateAssigned = NewStruct()
fileprivate var fileprivateAssigned = NewStruct()
// expected-note @+1 {{add @available attribute to enclosing}}
public typealias PubTA = NewProto // expected-error {{'NewProto' is only available in macOS 11.0 or newer}}
private typealias PrivateTA = NewProto
// expected-note @+1 {{add @available attribute to enclosing}}
public func apiFunc(s : NewProto) { // expected-error {{'NewProto' is only available in macOS 11.0 or newer}}
let _: NewProto
newFunc()
}
// expected-note @+1 {{add @available attribute to enclosing}}
@usableFromInline func usableFromInline(s : NewProto) { // expected-error {{'NewProto' is only available in macOS 11.0 or newer}}
let _: NewProto
newFunc()
}
// expected-note @+1 3 {{add @available attribute to enclosing}}
@inlinable func inlinable(s : NewProto) { // expected-error {{'NewProto' is only available in macOS 11.0 or newer}}
// expected-note @+1 {{add 'if #available' version check}}
let _: NewProto // expected-error {{'NewProto' is only available in macOS 11.0 or newer}}
// expected-note @+1 {{add 'if #available' version check}}
newFunc() // expected-error {{'newFunc()' is only available in macOS 11.0 or newer}}
}
func internalFunc(s : NewProto) {
let _: NewProto
newFunc()
}
private func privateFunc(s : NewProto) {
let _: NewProto
newFunc()
}
fileprivate func fileprivateFunc(s : NewProto) {
let _: NewProto
newFunc()
}
}
// expected-note @+1 {{add @available attribute to enclosing}}
extension NewProto { // expected-error {{'NewProto' is only available in macOS 11.0 or newer}}
public func foo() {}
}
func asyncFunc() async -> Bool {
fatalError()
}
// expected-note @+1 {{add @available attribute to enclosing}}
public func publicAsyncFunc() async -> Bool { // expected-error {{concurrency is only available in macOS 10.15.0 or newer}}
fatalError()
}
// expected-note @+1 {{add @available attribute to enclosing}}
@usableFromInline func usableFromInlineAsyncFunc() async -> Bool { // expected-error {{concurrency is only available in macOS 10.15.0 or newer}}
fatalError()
}
actor InternalActor {
}
// expected-note @+1 {{add @available attribute to enclosing}}
public actor PublicActor { // expected-error {{concurrency is only available in macOS 10.15.0 or newer}}
}