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
|
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-sil -I %S/Inputs/custom-modules %s -verify -verify-ignore-unknown
// REQUIRES: objc_interop
import Foundation
import ObjCParseExtras
class MyArray : DummyClass {
@objc func setBoolProperty(_ x: Bool) { } // expected-error{{method 'setBoolProperty' with Objective-C selector 'setBoolProperty:' conflicts with setter for 'boolProperty' from superclass 'DummyClass' with the same Objective-C selector}}
@objc(objectAtIndexedSubscript:)
func getObjectAt(_ i: Int) { } // expected-error{{method 'getObjectAt' with Objective-C selector 'objectAtIndexedSubscript:' conflicts with method 'objectAtIndexedSubscript' from superclass 'DummyClass' with the same Objective-C selector}}
}
class SomeCellSub1 : SomeCell {
init(string: String) { super.init(string: string) } // expected-error{{overriding declaration requires an 'override' keyword}}{{3-3=override }}
// okay: should not conflict
@objc func initWithString(_ string: String) { }
var isEnabled: Bool { // expected-error{{overriding declaration requires an 'override' keyword}}
get { return super.isEnabled }
}
@objc(enabled)
func otherIsEnabled() { } // should not conflict
}
class SomeCellSub2 : SomeCell {
override init(string: String) { super.init(string: string) }
// okay: should not conflict
func initWithString(_ string: String) { }
override var isEnabled: Bool {
get { return super.isEnabled }
}
@objc(enabled)
func otherIsEnabled() { } // should not conflict
}
class SomeCellSub3 : SomeCell {
@objc(initString:)
override init(string: String) { super.init(string: string) }
// okay: should not conflict
func initWithString(_ string: String) { }
override var isEnabled: Bool {
@objc(isEnabled) get { return super.isEnabled }
}
@objc(enabled)
func otherIsEnabled() { } // should not conflict
}
class SomeCellSub4 : SomeCell {
@objc
override init(string: String) { super.init(string: string) }
// okay: should not conflict
func initWithString(_ string: String) { }
override var isEnabled: Bool {
@objc get { return super.isEnabled }
}
@objc(enabled)
func otherIsEnabled() { } // should not conflict
}
class SomeCellSub5 : SomeCell {
@objc(initWithString:) // expected-error{{Objective-C method has a different selector from the method it overrides ('initWithString:' vs. 'initString:')}}{{9-24=initString:}}
override init(string: String) { super.init(string: string) }
override var isEnabled: Bool {
@objc(wasEnabled) get { return super.isEnabled }
// expected-error@-1{{Objective-C method has a different selector from the method it overrides ('wasEnabled' vs. 'isEnabled')}}{{11-21=isEnabled}}
}
@objc(enabled)
func otherIsEnabled() { } // should not conflict
}
class FailSub : FailBase {
override init(value: Int) { try! super.init(value: value) } // expected-error {{overriding a throwing @objc initializer with a non-throwing initializer is not supported}}
override class func processValue() {} // expected-error {{overriding a throwing @objc method with a non-throwing method is not supported}}
}
class CallbackSubA : CallbackBase {
override func perform(handler: () -> Void) {} // expected-error {{method does not override any method from its superclass}}
// expected-note@-1 {{type does not match superclass instance method with type '(@escaping () -> Void) -> Void'}}
override func perform(optHandler: () -> Void) {} // expected-error {{method does not override any method from its superclass}}
override func perform(nonescapingHandler: () -> Void) {}
override func perform(optNonescapingHandler: () -> Void) {} // expected-error {{cannot override instance method parameter of type '(() -> Void)?' with non-optional type '() -> Void'}}
}
class CallbackSubB : CallbackBase {
override func perform(handler: (() -> Void)?) {}
override func perform(optHandler: (() -> Void)?) {}
override func perform(nonescapingHandler: (() -> Void)?) {} // expected-error {{method does not override any method from its superclass}}
override func perform(optNonescapingHandler: (() -> Void)?) {}
}
class CallbackSubC : CallbackBase {
override func perform(handler: @escaping () -> Void) {}
override func perform(optHandler: @escaping () -> Void) {} // expected-error {{cannot override instance method parameter of type '(() -> Void)?' with non-optional type '() -> Void'}}
override func perform(nonescapingHandler: @escaping () -> Void) {} // expected-error {{method does not override any method from its superclass}}
override func perform(optNonescapingHandler: @escaping () -> Void) {} // expected-error {{method does not override any method from its superclass}}
}
//
class MyHashableNSObject: NSObject {
override var hashValue: Int {
// expected-error@-1 {{'NSObject.hashValue' is not overridable; did you mean to override 'NSObject.hash'?}}
return 0
}
override func hash(into hasher: inout Hasher) {
// expected-error@-1 {{'NSObject.hash(into:)' is not overridable; did you mean to override 'NSObject.hash'?}} {{12-16=var}} {{21-48=: Int}}
}
}
// rdar://problem/47557376
// Adding an override to someone else's class in an extension like this isn't
// really sound, but it's allowed in Objective-C too.
extension OverrideInExtensionSub {
open override func method() {}
}
public extension OverrideInExtensionSub {
open override func accessWarning() {} // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
}
// FIXME: Remove -verify-ignore-unknown.
// <unknown>:0: error: unexpected note produced: overridden declaration is here
// <unknown>:0: error: unexpected note produced: setter for 'boolProperty' declared here
|