// RUN: %target-typecheck-verify-swift -parse-as-library -swift-version 4 @objc class ObjCClassA {} @objc class ObjCClassB : ObjCClassA {} class A { func f1() { } // expected-note{{overridden declaration is here}} func f2() -> A { } // expected-note{{overridden declaration is here}} @objc func f3() { } // expected-note{{overridden declaration is here}} @objc func f4() -> ObjCClassA { } // expected-note{{overridden declaration is here}} @objc var v1: Int { return 0 } // expected-note{{overridden declaration is here}} @objc var v2: Int { return 0 } // expected-note{{overridden declaration is here}} @objc var v3: Int = 0 // expected-note{{overridden declaration is here}} dynamic func f3D() { } // expected-error{{'dynamic' instance method 'f3D()' must also be '@objc'}}{{3-3=@objc }} dynamic func f4D() -> ObjCClassA { } // expected-error{{'dynamic' instance method 'f4D()' must also be '@objc'}}{{3-3=@objc }} } extension A { func f5() { } // expected-note{{overridden declaration is here}} func f6() -> A { } // expected-note{{overridden declaration is here}} @objc func f7() { } @objc func f8() -> ObjCClassA { } } class B : A { } extension B { func f1() { } // expected-error{{declarations in extensions cannot override yet}} func f2() -> B { } // expected-error{{declarations in extensions cannot override yet}} override func f3() { } // expected-error{{cannot override a non-dynamic class declaration from an extension}} override func f4() -> ObjCClassB { } // expected-error{{cannot override a non-dynamic class declaration from an extension}} override var v1: Int { return 1 } // expected-error{{cannot override a non-dynamic class declaration from an extension}} override var v2: Int { // expected-error{{cannot override a non-dynamic class declaration from an extension}} get { return 1 } set { } } override var v3: Int { // expected-error{{cannot override a non-dynamic class declaration from an extension}} willSet { } didSet { } } override func f3D() { } override func f4D() -> ObjCClassB { } func f5() { } // expected-error{{declarations in extensions cannot override yet}} func f6() -> A { } // expected-error{{declarations in extensions cannot override yet}} @objc override func f7() { } @objc override func f8() -> ObjCClassA { } } func callOverridden(_ b: B) { b.f3() _ = b.f4() b.f7() _ = b.f8() } @objc class Base { func meth(_ x: Undeclared) {} // expected-error {{use of undeclared type 'Undeclared'}} } @objc class Sub : Base { func meth(_ x: Undeclared) {} // expected-error {{use of undeclared type 'Undeclared'}} } // Objective-C method overriding @objc class ObjCSuper { func method(_ x: Int, withInt y: Int) { } func method2(_ x: Sub, withInt y: Int) { } @objc func method3(_ x: Base, withInt y: Int) { } // expected-note{{method 'method3(_:withInt:)' declared here}} } class ObjCSub : ObjCSuper { override func method(_ x: Int, withInt y: Int) { } // okay, overrides exactly override func method2(_ x: Base, withInt y: Int) { } // okay, overrides trivially @objc(method3:withInt:) func method3(_ x: Sub, with y: Int) { } // expected-error{{method3(_:with:)' with Objective-C selector 'method3:withInt:' conflicts with method 'method3(_:withInt:)' from superclass 'ObjCSuper' with the same Objective-C selector}} }