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
|
// RUN: %target-typecheck-verify-swift -swift-version 4 -disable-objc-attr-requires-foundation-module -enable-objc-interop
// RUN: %target-typecheck-verify-swift -enable-testing -swift-version 4 -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 {
@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 {}
@usableFromInline var globalInferred = InternalStruct()
@usableFromInline var globalDeclared: InternalStruct = InternalStruct()
@usableFromInline typealias BadAlias = InternalStruct
protocol InternalProtocol {
associatedtype T
}
@usableFromInline
struct BadStruct<T, U>
where T : InternalProtocol,
T : Sequence,
T.Element == InternalStruct {
@usableFromInline init(x: InternalStruct) {}
@usableFromInline func foo(x: InternalStruct) -> InternalClass {}
@usableFromInline var propertyInferred = InternalStruct()
@usableFromInline var propertyDeclared: InternalStruct = InternalStruct()
@usableFromInline subscript(x: InternalStruct) -> Int {
get {}
set {}
}
@usableFromInline subscript(x: Int) -> InternalStruct {
get {}
set {}
}
}
@usableFromInline
protocol BadProtocol : InternalProtocol {
associatedtype X : InternalProtocol
associatedtype Y = InternalStruct
}
@usableFromInline
protocol AnotherBadProtocol where Self.T : InternalProtocol {
associatedtype T
}
@usableFromInline
enum BadEnum {
case bad(InternalStruct)
}
@usableFromInline
class BadClass : InternalClass {}
public class DynamicMembers {
@usableFromInline @objc dynamic init() {}
@usableFromInline @objc dynamic func foo() {}
@usableFromInline @objc dynamic var bar: Int = 0
}
|