Files
swift-mirror/test/decl/class/classes.swift
Chris Willmore 03a6190a1f <rdar://problem/19031957> Change failable casts from "as" to "as!"
Previously the "as" keyword could either represent coercion or or forced
downcasting. This change separates the two notions. "as" now only means
type conversion, while the new "as!" operator is used to perform forced
downcasting. If a program uses "as" where "as!" is called for, we emit a
diagnostic and fixit.

Internally, this change removes the UnresolvedCheckedCastExpr class, in
favor of directly instantiating CoerceExpr when parsing the "as"
operator, and ForcedCheckedCastExpr when parsing the "as!" operator.

Swift SVN r24253
2015-01-08 00:33:59 +00:00

88 lines
2.2 KiB
Swift

// RUN: %swift -parse %s -verify -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()) }
override func h() -> (B, A) { return (B(), B()) }
func i() {} // expected-error {{declarations from extensions cannot be overridden yet}}
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{{overridden declaration is here}}
}
func f() {
var x = B()
var y : () = x.f()
var z : Int = x[10]
}
class C<T> {
init() { }
func f(v: T) -> T { return v }
}
class D : C<Int> { // expected-error{{classes derived from generic classes must also be generic}}
override init() { super.init() }
override func f(v: Int) -> Int { return v+1 }
}
func f2() {
var x = D()
var y = x.f(10)
}
class E<T> {
func f(v: T) -> T { return v }
}
class F : E<Int> {} // expected-error{{classes derived from generic classes must also be generic}}
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
}
// 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) { }
}