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
|
// RUN: %target-typecheck-verify-swift -disable-availability-checking
enum E : Error {
case NotAvailable
}
class GolfCourse {
var yards : Int {
get throws { throw E.NotAvailable }
}
var holes : Int {
get { 18 }
}
var par : Int {
get async throws { 71 }
}
subscript(_ i : Int) -> Int {
get throws { throw E.NotAvailable }
}
}
class Presidio : GolfCourse {
private var yardsFromBackTees = 6481
override var yards : Int { // removes effect & makes it mutable
get {
do {
return try super.yards
} catch {
return yardsFromBackTees
}
}
set { yardsFromBackTees = newValue }
}
override var holes : Int { // expected-error {{cannot override non-async property with async property}}
get async { 18 }
}
override var par : Int {
get async { 72 } // removes the 'throws' effect
}
override subscript(_ i : Int) -> Int { // removes effects
get { (try? super[i]) ?? 3 }
}
}
class PresidioBackNine : Presidio {
override var par : Int { // expected-error{{cannot override non-throwing property with throwing property}}
get throws { 36 } // attempts to put the 'throws' effect back
}
override subscript(_ i : Int) -> Int { // expected-error{{cannot override non-async subscript with async subscript}}
get async throws { 0 }
}
}
func timeToPlay(gc : Presidio) async {
_ = gc.yards
_ = (gc as GolfCourse).yards // expected-error{{property access can throw, but it is not marked with 'try' and the error is not handled}}
_ = try? (gc as GolfCourse).yards
// expected-error@+3 {{property access can throw, but it is not marked with 'try' and the error is not handled}}
// expected-error@+2 {{expression is 'async' but is not marked with 'await'}}{{7-7=await }}
// expected-note@+1:7{{property access is 'async'}}
_ = (gc as GolfCourse).par
_ = try? await (gc as GolfCourse).par
_ = await gc.par
_ = gc[2]
_ = (gc as GolfCourse)[2] // expected-error{{subscript access can throw, but it is not marked with 'try' and the error is not handled}}
_ = try? (gc as GolfCourse)[2]
}
class AcceptableDynamic {
dynamic var par : Int {
get async throws { 60 }
}
dynamic subscript(_ i : Int) -> Int {
get throws { throw E.NotAvailable }
}
}
// mainly just some soundness checks
// expected-error@+1 {{class 'Misc' has no initializers}}
class Misc {
// expected-error@+2 {{'lazy' cannot be used on a computed property}}
// expected-error@+1 {{lazy properties must have an initializer}}
lazy var someProp : Int {
get throws { 0 }
}
}
|