mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The Swift class model does not support overriding declarations where either the overridden declaration or the overriding declaration are in an extension. However, the Objective-C class model does, so marking the declaration as @objc (when possible) will work around the limitation. Customize the "cannot override declaration in extension" diagnostic to suggest adding @objc to the overridden declaration in cases where @objc is permitted. Fixes SR-6512 / rdar://problem/35787914.
108 lines
2.4 KiB
Swift
108 lines
2.4 KiB
Swift
// RUN: %target-typecheck-verify-swift -parse-as-library
|
|
|
|
class B : A {
|
|
override init() { super.init() }
|
|
override func f() {}
|
|
func g() -> (B, B) { return (B(), B()) } // expected-error {{declaration 'g()' cannot override more than one superclass declaration}}
|
|
override func h() -> (A, B) { return (B(), B()) } // expected-note {{'h()' previously overridden here}}
|
|
override func h() -> (B, A) { return (B(), B()) } // expected-error {{'h()' has already been overridden}}
|
|
func i() {} // expected-error {{overri}}
|
|
override func j() -> Int { return 0 }
|
|
func j() -> Float { return 0.0 }
|
|
func k() -> Float { return 0.0 }
|
|
override func l(_ l: Int) {}
|
|
override func l(_ l: Float) {}
|
|
override func m(_ x: Int) {}
|
|
func m(_ x: Float) {} // not an override of anything
|
|
func n(_ x: Float) {}
|
|
override subscript(i : Int) -> Int {
|
|
get {}
|
|
set {}
|
|
}
|
|
}
|
|
class A {
|
|
init() { }
|
|
func f() {}
|
|
func g() -> (B, A) { return (B(), B()) } // expected-note{{overridden declaration is here}}
|
|
func g() -> (A, B) { return (B(), B()) } // expected-note{{overridden declaration is here}}
|
|
func h() -> (A, A) { return (B(), B()) }
|
|
func j() -> Int { return 0 }
|
|
func k() -> Int { return 0 }
|
|
func l(_ l: Int) {}
|
|
func l(_ l: Float) {}
|
|
func m(_ x: Int) {}
|
|
func m(y: Int) {}
|
|
func n(_ x: Int) {}
|
|
subscript(i : Int) -> Int {
|
|
get {}
|
|
set {}
|
|
}
|
|
}
|
|
extension A {
|
|
func i() {} // expected-note{{overri}}
|
|
}
|
|
func f() {
|
|
let x = B()
|
|
_ = x.f() as ()
|
|
_ = x[10] as Int
|
|
}
|
|
|
|
class C<T> {
|
|
init() { }
|
|
func f(_ v: T) -> T { return v }
|
|
}
|
|
class D : C<Int> {
|
|
override init() { super.init() }
|
|
override func f(_ v: Int) -> Int { return v+1 }
|
|
}
|
|
func f2() {
|
|
let x = D()
|
|
_ = x.f(10)
|
|
}
|
|
|
|
class E<T> {
|
|
func f(_ v: T) -> T { return v }
|
|
}
|
|
class F : E<Int> {}
|
|
class G : F {
|
|
override func f(_ v: Int) -> Int { return v+1 }
|
|
}
|
|
|
|
// Explicit downcasting
|
|
func test_explicit_downcasting(_ f: F, ei: E<Int>) {
|
|
var g = f as! G
|
|
g = ei as! G
|
|
_ = g
|
|
}
|
|
|
|
// Type and instance functions with the same name
|
|
class H {
|
|
func f(_ x: Int) { }
|
|
class func f(_ x: Int) { }
|
|
}
|
|
|
|
class HDerived : H {
|
|
override func f(_ x: Int) { }
|
|
override class func f(_ x: Int) { }
|
|
}
|
|
|
|
// Subclass existentials in inheritance clause
|
|
protocol P {}
|
|
protocol Q {}
|
|
protocol R {}
|
|
class Base : Q & R {}
|
|
|
|
class Derived : P & Base {}
|
|
|
|
func f(_: P) {}
|
|
func g(_: Base) {}
|
|
func h(_: Q) {}
|
|
func i(_: R) {}
|
|
|
|
func testSubclassExistentialsInInheritanceClause() {
|
|
f(Derived())
|
|
g(Derived())
|
|
h(Derived())
|
|
i(Derived())
|
|
}
|