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 136 137 138
|
// RUN: %target-typecheck-verify-swift
protocol P1 {
subscript (i: Int) -> Int { get } // expected-note{{protocol requires subscript with type '(Int) -> Int'}}
}
class C1 : P1 {
subscript (i: Int) -> Int {
get {
return i
}
set {}
}
}
struct S1 : P1 {
subscript (i: Int) -> Int {
get {
return i
}
set {}
}
}
struct S1Error : P1 {
// expected-error@-1 {{type 'S1Error' does not conform to protocol 'P1'}}
// expected-note@-2 {{add stubs for conformance}}
subscript (i: Int) -> Double { // expected-note{{candidate has non-matching type '(Int) -> Double'}}
get {
return Double(i)
}
set {}
}
}
//===----------------------------------------------------------------------===//
// Get-only subscript requirements
//===----------------------------------------------------------------------===//
protocol SubscriptGet {
subscript(a : Int) -> Int { get } // expected-note {{protocol requires subscript with type '(Int) -> Int'}}
}
class SubscriptGet_Get : SubscriptGet {
subscript(a : Int) -> Int { return 0 } // ok
// for static cross-conformance test below: expected-note@-1 {{candidate operates on an instance, not a type as required}}
}
class SubscriptGet_GetSet : SubscriptGet {
subscript(a : Int) -> Int { get { return 42 } set {} } // ok
}
//===----------------------------------------------------------------------===//
// Get-set subscript requirements
//===----------------------------------------------------------------------===//
protocol SubscriptGetSet {
subscript(a : Int) -> Int { get set } // expected-note {{protocol requires subscript with type '(Int) -> Int'}}
}
class SubscriptGetSet_Get : SubscriptGetSet {
// expected-error@-1 {{type 'SubscriptGetSet_Get' does not conform to protocol 'SubscriptGetSet'}}
// expected-note@-2 {{add stubs for conformance}}
subscript(a : Int) -> Int { return 0 } // expected-note {{candidate is not settable, but protocol requires it}}
}
class SubscriptGetSet_GetSet : SubscriptGetSet {
subscript(a : Int) -> Int { get { return 42 } set {} } // ok
}
//===----------------------------------------------------------------------===//
// Generic subscript requirements
//===----------------------------------------------------------------------===//
protocol Initable {
init()
}
protocol GenericSubscriptProtocol {
subscript<T : Initable>(t: T.Type) -> T { get set }
// expected-note@-1 {{protocol requires subscript with type '<T> (T.Type) -> T'}}
}
struct GenericSubscriptWitness : GenericSubscriptProtocol {
subscript<T : Initable>(t: T.Type) -> T {
get {
return t.init()
}
set { }
}
}
struct GenericSubscriptNoWitness : GenericSubscriptProtocol {}
// expected-error@-1 {{type 'GenericSubscriptNoWitness' does not conform to protocol 'GenericSubscriptProtocol'}}
// expected-note@-2 {{add stubs for conformance}}
//===----------------------------------------------------------------------===//
// Static subscript requirements
//===----------------------------------------------------------------------===//
protocol StaticSubscriptGet {
static subscript(a : Int) -> Int { get } // expected-note {{protocol requires subscript with type '(Int) -> Int'}}
}
class StaticSubscriptGet_Get : StaticSubscriptGet {
static subscript(a : Int) -> Int { return 0 } // ok
// for static cross-conformance test below: expected-note@-1 {{candidate operates on a type, not an instance as required}}
}
class StaticSubscriptGet_GetSet : StaticSubscriptGet {
static subscript(a : Int) -> Int { get { return 42 } set {} } // ok
}
protocol StaticSubscriptGetSet {
static subscript(a : Int) -> Int { get set } // expected-note {{protocol requires subscript with type '(Int) -> Int'}}
}
class StaticSubscriptGetSet_Get : StaticSubscriptGetSet {
// expected-error@-1 {{type 'StaticSubscriptGetSet_Get' does not conform to protocol 'StaticSubscriptGetSet'}}
// expected-note@-2 {{add stubs for conformance}}
static subscript(a : Int) -> Int { return 0 } // expected-note {{candidate is not settable, but protocol requires it}}
}
class StaticSubscriptGetSet_GetSet : StaticSubscriptGetSet {
static subscript(a : Int) -> Int { get { return 42 } set {} } // ok
}
extension SubscriptGet_Get: StaticSubscriptGet {}
// expected-error@-1 {{type 'SubscriptGet_Get' does not conform to protocol 'StaticSubscriptGet'}}
// expected-note@-2 {{add stubs for conformance}}
extension StaticSubscriptGet_Get: SubscriptGet {}
// expected-error@-1 {{type 'StaticSubscriptGet_Get' does not conform to protocol 'SubscriptGet'}}
// expected-note@-2 {{add stubs for conformance}}
|