// 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 // 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 }