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
|
// RUN: %target-typecheck-verify-swift -swift-version 4.2 -disable-objc-attr-requires-foundation-module -enable-objc-interop
// RUN: %target-typecheck-verify-swift -enable-testing -swift-version 4.2 -disable-objc-attr-requires-foundation-module -enable-objc-interop
@usableFromInline private func privateVersioned() {}
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but global function 'privateVersioned()' is private}}
@usableFromInline fileprivate func fileprivateVersioned() {}
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but global function 'fileprivateVersioned()' is fileprivate}}
@usableFromInline internal func internalVersioned() {}
// OK
@usableFromInline func implicitInternalVersioned() {}
// OK
@usableFromInline public func publicVersioned() {}
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but global function 'publicVersioned()' is public}}
internal class InternalClass {
// expected-note@-1 2{{type declared here}}
@usableFromInline public func publicVersioned() {}
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but instance method 'publicVersioned()' is public}}
}
fileprivate class filePrivateClass {
@usableFromInline internal func internalVersioned() {}
}
@usableFromInline struct S {
var x: Int
@usableFromInline var y: Int
}
@usableFromInline extension S {}
// expected-error@-1 {{'@usableFromInline' attribute cannot be applied to this declaration}}
@usableFromInline
protocol VersionedProtocol {
associatedtype T
func requirement() -> T
public func publicRequirement() -> T
// expected-error@-1 {{'public' modifier cannot be used in protocols}}
// expected-note@-2 {{protocol requirements implicitly have the same access as the protocol itself}}
@usableFromInline func versionedRequirement() -> T
// expected-error@-1 {{'@usableFromInline' attribute cannot be used in protocols}}
}
// Derived conformances had issues with @usableFromInline - rdar://problem/34342955
@usableFromInline
internal enum EqEnum {
case foo
}
@usableFromInline
internal enum RawEnum : Int {
case foo = 0
}
@inlinable
public func usesEqEnum() -> Bool {
_ = (EqEnum.foo == .foo)
_ = EqEnum.foo.hashValue
_ = RawEnum.foo.rawValue
_ = RawEnum(rawValue: 0)
}
internal struct InternalStruct {}
// expected-note@-1 9{{type declared here}}
@usableFromInline var globalInferred = InternalStruct()
// expected-warning@-1 {{type referenced from a '@usableFromInline' variable with inferred type 'InternalStruct' should be '@usableFromInline' or public}}
@usableFromInline var globalDeclared: InternalStruct = InternalStruct()
// expected-warning@-1 {{type referenced from a '@usableFromInline' variable should be '@usableFromInline' or public}}
@usableFromInline typealias BadAlias = InternalStruct
// expected-warning@-1 {{type referenced from the underlying type of a '@usableFromInline' type alias should be '@usableFromInline' or public}}
protocol InternalProtocol {
// expected-note@-1 4{{type declared here}}
associatedtype T
}
@usableFromInline
struct BadStruct<T, U>
// expected-warning@-1 {{type referenced from a generic requirement of a '@usableFromInline' generic struct should be '@usableFromInline' or public}}
where T : InternalProtocol,
T : Sequence,
T.Element == InternalStruct {
@usableFromInline init(x: InternalStruct) {}
// expected-warning@-1 {{the parameter of a '@usableFromInline' initializer should be '@usableFromInline' or public}}
@usableFromInline func foo(x: InternalStruct) -> InternalClass {}
// expected-warning@-1 {{the parameter of a '@usableFromInline' method should be '@usableFromInline' or public}}
// expected-warning@-2 {{the result of a '@usableFromInline' method should be '@usableFromInline' or public}}
@usableFromInline var propertyInferred = InternalStruct()
// expected-warning@-1 {{type referenced from a '@usableFromInline' property with inferred type 'InternalStruct' should be '@usableFromInline' or public}}
@usableFromInline var propertyDeclared: InternalStruct = InternalStruct()
// expected-warning@-1 {{type referenced from a '@usableFromInline' property should be '@usableFromInline' or public}}
@usableFromInline subscript(x: InternalStruct) -> Int {
// expected-warning@-1 {{index type of a '@usableFromInline' subscript should be '@usableFromInline' or public}}
get {}
set {}
}
@usableFromInline subscript(x: Int) -> InternalStruct {
// expected-warning@-1 {{element type of a '@usableFromInline' subscript should be '@usableFromInline' or public}}
get {}
set {}
}
}
@usableFromInline
protocol BadProtocol : InternalProtocol {
// expected-warning@-1 {{protocol refined by '@usableFromInline' protocol should be '@usableFromInline' or public}}
associatedtype X : InternalProtocol
// expected-warning@-1 {{type referenced from a requirement of an associated type in a '@usableFromInline' protocol should be '@usableFromInline' or public}}
associatedtype Y = InternalStruct
// expected-warning@-1 {{type referenced from a default definition of an associated type in a '@usableFromInline' protocol should be '@usableFromInline' or public}}
}
@usableFromInline
protocol AnotherBadProtocol where Self.T : InternalProtocol {
// expected-warning@-1 {{protocol used by '@usableFromInline' protocol should be '@usableFromInline' or public}}
associatedtype T
}
@usableFromInline
enum BadEnum {
case bad(InternalStruct)
// expected-warning@-1 {{type of enum case in '@usableFromInline' enum should be '@usableFromInline' or public}}
}
@usableFromInline
class BadClass : InternalClass {}
// expected-warning@-1 {{type referenced from the superclass of a '@usableFromInline' class should be '@usableFromInline' or public}}
public class DynamicMembers {
@usableFromInline @objc dynamic init() {}
@usableFromInline @objc dynamic func foo() {}
@usableFromInline @objc dynamic var bar: Int = 0
}
|