- Notifications
You must be signed in to change notification settings - Fork 10.5k
/
Copy pathasync_iterator_inference.swift
103 lines (80 loc) · 3.46 KB
/
async_iterator_inference.swift
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
// RUN: %target-swift-frontend -strict-concurrency=complete -emit-sil -o /dev/null %s -verify -disable-availability-checking
// REQUIRES: concurrency
@available(SwiftStdlib 5.1,*)
structS:AsyncSequence{
typealiasElement=Int
structAsyncIterator:AsyncIteratorProtocol{
mutatingfunc next()async->Int?{nil}
}
func makeAsyncIterator()->AsyncIterator{AsyncIterator()}
}
@available(SwiftStdlib 5.1,*)
structTS:AsyncSequence{
typealiasElement=Int
structAsyncIterator:AsyncIteratorProtocol{
mutatingfunc next()asyncthrows->Int?{nil}
}
func makeAsyncIterator()->AsyncIterator{AsyncIterator()}
}
@available(SwiftStdlib 5.1,*)
structSpecificTS<F:Error>:AsyncSequence{
typealiasElement=Int
typealiasFailure=F
structAsyncIterator:AsyncIteratorProtocol{
typealiasFailure=F
mutatingfunc next()asyncthrows->Int?{nil}
}
func makeAsyncIterator()->AsyncIterator{AsyncIterator()}
}
@available(SwiftStdlib 5.1,*)
structGenericTS<Failure:Error>:AsyncSequence{
typealiasElement=Int
structAsyncIterator:AsyncIteratorProtocol{
mutatingfunc next()asyncthrows->Int?{nil}
}
func makeAsyncIterator()->AsyncIterator{AsyncIterator()}
}
@available(SwiftStdlib 5.1,*)
structSequenceAdapter<Base:AsyncSequence>:AsyncSequence{
typealiasElement=Base.Element
structAsyncIterator:AsyncIteratorProtocol{
mutatingfunc next()asyncrethrows->Base.Element?{nil}
}
func makeAsyncIterator()->AsyncIterator{AsyncIterator()}
}
publicstructNormalThrowingAsyncSequence<Element, Failure>:AsyncSequence{
privateletiteratorMaker:()->AsyncIterator
publicstructAsyncIterator:AsyncIteratorProtocol{
letnextMaker:()asyncthrows->Element?
publicmutatingfunc next()asyncthrows->Element?{
tryawaitnextMaker()
}
}
publicfunc makeAsyncIterator()->AsyncIterator{
iteratorMaker()
}
}
enumMyError:Error{
case fail
}
@available(SwiftStdlib 5.1,*)
func testAssocTypeInference(sf:S.Failure, tsf:TS.Failure, gtsf1:GenericTS<MyError>.Failure, adapter:SequenceAdapter<SpecificTS<MyError>>.Failure, ntas:NormalThrowingAsyncSequence<String,MyError>.Failure){
let _:Int= sf // expected-error{{cannot convert value of type 'S.__AsyncSequence_Failure' (aka 'Never') to specified type 'Int'}}
let _:Int= tsf // expected-error{{cannot convert value of type 'TS.__AsyncSequence_Failure' (aka 'any Error') to specified type 'Int'}}
let _:Int= gtsf1 // expected-error{{cannot convert value of type 'GenericTS<MyError>.__AsyncSequence_Failure' (aka 'any Error') to specified type 'Int'}}
let _:Int= adapter // expected-error{{cannot convert value of type 'SequenceAdapter<SpecificTS<MyError>>.__AsyncSequence_Failure' (aka 'MyError') to specified type 'Int'}}
let _:Int= ntas // expected-error{{cannot convert value of type 'NormalThrowingAsyncSequence<String, MyError>.__AsyncSequence_Failure' (aka 'any Error') to specified type 'Int'}}
}
@available(SwiftStdlib 5.1,*)
func test(s:S)async{
forawaitxin s { _ = x }
}
enumOtherError:Error{
case boom
}
@available(SwiftStdlib 5.1,*)
func testMyError(s:SpecificTS<MyError>, so:SpecificTS<OtherError>)asyncthrows(MyError){
fortryawaitxin s { _ = x }
fortryawaitxin so { _ = x }
// expected-error@-1{{thrown expression type 'SpecificTS<OtherError>.AsyncIterator.Failure' (aka 'OtherError') cannot be converted to error type 'MyError'}}
}