1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
|
/// 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: NormalProto> = T.Assoc
@inlinable func testConformanceInTypealias() {
let x: NormalProtoAssoc<NormalStruct>? = nil // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}}
_ = x
_ = NormalProtoAssoc<NormalStruct>() // 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<NormalStruct>? = nil
_ = x
_ = NormalProtoAssoc<NormalStruct>()
}
func internalConformanceInTypealias() {
let x: NormalProtoAssoc<NormalStruct>? = nil // okay
_ = x
_ = NormalProtoAssoc<NormalStruct>() // okay
}
public struct NormalProtoAssocHolder<T: NormalProto> {
public var value: T.Assoc?
public init() {}
public init(_ value: T?) {}
}
@inlinable func testConformanceInBoundGeneric() {
let x: NormalProtoAssocHolder<NormalStruct>? = 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<NormalStruct>() // 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<NormalStruct>? = nil
_ = x
_ = NormalProtoAssocHolder<NormalStruct>()
_ = NormalProtoAssocHolder(nil as NormalStruct?)
}
func internalConformanceInBoundGeneric() {
let x: NormalProtoAssocHolder<NormalStruct>? = nil // okay
_ = x
_ = NormalProtoAssocHolder<NormalStruct>() // okay
_ = NormalProtoAssocHolder(nil as NormalStruct?) // okay
}
@inlinable func testDowncast(_ x: Any) -> Bool {
let normal = x is NormalProtoAssocHolder<NormalStruct> // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}}
let alias = x is NormalProtoAssoc<NormalStruct> // 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<NormalStruct>
let alias = x is NormalProtoAssoc<NormalStruct>
return normal || alias
}
func internalDowncast(_ x: Any) -> Bool {
let normal = x is NormalProtoAssocHolder<NormalStruct> // okay
let alias = x is NormalProtoAssoc<NormalStruct> // okay
return normal || alias
}
@inlinable func testSwitch(_ x: Any) {
switch x {
case let holder as NormalProtoAssocHolder<NormalStruct>: // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}}
_ = holder
break
case is NormalProtoAssoc<NormalStruct>: // 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<NormalStruct>:
_ = holder
break
case is NormalProtoAssoc<NormalStruct>:
break
default:
break
}
}
func internalSwitch(_ x: Any) {
switch x {
case let holder as NormalProtoAssocHolder<NormalStruct>: // okay
_ = holder
break
case is NormalProtoAssoc<NormalStruct>: // okay
break
default:
break
}
}
public enum NormalProtoEnumUser<T: NormalProto> {
case a
}
@inlinable func testEnum() {
// FIXME: We get this error twice: once for the pattern and once for the implicit TypeExpr.
let x: NormalProtoEnumUser<NormalStruct> = .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<NormalStruct>.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<NormalStruct> = .a
_ = x
_ = NormalProtoEnumUser<NormalStruct>.a
}
func internalEnum() {
let x: NormalProtoEnumUser<NormalStruct> = .a // okay
_ = x
_ = NormalProtoEnumUser<NormalStruct>.a // okay
}
@usableFromInline func testFuncImpl<T: NormalProto>(_: 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: NormalProto>(_: T.Type) {}
public subscript<T: NormalProto>(_: T.Type) -> Int {
get { return 0 }
set {}
}
public func method<T: NormalProto>(_: 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: NormalProto>(_: U.Type) {}
}
@inlinable func testMultipleConformances() {
NormalProtoAssocHolder<NormalStruct>.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<NormalStruct>.testAnotherConformance(NormalClass.self)
}
@inlinable func localTypeAlias() {
typealias LocalUser = NormalProtoAssocHolder<NormalStruct> // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}}
typealias LocalGenericUser<T> = (T, NormalProtoAssocHolder<NormalStruct>) // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}}
typealias LocalProtoAssoc<T: NormalProto> = T.Assoc
_ = LocalProtoAssoc<NormalStruct>() // 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<NormalStruct>
typealias LocalGenericUser<T> = (T, NormalProtoAssocHolder<NormalStruct>)
typealias LocalProtoAssoc<T: NormalProto> = T.Assoc
_ = LocalProtoAssoc<NormalStruct>()
}
@inlinable func localFunctions() {
func local(_: NormalProtoAssocHolder<NormalStruct>) {} // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}}
func localReturn() -> NormalProtoAssocHolder<NormalStruct> { fatalError() } // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}}
let _ = { (_: NormalProtoAssocHolder<NormalStruct>) in return } // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}}
let _ = { () -> NormalProtoAssocHolder<NormalStruct> 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<NormalStruct>) {}
func localReturn() -> NormalProtoAssocHolder<NormalStruct> { fatalError() }
let _ = { (_: NormalProtoAssocHolder<NormalStruct>) in return }
let _ = { () -> NormalProtoAssocHolder<NormalStruct> in fatalError() }
}
@inlinable public func signatureOfInlinable(_: NormalProtoAssocHolder<NormalStruct>) {} // expected-error{{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}}
public func testDefaultArgument(_: Int = NormalProtoAssoc<NormalStruct>()) {} // expected-error {{cannot use conformance of 'NormalStruct' to 'NormalProto' here; the conformance is declared as SPI}}
@_spi(AcceptInSPI)
@inlinable public func SPIsignatureOfInlinable(_: NormalProtoAssocHolder<NormalStruct>) {}
@_spi(AcceptInSPI)
public func SPItestDefaultArgument(_: Int = NormalProtoAssoc<NormalStruct>()) {}
public class SubclassOfNormalClass: NormalClass {}
@inlinable public func testInheritedConformance() {
_ = NormalProtoAssocHolder<SubclassOfNormalClass>.self // expected-error {{cannot use conformance of 'NormalClass' to 'NormalProto' here; the conformance is declared as SPI}}
}
@inlinable public func testSpecializedConformance() {
_ = NormalProtoAssocHolder<GenericStruct<Int>>.self // expected-error {{cannot use conformance of 'GenericStruct<T>' to 'NormalProto' here; the conformance is declared as SPI}}
}
@_spi(AcceptInSPI)
@inlinable public func SPItestInheritedConformance() {
_ = NormalProtoAssocHolder<SubclassOfNormalClass>.self
}
@_spi(AcceptInSPI)
@inlinable public func SPItestSpecializedConformance() {
_ = NormalProtoAssocHolder<GenericStruct<Int>>.self
}
|