mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
The various _*Indexable protocols only exist to work around the lack of recursive protocol constraints. Eliminate all of the *_Indexable protocols, collapsing their requirements into the corresponding Collection protocol (e.g., _MutableIndexable —> Collection). This introduces a number of extraneous requirements into the various Collection protocols to work around bugs in associated type inference. Specifically, to work around the lack of "global" inference of associated type witnesses. These hacks were implicitly present in the *Indexable protocols; I've made marked them as ABI FIXMEs here so we can remove them when associated type inference improves. Fixes rdar://problem/21935030 and a number of ABI FIXMEs in the library.
138 lines
5.3 KiB
Swift
138 lines
5.3 KiB
Swift
// RUN: %target-typecheck-verify-swift -verify-ignore-unknown
|
|
|
|
import StdlibUnittest
|
|
import StdlibCollectionUnittest
|
|
|
|
//
|
|
// Check that Collection.SubSequence is constrained to Collection.
|
|
//
|
|
|
|
// expected-error@+2 {{type 'CollectionWithBadSubSequence' does not conform to protocol 'Collection'}}
|
|
// expected-error@+1 {{type 'CollectionWithBadSubSequence' does not conform to protocol 'Sequence'}}
|
|
struct CollectionWithBadSubSequence : Collection {
|
|
var startIndex: MinimalIndex {
|
|
fatalError("unreachable")
|
|
}
|
|
|
|
var endIndex: MinimalIndex {
|
|
fatalError("unreachable")
|
|
}
|
|
|
|
subscript(i: MinimalIndex) -> OpaqueValue<Int> {
|
|
fatalError("unreachable")
|
|
}
|
|
|
|
// expected-note@+2 {{possibly intended match}}
|
|
// expected-note@+1 {{possibly intended match}}
|
|
typealias SubSequence = OpaqueValue<Int8>
|
|
}
|
|
|
|
func useCollectionTypeSubSequenceIndex<C : Collection>(_ c: C) {}
|
|
|
|
func useCollectionTypeSubSequenceGeneratorElement<C : Collection>(_ c: C) {}
|
|
|
|
func sortResultIgnored<
|
|
S : Sequence,
|
|
MC : MutableCollection
|
|
>(_ sequence: S, mutableCollection: MC, array: [Int])
|
|
where S.Iterator.Element : Comparable, MC.Iterator.Element : Comparable {
|
|
var sequence = sequence // expected-warning {{variable 'sequence' was never mutated; consider changing to 'let' constant}}
|
|
var mutableCollection = mutableCollection // expected-warning {{variable 'mutableCollection' was never mutated; consider changing to 'let' constant}}
|
|
var array = array // expected-warning {{variable 'array' was never mutated; consider changing to 'let' constant}}
|
|
|
|
sequence.sorted() // expected-warning {{result of call to 'sorted()' is unused}}
|
|
sequence.sorted { $0 < $1 } // expected-warning {{result of call to 'sorted(by:)' is unused}}
|
|
|
|
mutableCollection.sorted() // expected-warning {{result of call to 'sorted()' is unused}}
|
|
mutableCollection.sorted { $0 < $1 } // expected-warning {{result of call to 'sorted(by:)' is unused}}
|
|
|
|
array.sorted() // expected-warning {{result of call to 'sorted()' is unused}}
|
|
array.sorted { $0 < $1 } // expected-warning {{result of call to 'sorted(by:)' is unused}}
|
|
}
|
|
|
|
// expected-warning@+1 {{'Indexable' is deprecated: it will be removed in Swift 4.0. Please use 'Collection' instead}}
|
|
struct GoodIndexable : Indexable {
|
|
func index(after i: Int) -> Int { return i + 1 }
|
|
var startIndex: Int { return 0 }
|
|
var endIndex: Int { return 0 }
|
|
|
|
subscript(pos: Int) -> Int { return 0 }
|
|
subscript(bounds: Range<Int>) -> ArraySlice<Int> { return [] }
|
|
}
|
|
|
|
|
|
// expected-warning@+1 {{'Indexable' is deprecated: it will be removed in Swift 4.0. Please use 'Collection' instead}}
|
|
struct AnotherGoodIndexable1 : Indexable {
|
|
func index(after i: Int) -> Int { return i + 1 }
|
|
var startIndex: Int { return 0 }
|
|
var endIndex: Int { return 0 }
|
|
|
|
subscript(pos: Int) -> Int { return 0 }
|
|
}
|
|
|
|
// expected-warning@+2 {{'Indexable' is deprecated: it will be removed in Swift 4.0. Please use 'Collection' instead}}
|
|
// expected-error@+1 {{type 'BadIndexable2' does not conform to protocol 'Collection'}}
|
|
struct BadIndexable2 : Indexable {
|
|
var startIndex: Int { return 0 }
|
|
var endIndex: Int { return 0 }
|
|
|
|
subscript(pos: Int) -> Int { return 0 }
|
|
subscript(bounds: Range<Int>) -> ArraySlice<Int> { return [] }
|
|
// Missing index(after:) -> Int
|
|
}
|
|
|
|
// expected-warning@+1 {{'BidirectionalIndexable' is deprecated: it will be removed in Swift 4.0. Please use 'BidirectionalCollection' instead}}
|
|
struct GoodBidirectionalIndexable1 : BidirectionalIndexable {
|
|
var startIndex: Int { return 0 }
|
|
var endIndex: Int { return 0 }
|
|
func index(after i: Int) -> Int { return i + 1 }
|
|
func index(before i: Int) -> Int { return i - 1 }
|
|
|
|
subscript(pos: Int) -> Int { return 0 }
|
|
subscript(bounds: Range<Int>) -> ArraySlice<Int> { return [] }
|
|
}
|
|
|
|
// We'd like to see: {{type 'BadBidirectionalIndexable' does not conform to protocol 'BidirectionalIndexable'}}
|
|
// But the compiler doesn't generate that error.
|
|
// expected-warning@+1 {{'BidirectionalIndexable' is deprecated: it will be removed in Swift 4.0. Please use 'BidirectionalCollection' instead}}
|
|
struct BadBidirectionalIndexable : BidirectionalIndexable {
|
|
var startIndex: Int { return 0 }
|
|
var endIndex: Int { return 0 }
|
|
|
|
subscript(pos: Int) -> Int { return 0 }
|
|
subscript(bounds: Range<Int>) -> ArraySlice<Int> { return [] }
|
|
|
|
// This is a poor error message; it would be better to get a message
|
|
// that index(before:) was missing.
|
|
//
|
|
// expected-error@+1 {{'index(after:)' has different argument labels from those required by protocol 'BidirectionalCollection' ('index(before:)'}}
|
|
func index(after i: Int) -> Int { return 0 }
|
|
}
|
|
|
|
//
|
|
// Check that RangeReplaceableCollection.SubSequence is defaulted.
|
|
//
|
|
|
|
struct RangeReplaceableCollection_SubSequence_IsDefaulted : RangeReplaceableCollection {
|
|
var startIndex: Int { fatalError() }
|
|
var endIndex: Int { fatalError() }
|
|
|
|
subscript(pos: Int) -> Int { return 0 }
|
|
|
|
func index(after: Int) -> Int { fatalError() }
|
|
func index(before: Int) -> Int { fatalError() }
|
|
func index(_: Int, offsetBy: Int) -> Int { fatalError() }
|
|
func distance(from: Int, to: Int) -> Int { fatalError() }
|
|
|
|
mutating func replaceSubrange<C>(
|
|
_ subrange: Range<Int>,
|
|
with newElements: C
|
|
) where C : Collection, C.Iterator.Element == Int {
|
|
fatalError()
|
|
}
|
|
}
|
|
|
|
// FIXME: Remove -verify-ignore-unknown.
|
|
// <unknown>:0: error: unexpected note produced: possibly intended match
|
|
// <unknown>:0: error: unexpected note produced: possibly intended match
|