blob: 0def7e532a2c99dc0eb41024d66c315056eef4c1 [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %target-typecheck-verify-swift -I %S/Inputs/implementation-only-override -DERRORS -enable-library-evolution -enable-objc-interop
// RUN: %target-swift-frontend -typecheck -emit-module-interface-path %t/Library.swiftinterface -I %S/Inputs/implementation-only-override -enable-library-evolution -enable-objc-interop %s
// RUN: %FileCheck %s < %t/Library.swiftinterface
// RUN: %FileCheck -check-prefix=NEGATIVE %s < %t/Library.swiftinterface
// CHECK: import FooKit
// NEGATIVE-NOT: SECRET
// NEGATIVE-NOT: subscript
import FooKit
@_implementationOnly import FooKit_SECRET
// CHECK-LABEL: class GoodChild : FooKit.Parent {
// CHECK-NEXT: @objc override dynamic public init()
// CHECK-NEXT: @objc deinit
// CHECK-NEXT: }
public class GoodChild: Parent {
public override init() {}
// FIXME: @_implementationOnly on an initializer doesn't exactly make sense,
// since they're not inherited.
@_implementationOnly public override init(SECRET: Int32) {}
@_implementationOnly public required init(requiredSECRET: Int32) {}
@_implementationOnly public override func methodSECRET() {} // expected-note {{overridden declaration is here}}
@_implementationOnly public override func methodWithSECRETType() -> SECRETType? { nil } // expected-note {{overridden declaration is here}}
@_implementationOnly public override var roPropSECRET: Parent? { nil } // expected-note {{overridden declaration is here}}
@_implementationOnly public override var rwPropSECRET: Parent? { // expected-note {{overridden declaration is here}}
get { nil }
set {}
}
@_implementationOnly public override subscript(_ index: Int32) -> Parent? { nil } // expected-note {{overridden declaration is here}}
@_implementationOnly public override var redefinedPropSECRET: Parent? { // expected-note {{overridden declaration is here}}
get { nil }
set {}
}
}
// CHECK-LABEL: class QuietChild : FooKit.Parent {
// CHECK-NEXT: @objc deinit
// CHECK-NEXT: }
public class QuietChild: Parent {
internal override init() {}
internal override init(SECRET: Int32) {}
internal required init(requiredSECRET: Int32) {}
}
// CHECK-LABEL: class GoodGenericChild<Toy> : FooKit.Parent {
// CHECK-NEXT: @objc override dynamic public init()
// CHECK-NEXT: @objc deinit
// CHECK-NEXT: }
public class GoodGenericChild<Toy>: Parent {
public override init() {}
// FIXME: @_implementationOnly on an initializer doesn't exactly make sense,
// since they're not inherited.
@_implementationOnly public override init(SECRET: Int32) {}
@_implementationOnly public required init(requiredSECRET: Int32) {}
@_implementationOnly public override func methodSECRET() {}
@_implementationOnly public override func methodWithSECRETType() -> SECRETType? { nil }
@_implementationOnly public override var roPropSECRET: Parent? { nil }
@_implementationOnly public override var rwPropSECRET: Parent? {
get { nil }
set {}
}
@_implementationOnly public override subscript(_ index: Int32) -> Parent? { nil }
@_implementationOnly public override var redefinedPropSECRET: Parent? {
get { nil }
set {}
}
}
internal class PrivateChild: Parent {
override func methodSECRET() {}
override func methodWithSECRETType() -> SECRETType? { nil }
override var roPropSECRET: Parent? { nil }
override var rwPropSECRET: Parent? {
get { nil }
set {}
}
override subscript(_ index: Int32) -> Parent? { nil }
override var redefinedPropSECRET: Parent? {
get { nil }
set {}
}
}
internal class PrivateGrandchild: GoodChild {
override func methodSECRET() {}
override func methodWithSECRETType() -> SECRETType? { nil }
override var roPropSECRET: Parent? { nil }
override var rwPropSECRET: Parent? {
get { nil }
set {}
}
override subscript(_ index: Int32) -> Parent? { nil }
override var redefinedPropSECRET: Parent? {
get { nil }
set {}
}
}
// CHECK-LABEL: class SubscriptChild : FooKit.SubscriptParent {
// CHECK-NEXT: @objc deinit
// CHECK-NEXT: }
public class SubscriptChild: SubscriptParent {
@_implementationOnly public override subscript(_ index: Int32) -> Parent? {
get { nil }
set {}
}
}
#if ERRORS
public class NaughtyChild: Parent {
@_implementationOnly public func nonOverridingMethod() {} // expected-error {{'@_implementationOnly' can only be used on overrides}} {{3-24=}}
@_implementationOnly public var nonOverridingProperty: Int { 0 } // expected-error {{'@_implementationOnly' can only be used on overrides}} {{3-24=}}
public override init() {} // okay
public override init(SECRET: Int32) {} // expected-error {{override of initializer imported as implementation-only must be declared '@_implementationOnly'}} {{3-3=@_implementationOnly }}
public required init(requiredSECRET: Int32) {} // expected-error {{override of initializer imported as implementation-only must be declared '@_implementationOnly'}} {{3-3=@_implementationOnly }}
public override func methodSECRET() {} // expected-error {{override of instance method imported as implementation-only must be declared '@_implementationOnly'}} {{3-3=@_implementationOnly }}
public override func methodWithSECRETType() -> SECRETType? { nil } // expected-error {{override of instance method imported as implementation-only must be declared '@_implementationOnly'}} {{3-3=@_implementationOnly }} expected-error {{cannot use class 'SECRETType' here; 'FooKit_SECRET' has been imported as implementation-only}} {{none}}
public override var roPropSECRET: Parent? { nil } // expected-error {{override of property imported as implementation-only must be declared '@_implementationOnly'}} {{3-3=@_implementationOnly }}
public override var rwPropSECRET: Parent? { // expected-error {{override of property imported as implementation-only must be declared '@_implementationOnly'}} {{3-3=@_implementationOnly }}
get { nil }
set {}
}
public override subscript(_ index: Int32) -> Parent? { nil } // expected-error {{override of subscript imported as implementation-only must be declared '@_implementationOnly'}} {{3-3=@_implementationOnly }}
public override var redefinedPropSECRET: Parent? { // FIXME: the setter here is from the implementation-only import, so we'd like to complain about this too.
get { nil }
set {}
}
}
public class NaughtyChildByType: Parent {
@_implementationOnly public override var roPropSECRET: NaughtyChildByType? { nil } // expected-error {{'@_implementationOnly' override must have the same type as the declaration it overrides ('Parent?')}} {{none}}
@_implementationOnly public override subscript(_ index: Int32) -> NaughtyChildByType? { nil } // expected-error {{'@_implementationOnly' override must have the same type as the declaration it overrides ('(Int32) -> Parent?')}} {{none}}
}
public class NaughtyConcreteChildByType: GenericParent<Parent> {
@_implementationOnly public override var roPropSECRET: NaughtyChildByType? { nil } // expected-error {{'@_implementationOnly' override must have the same type as the declaration it overrides ('Parent?')}} {{none}}
@_implementationOnly public override subscript(_ index: Int32) -> NaughtyChildByType? { nil } // expected-error {{'@_implementationOnly' override must have the same type as the declaration it overrides ('(Int32) -> Parent?')}} {{none}}
}
public class NaughtyGrandchild: GoodChild {
public override func methodSECRET() {} // expected-error {{override of '@_implementationOnly' instance method should also be declared '@_implementationOnly'}} {{3-3=@_implementationOnly }}
public override func methodWithSECRETType() -> SECRETType? { nil } // expected-error {{override of '@_implementationOnly' instance method should also be declared '@_implementationOnly'}} {{3-3=@_implementationOnly }} expected-error {{cannot use class 'SECRETType' here; 'FooKit_SECRET' has been imported as implementation-only}} {{none}}
public override var roPropSECRET: Parent? { nil } // expected-error {{override of '@_implementationOnly' property should also be declared '@_implementationOnly'}} {{3-3=@_implementationOnly }}
public override var rwPropSECRET: Parent? { // expected-error {{override of '@_implementationOnly' property should also be declared '@_implementationOnly'}} {{3-3=@_implementationOnly }}
get { nil }
set {}
}
public override subscript(_ index: Int32) -> Parent? { nil } // expected-error {{override of '@_implementationOnly' subscript should also be declared '@_implementationOnly'}} {{3-3=@_implementationOnly }}
public override var redefinedPropSECRET: Parent? { // expected-error {{override of '@_implementationOnly' property should also be declared '@_implementationOnly'}} {{3-3=@_implementationOnly }}
get { nil }
set {}
}
}
#endif // ERRORS