/// SPI variant of implementation-only-inlinable-conformances with the "Bad" /// declarations defined as local SPI. Also check that SPI conformances /// can be used within inlinable SPI decls. // RUN: %empty-directory(%t) // RUN: %target-swift-frontend -emit-module -o %t/NormalLibrary.swiftmodule %S/Inputs/implementation-only-import-in-decls-public-helper.swift // RUN: %target-typecheck-verify-swift -I %t import NormalLibrary @_spi(X) extension NormalStruct: @retroactive NormalProto { public typealias Assoc = Int } @_spi(X) extension GenericStruct: @retroactive NormalProto { public typealias Assoc = Int } @_spi(X) extension NormalClass: @retroactive NormalProto { public typealias Assoc = Int } @_spi(X) public struct BadStruct {} @_spi(X) public protocol BadProto {} @_spi(X) open class BadClass {} @_spi(X) public struct IntLike: ExpressibleByIntegerLiteral, Equatable { public init(integerLiteral: Int) {} } @available(*, unavailable) public typealias X = Int public typealias NormalProtoAssoc = T.Assoc @inlinable func testConformanceInTypealias() { let x: NormalProtoAssoc? = nil // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} _ = x _ = NormalProtoAssoc() // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} } @_spi(AcceptInSPI) @inlinable public func SPItestConformanceInTypealias() { let x: NormalProtoAssoc? = nil _ = x _ = NormalProtoAssoc() } func internalConformanceInTypealias() { let x: NormalProtoAssoc? = nil // okay _ = x _ = NormalProtoAssoc() // okay } public struct NormalProtoAssocHolder { public var value: T.Assoc? public init() {} public init(_ value: T?) {} } @inlinable func testConformanceInBoundGeneric() { let x: NormalProtoAssocHolder? = nil // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} _ = x // FIXME: We get this error twice: once for the TypeExpr and once for the implicit init. _ = NormalProtoAssocHolder() // expected-error 2 {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} _ = NormalProtoAssocHolder(nil as NormalStruct?) // expected-error 2{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} } @_spi(AcceptInSPI) @inlinable public func SPItestConformanceInBoundGeneric() { let x: NormalProtoAssocHolder? = nil _ = x _ = NormalProtoAssocHolder() _ = NormalProtoAssocHolder(nil as NormalStruct?) } func internalConformanceInBoundGeneric() { let x: NormalProtoAssocHolder? = nil // okay _ = x _ = NormalProtoAssocHolder() // okay _ = NormalProtoAssocHolder(nil as NormalStruct?) // okay } @inlinable func testDowncast(_ x: Any) -> Bool { let normal = x is NormalProtoAssocHolder // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} let alias = x is NormalProtoAssoc // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} return normal || alias } @_spi(AcceptInSPI) @inlinable public func SPItestDowncast(_ x: Any) -> Bool { let normal = x is NormalProtoAssocHolder let alias = x is NormalProtoAssoc return normal || alias } func internalDowncast(_ x: Any) -> Bool { let normal = x is NormalProtoAssocHolder // okay let alias = x is NormalProtoAssoc // okay return normal || alias } @inlinable func testSwitch(_ x: Any) { switch x { case let holder as NormalProtoAssocHolder: // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} _ = holder break case is NormalProtoAssoc: // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} break default: break } } @_spi(AcceptInSPI) @inlinable public func SPItestSwitch(_ x: Any) { switch x { case let holder as NormalProtoAssocHolder: _ = holder break case is NormalProtoAssoc: break default: break } } func internalSwitch(_ x: Any) { switch x { case let holder as NormalProtoAssocHolder: // okay _ = holder break case is NormalProtoAssoc: // okay break default: break } } public enum NormalProtoEnumUser { case a } @inlinable func testEnum() { // FIXME: We get this error twice: once for the pattern and once for the implicit TypeExpr. let x: NormalProtoEnumUser = .a // expected-error 2 {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} _ = x // FIXME: We get this error twice: once for the TypeExpr and once for the case. _ = NormalProtoEnumUser.a // expected-error 2 {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} } @_spi(AcceptInSPI) @inlinable public func SPItestEnum() { let x: NormalProtoEnumUser = .a _ = x _ = NormalProtoEnumUser.a } func internalEnum() { let x: NormalProtoEnumUser = .a // okay _ = x _ = NormalProtoEnumUser.a // okay } @usableFromInline func testFuncImpl(_: T.Type) {} @inlinable func testFunc() { testFuncImpl(NormalStruct.self) // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} } @_spi(AcceptInSPI) @inlinable public func SPItestFunc() { testFuncImpl(NormalStruct.self) } func internalFunc() { testFuncImpl(NormalStruct.self) // okay } public struct ForTestingMembers { public init() {} public init(_: T.Type) {} public subscript(_: T.Type) -> Int { get { return 0 } set {} } public func method(_: T.Type) {} } @inlinable func testMembers() { _ = ForTestingMembers(NormalStruct.self) // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} _ = ForTestingMembers.init(NormalStruct.self) // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} _ = ForTestingMembers()[NormalStruct.self] // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} var instance = ForTestingMembers() instance[NormalStruct.self] = 1 // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} ForTestingMembers().method(NormalStruct.self) // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} } @_spi(AcceptInSPI) @inlinable public func SPItestMembers() { _ = ForTestingMembers(NormalStruct.self) _ = ForTestingMembers.init(NormalStruct.self) _ = ForTestingMembers()[NormalStruct.self] var instance = ForTestingMembers() instance[NormalStruct.self] = 1 ForTestingMembers().method(NormalStruct.self) } extension NormalProtoAssocHolder { public static func testAnotherConformance(_: U.Type) {} } @inlinable func testMultipleConformances() { NormalProtoAssocHolder.testAnotherConformance(NormalClass.self) // expected-error@-1 2 {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} // expected-error@-2 {{cannot use conformance of 'NormalClass' to 'NormalProto' here; the conformance is declared as SPI}} } @_spi(AcceptInSPI) @inlinable public func SPItestMultipleConformances() { NormalProtoAssocHolder.testAnotherConformance(NormalClass.self) } @inlinable func localTypeAlias() { typealias LocalUser = NormalProtoAssocHolder // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} typealias LocalGenericUser = (T, NormalProtoAssocHolder) // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} typealias LocalProtoAssoc = T.Assoc _ = LocalProtoAssoc() // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} } @_spi(AcceptInSPI) @inlinable public func SPIlocalTypeAlias() { typealias LocalUser = NormalProtoAssocHolder typealias LocalGenericUser = (T, NormalProtoAssocHolder) typealias LocalProtoAssoc = T.Assoc _ = LocalProtoAssoc() } @inlinable func localFunctions() { func local(_: NormalProtoAssocHolder) {} // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} func localReturn() -> NormalProtoAssocHolder { fatalError() } // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} let _ = { (_: NormalProtoAssocHolder) in return } // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} let _ = { () -> NormalProtoAssocHolder in fatalError() } // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} } @_spi(AcceptInSPI) @inlinable public func SPIlocalFunctions() { func local(_: NormalProtoAssocHolder) {} func localReturn() -> NormalProtoAssocHolder { fatalError() } let _ = { (_: NormalProtoAssocHolder) in return } let _ = { () -> NormalProtoAssocHolder in fatalError() } } @inlinable public func signatureOfInlinable(_: NormalProtoAssocHolder) {} // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} public func testDefaultArgument(_: Int = NormalProtoAssoc()) {} // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}} @_spi(AcceptInSPI) @inlinable public func SPIsignatureOfInlinable(_: NormalProtoAssocHolder) {} @_spi(AcceptInSPI) public func SPItestDefaultArgument(_: Int = NormalProtoAssoc()) {} public class SubclassOfNormalClass: NormalClass {} @inlinable public func testInheritedConformance() { _ = NormalProtoAssocHolder.self // expected-error {{cannot use conformance of 'NormalClass' to 'NormalProto' here; the conformance is declared as SPI}} } @inlinable public func testSpecializedConformance() { _ = NormalProtoAssocHolder>.self // expected-error {{cannot use conformance of 'GenericStruct' to 'NormalProto' here; the conformance is declared as SPI}} } @_spi(AcceptInSPI) @inlinable public func SPItestInheritedConformance() { _ = NormalProtoAssocHolder.self } @_spi(AcceptInSPI) @inlinable public func SPItestSpecializedConformance() { _ = NormalProtoAssocHolder>.self }