aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/tests/coercion.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_ty/src/tests/coercion.rs')
-rw-r--r--crates/ra_hir_ty/src/tests/coercion.rs690
1 files changed, 371 insertions, 319 deletions
diff --git a/crates/ra_hir_ty/src/tests/coercion.rs b/crates/ra_hir_ty/src/tests/coercion.rs
index 6f777ed8c..d7fb6a962 100644
--- a/crates/ra_hir_ty/src/tests/coercion.rs
+++ b/crates/ra_hir_ty/src/tests/coercion.rs
@@ -1,7 +1,8 @@
1use super::infer_with_mismatches;
2use insta::assert_snapshot; 1use insta::assert_snapshot;
3use test_utils::mark; 2use test_utils::mark;
4 3
4use super::infer_with_mismatches;
5
5// Infer with some common definitions and impls. 6// Infer with some common definitions and impls.
6fn infer(source: &str) -> String { 7fn infer(source: &str) -> String {
7 let defs = r#" 8 let defs = r#"
@@ -29,10 +30,10 @@ fn test() {
29} 30}
30"#), 31"#),
31 @r###" 32 @r###"
32 11..41 '{ ...4 }; }': () 33 10..40 '{ ...4 }; }': ()
33 21..22 'a': i32 34 20..21 'a': i32
34 30..38 '{ 1i64 }': i64 35 29..37 '{ 1i64 }': i64
35 32..36 '1i64': i64 36 31..35 '1i64': i64
36 "###); 37 "###);
37} 38}
38 39
@@ -63,50 +64,50 @@ fn test2() {
63} 64}
64"#), 65"#),
65 @r###" 66 @r###"
66 31..32 '_': &[T] 67 30..31 '_': &[T]
67 45..56 '{ loop {} }': T 68 44..55 '{ loop {} }': T
68 47..54 'loop {}': ! 69 46..53 'loop {}': !
69 52..54 '{}': () 70 51..53 '{}': ()
70 65..66 '_': S<&[T]> 71 64..65 '_': S<&[T]>
71 82..93 '{ loop {} }': T 72 81..92 '{ loop {} }': T
72 84..91 'loop {}': ! 73 83..90 'loop {}': !
73 89..91 '{}': () 74 88..90 '{}': ()
74 122..133 '{ loop {} }': *mut [T; _] 75 121..132 '{ loop {} }': *mut [T; _]
75 124..131 'loop {}': ! 76 123..130 'loop {}': !
76 129..131 '{}': () 77 128..130 '{}': ()
77 160..173 '{ gen() }': *mut [U] 78 159..172 '{ gen() }': *mut [U]
78 166..169 'gen': fn gen<U>() -> *mut [U; _] 79 165..168 'gen': fn gen<U>() -> *mut [U; _]
79 166..171 'gen()': *mut [U; _] 80 165..170 'gen()': *mut [U; _]
80 186..420 '{ ...rr); }': () 81 185..419 '{ ...rr); }': ()
81 196..199 'arr': &[u8; _] 82 195..198 'arr': &[u8; _]
82 212..216 '&[1]': &[u8; _] 83 211..215 '&[1]': &[u8; _]
83 213..216 '[1]': [u8; _] 84 212..215 '[1]': [u8; _]
84 214..215 '1': u8 85 213..214 '1': u8
85 227..228 'a': &[u8] 86 226..227 'a': &[u8]
86 237..240 'arr': &[u8; _] 87 236..239 'arr': &[u8; _]
87 250..251 'b': u8 88 249..250 'b': u8
88 254..255 'f': fn f<u8>(&[u8]) -> u8 89 253..254 'f': fn f<u8>(&[u8]) -> u8
89 254..260 'f(arr)': u8 90 253..259 'f(arr)': u8
90 256..259 'arr': &[u8; _] 91 255..258 'arr': &[u8; _]
91 270..271 'c': &[u8] 92 269..270 'c': &[u8]
92 280..287 '{ arr }': &[u8] 93 279..286 '{ arr }': &[u8]
93 282..285 'arr': &[u8; _] 94 281..284 'arr': &[u8; _]
94 297..298 'd': u8 95 296..297 'd': u8
95 301..302 'g': fn g<u8>(S<&[u8]>) -> u8 96 300..301 'g': fn g<u8>(S<&[u8]>) -> u8
96 301..316 'g(S { a: arr })': u8 97 300..315 'g(S { a: arr })': u8
97 303..315 'S { a: arr }': S<&[u8]> 98 302..314 'S { a: arr }': S<&[u8]>
98 310..313 'arr': &[u8; _] 99 309..312 'arr': &[u8; _]
99 326..327 'e': [&[u8]; _] 100 325..326 'e': [&[u8]; _]
100 341..346 '[arr]': [&[u8]; _] 101 340..345 '[arr]': [&[u8]; _]
101 342..345 'arr': &[u8; _] 102 341..344 'arr': &[u8; _]
102 356..357 'f': [&[u8]; _] 103 355..356 'f': [&[u8]; _]
103 371..379 '[arr; 2]': [&[u8]; _] 104 370..378 '[arr; 2]': [&[u8]; _]
104 372..375 'arr': &[u8; _] 105 371..374 'arr': &[u8; _]
105 377..378 '2': usize 106 376..377 '2': usize
106 389..390 'g': (&[u8], &[u8]) 107 388..389 'g': (&[u8], &[u8])
107 407..417 '(arr, arr)': (&[u8], &[u8]) 108 406..416 '(arr, arr)': (&[u8], &[u8])
108 408..411 'arr': &[u8; _] 109 407..410 'arr': &[u8; _]
109 413..416 'arr': &[u8; _] 110 412..415 'arr': &[u8; _]
110 "### 111 "###
111 ); 112 );
112} 113}
@@ -121,15 +122,15 @@ fn test() {
121} 122}
122"#), 123"#),
123 @r###" 124 @r###"
124 11..76 '{ ...[1]; }': () 125 10..75 '{ ...[1]; }': ()
125 21..22 'x': &[isize] 126 20..21 'x': &[isize]
126 35..39 '&[1]': &[isize; _] 127 34..38 '&[1]': &[isize; _]
127 36..39 '[1]': [isize; _] 128 35..38 '[1]': [isize; _]
128 37..38 '1': isize 129 36..37 '1': isize
129 49..50 'x': *const [isize] 130 48..49 'x': *const [isize]
130 69..73 '&[1]': &[isize; _] 131 68..72 '&[1]': &[isize; _]
131 70..73 '[1]': [isize; _] 132 69..72 '[1]': [isize; _]
132 71..72 '1': isize 133 70..71 '1': isize
133 "###); 134 "###);
134} 135}
135 136
@@ -155,31 +156,31 @@ fn test(a: A<[u8; 2]>, b: B<[u8; 2]>, c: C<[u8; 2]>) {
155} 156}
156"#), 157"#),
157 @r###" 158 @r###"
158 258..259 'x': A<[T]> 159 257..258 'x': A<[T]>
159 279..284 '{ x }': A<[T]> 160 278..283 '{ x }': A<[T]>
160 281..282 'x': A<[T]> 161 280..281 'x': A<[T]>
161 296..297 'x': B<[T]> 162 295..296 'x': B<[T]>
162 317..322 '{ x }': B<[T]> 163 316..321 '{ x }': B<[T]>
163 319..320 'x': B<[T]> 164 318..319 'x': B<[T]>
164 334..335 'x': C<[T]> 165 333..334 'x': C<[T]>
165 355..360 '{ x }': C<[T]> 166 354..359 '{ x }': C<[T]>
166 357..358 'x': C<[T]> 167 356..357 'x': C<[T]>
167 370..371 'a': A<[u8; _]> 168 369..370 'a': A<[u8; _]>
168 385..386 'b': B<[u8; _]> 169 384..385 'b': B<[u8; _]>
169 400..401 'c': C<[u8; _]> 170 399..400 'c': C<[u8; _]>
170 415..481 '{ ...(c); }': () 171 414..480 '{ ...(c); }': ()
171 425..426 'd': A<[{unknown}]> 172 424..425 'd': A<[{unknown}]>
172 429..433 'foo1': fn foo1<{unknown}>(A<[{unknown}]>) -> A<[{unknown}]> 173 428..432 'foo1': fn foo1<{unknown}>(A<[{unknown}]>) -> A<[{unknown}]>
173 429..436 'foo1(a)': A<[{unknown}]> 174 428..435 'foo1(a)': A<[{unknown}]>
174 434..435 'a': A<[u8; _]> 175 433..434 'a': A<[u8; _]>
175 446..447 'e': B<[u8]> 176 445..446 'e': B<[u8]>
176 450..454 'foo2': fn foo2<u8>(B<[u8]>) -> B<[u8]> 177 449..453 'foo2': fn foo2<u8>(B<[u8]>) -> B<[u8]>
177 450..457 'foo2(b)': B<[u8]> 178 449..456 'foo2(b)': B<[u8]>
178 455..456 'b': B<[u8; _]> 179 454..455 'b': B<[u8; _]>
179 467..468 'f': C<[u8]> 180 466..467 'f': C<[u8]>
180 471..475 'foo3': fn foo3<u8>(C<[u8]>) -> C<[u8]> 181 470..474 'foo3': fn foo3<u8>(C<[u8]>) -> C<[u8]>
181 471..478 'foo3(c)': C<[u8]> 182 470..477 'foo3(c)': C<[u8]>
182 476..477 'c': C<[u8; _]> 183 475..476 'c': C<[u8; _]>
183 "### 184 "###
184 ); 185 );
185} 186}
@@ -198,24 +199,24 @@ fn test() {
198} 199}
199"#), 200"#),
200 @r###" 201 @r###"
201 11..12 'x': &[T] 202 10..11 'x': &[T]
202 28..39 '{ loop {} }': &[T] 203 27..38 '{ loop {} }': &[T]
203 30..37 'loop {}': ! 204 29..36 'loop {}': !
204 35..37 '{}': () 205 34..36 '{}': ()
205 50..126 '{ ... }; }': () 206 49..125 '{ ... }; }': ()
206 60..61 'x': &[i32] 207 59..60 'x': &[i32]
207 64..123 'if tru... }': &[i32] 208 63..122 'if tru... }': &[i32]
208 67..71 'true': bool 209 66..70 'true': bool
209 72..97 '{ ... }': &[i32] 210 71..96 '{ ... }': &[i32]
210 82..85 'foo': fn foo<i32>(&[i32]) -> &[i32] 211 81..84 'foo': fn foo<i32>(&[i32]) -> &[i32]
211 82..91 'foo(&[1])': &[i32] 212 81..90 'foo(&[1])': &[i32]
212 86..90 '&[1]': &[i32; _] 213 85..89 '&[1]': &[i32; _]
213 87..90 '[1]': [i32; _] 214 86..89 '[1]': [i32; _]
214 88..89 '1': i32 215 87..88 '1': i32
215 103..123 '{ ... }': &[i32; _] 216 102..122 '{ ... }': &[i32; _]
216 113..117 '&[1]': &[i32; _] 217 112..116 '&[1]': &[i32; _]
217 114..117 '[1]': [i32; _] 218 113..116 '[1]': [i32; _]
218 115..116 '1': i32 219 114..115 '1': i32
219 "### 220 "###
220 ); 221 );
221} 222}
@@ -234,24 +235,24 @@ fn test() {
234} 235}
235"#), 236"#),
236 @r###" 237 @r###"
237 11..12 'x': &[T] 238 10..11 'x': &[T]
238 28..39 '{ loop {} }': &[T] 239 27..38 '{ loop {} }': &[T]
239 30..37 'loop {}': ! 240 29..36 'loop {}': !
240 35..37 '{}': () 241 34..36 '{}': ()
241 50..126 '{ ... }; }': () 242 49..125 '{ ... }; }': ()
242 60..61 'x': &[i32] 243 59..60 'x': &[i32]
243 64..123 'if tru... }': &[i32] 244 63..122 'if tru... }': &[i32]
244 67..71 'true': bool 245 66..70 'true': bool
245 72..92 '{ ... }': &[i32; _] 246 71..91 '{ ... }': &[i32; _]
246 82..86 '&[1]': &[i32; _] 247 81..85 '&[1]': &[i32; _]
247 83..86 '[1]': [i32; _] 248 82..85 '[1]': [i32; _]
248 84..85 '1': i32 249 83..84 '1': i32
249 98..123 '{ ... }': &[i32] 250 97..122 '{ ... }': &[i32]
250 108..111 'foo': fn foo<i32>(&[i32]) -> &[i32] 251 107..110 'foo': fn foo<i32>(&[i32]) -> &[i32]
251 108..117 'foo(&[1])': &[i32] 252 107..116 'foo(&[1])': &[i32]
252 112..116 '&[1]': &[i32; _] 253 111..115 '&[1]': &[i32; _]
253 113..116 '[1]': [i32; _] 254 112..115 '[1]': [i32; _]
254 114..115 '1': i32 255 113..114 '1': i32
255 "### 256 "###
256 ); 257 );
257} 258}
@@ -270,31 +271,31 @@ fn test(i: i32) {
270} 271}
271"#), 272"#),
272 @r###" 273 @r###"
273 11..12 'x': &[T] 274 10..11 'x': &[T]
274 28..39 '{ loop {} }': &[T] 275 27..38 '{ loop {} }': &[T]
275 30..37 'loop {}': ! 276 29..36 'loop {}': !
276 35..37 '{}': () 277 34..36 '{}': ()
277 48..49 'i': i32 278 47..48 'i': i32
278 56..150 '{ ... }; }': () 279 55..149 '{ ... }; }': ()
279 66..67 'x': &[i32] 280 65..66 'x': &[i32]
280 70..147 'match ... }': &[i32] 281 69..146 'match ... }': &[i32]
281 76..77 'i': i32 282 75..76 'i': i32
282 88..89 '2': i32 283 87..88 '2': i32
283 88..89 '2': i32 284 87..88 '2': i32
284 93..96 'foo': fn foo<i32>(&[i32]) -> &[i32] 285 92..95 'foo': fn foo<i32>(&[i32]) -> &[i32]
285 93..102 'foo(&[2])': &[i32] 286 92..101 'foo(&[2])': &[i32]
286 97..101 '&[2]': &[i32; _] 287 96..100 '&[2]': &[i32; _]
287 98..101 '[2]': [i32; _] 288 97..100 '[2]': [i32; _]
288 99..100 '2': i32 289 98..99 '2': i32
289 112..113 '1': i32 290 111..112 '1': i32
290 112..113 '1': i32 291 111..112 '1': i32
291 117..121 '&[1]': &[i32; _] 292 116..120 '&[1]': &[i32; _]
292 118..121 '[1]': [i32; _] 293 117..120 '[1]': [i32; _]
293 119..120 '1': i32 294 118..119 '1': i32
294 131..132 '_': i32 295 130..131 '_': i32
295 136..140 '&[3]': &[i32; _] 296 135..139 '&[3]': &[i32; _]
296 137..140 '[3]': [i32; _] 297 136..139 '[3]': [i32; _]
297 138..139 '3': i32 298 137..138 '3': i32
298 "### 299 "###
299 ); 300 );
300} 301}
@@ -313,31 +314,31 @@ fn test(i: i32) {
313} 314}
314"#), 315"#),
315 @r###" 316 @r###"
316 11..12 'x': &[T] 317 10..11 'x': &[T]
317 28..39 '{ loop {} }': &[T] 318 27..38 '{ loop {} }': &[T]
318 30..37 'loop {}': ! 319 29..36 'loop {}': !
319 35..37 '{}': () 320 34..36 '{}': ()
320 48..49 'i': i32 321 47..48 'i': i32
321 56..150 '{ ... }; }': () 322 55..149 '{ ... }; }': ()
322 66..67 'x': &[i32] 323 65..66 'x': &[i32]
323 70..147 'match ... }': &[i32] 324 69..146 'match ... }': &[i32]
324 76..77 'i': i32 325 75..76 'i': i32
325 88..89 '1': i32 326 87..88 '1': i32
326 88..89 '1': i32 327 87..88 '1': i32
327 93..97 '&[1]': &[i32; _] 328 92..96 '&[1]': &[i32; _]
328 94..97 '[1]': [i32; _] 329 93..96 '[1]': [i32; _]
329 95..96 '1': i32 330 94..95 '1': i32
330 107..108 '2': i32 331 106..107 '2': i32
331 107..108 '2': i32 332 106..107 '2': i32
332 112..115 'foo': fn foo<i32>(&[i32]) -> &[i32] 333 111..114 'foo': fn foo<i32>(&[i32]) -> &[i32]
333 112..121 'foo(&[2])': &[i32] 334 111..120 'foo(&[2])': &[i32]
334 116..120 '&[2]': &[i32; _] 335 115..119 '&[2]': &[i32; _]
335 117..120 '[2]': [i32; _] 336 116..119 '[2]': [i32; _]
336 118..119 '2': i32 337 117..118 '2': i32
337 131..132 '_': i32 338 130..131 '_': i32
338 136..140 '&[3]': &[i32; _] 339 135..139 '&[3]': &[i32; _]
339 137..140 '[3]': [i32; _] 340 136..139 '[3]': [i32; _]
340 138..139 '3': i32 341 137..138 '3': i32
341 "### 342 "###
342 ); 343 );
343} 344}
@@ -358,24 +359,24 @@ fn test() {
358} 359}
359"#), 360"#),
360 @r###" 361 @r###"
361 11..145 '{ ... }; }': () 362 10..144 '{ ... }; }': ()
362 21..22 't': &mut i32 363 20..21 't': &mut i32
363 25..31 '&mut 1': &mut i32 364 24..30 '&mut 1': &mut i32
364 30..31 '1': i32 365 29..30 '1': i32
365 41..42 'x': *const i32 366 40..41 'x': *const i32
366 45..142 'match ... }': *const i32 367 44..141 'match ... }': *const i32
367 51..52 '1': i32 368 50..51 '1': i32
368 63..64 '1': i32 369 62..63 '1': i32
369 63..64 '1': i32 370 62..63 '1': i32
370 68..69 't': &mut i32 371 67..68 't': &mut i32
371 68..81 't as *mut i32': *mut i32 372 67..80 't as *mut i32': *mut i32
372 91..92 '2': i32 373 90..91 '2': i32
373 91..92 '2': i32 374 90..91 '2': i32
374 96..97 't': &mut i32 375 95..96 't': &mut i32
375 96..105 't as &i32': &i32 376 95..104 't as &i32': &i32
376 115..116 '_': i32 377 114..115 '_': i32
377 120..121 't': &mut i32 378 119..120 't': &mut i32
378 120..135 't as *const i32': *const i32 379 119..134 't as *const i32': *const i32
379 "### 380 "###
380 ); 381 );
381} 382}
@@ -389,9 +390,9 @@ fn foo() -> u32 {
389} 390}
390"#, true), 391"#, true),
391 @r###" 392 @r###"
392 17..40 '{ ...own; }': u32 393 16..39 '{ ...own; }': u32
393 23..37 'return unknown': ! 394 22..36 'return unknown': !
394 30..37 'unknown': u32 395 29..36 'unknown': u32
395 "### 396 "###
396 ); 397 );
397} 398}
@@ -409,24 +410,24 @@ fn test() {
409} 410}
410"#, true), 411"#, true),
411 @r###" 412 @r###"
412 30..31 'x': &Foo 413 29..30 'x': &Foo
413 39..41 '{}': () 414 38..40 '{}': ()
414 52..133 '{ ...oo); }': () 415 51..132 '{ ...oo); }': ()
415 58..71 'takes_ref_foo': fn takes_ref_foo(&Foo) 416 57..70 'takes_ref_foo': fn takes_ref_foo(&Foo)
416 58..77 'takes_...(&Foo)': () 417 57..76 'takes_...(&Foo)': ()
417 72..76 '&Foo': &Foo 418 71..75 '&Foo': &Foo
418 73..76 'Foo': Foo 419 72..75 'Foo': Foo
419 83..96 'takes_ref_foo': fn takes_ref_foo(&Foo) 420 82..95 'takes_ref_foo': fn takes_ref_foo(&Foo)
420 83..103 'takes_...&&Foo)': () 421 82..102 'takes_...&&Foo)': ()
421 97..102 '&&Foo': &&Foo 422 96..101 '&&Foo': &&Foo
422 98..102 '&Foo': &Foo 423 97..101 '&Foo': &Foo
423 99..102 'Foo': Foo 424 98..101 'Foo': Foo
424 109..122 'takes_ref_foo': fn takes_ref_foo(&Foo) 425 108..121 'takes_ref_foo': fn takes_ref_foo(&Foo)
425 109..130 'takes_...&&Foo)': () 426 108..129 'takes_...&&Foo)': ()
426 123..129 '&&&Foo': &&&Foo 427 122..128 '&&&Foo': &&&Foo
427 124..129 '&&Foo': &&Foo 428 123..128 '&&Foo': &&Foo
428 125..129 '&Foo': &Foo 429 124..128 '&Foo': &Foo
429 126..129 'Foo': Foo 430 125..128 'Foo': Foo
430 "### 431 "###
431 ); 432 );
432} 433}
@@ -444,26 +445,26 @@ fn test() {
444} 445}
445"#, true), 446"#, true),
446 @r###" 447 @r###"
447 29..30 'x': &T 448 28..29 'x': &T
448 41..47 '{ *x }': T 449 40..46 '{ *x }': T
449 43..45 '*x': T 450 42..44 '*x': T
450 44..45 'x': &T 451 43..44 'x': &T
451 58..127 '{ ...oo); }': () 452 57..126 '{ ...oo); }': ()
452 64..73 'takes_ref': fn takes_ref<Foo>(&Foo) -> Foo 453 63..72 'takes_ref': fn takes_ref<Foo>(&Foo) -> Foo
453 64..79 'takes_ref(&Foo)': Foo 454 63..78 'takes_ref(&Foo)': Foo
454 74..78 '&Foo': &Foo 455 73..77 '&Foo': &Foo
455 75..78 'Foo': Foo 456 74..77 'Foo': Foo
456 85..94 'takes_ref': fn takes_ref<&Foo>(&&Foo) -> &Foo 457 84..93 'takes_ref': fn takes_ref<&Foo>(&&Foo) -> &Foo
457 85..101 'takes_...&&Foo)': &Foo 458 84..100 'takes_...&&Foo)': &Foo
458 95..100 '&&Foo': &&Foo 459 94..99 '&&Foo': &&Foo
459 96..100 '&Foo': &Foo 460 95..99 '&Foo': &Foo
460 97..100 'Foo': Foo 461 96..99 'Foo': Foo
461 107..116 'takes_ref': fn takes_ref<&&Foo>(&&&Foo) -> &&Foo 462 106..115 'takes_ref': fn takes_ref<&&Foo>(&&&Foo) -> &&Foo
462 107..124 'takes_...&&Foo)': &&Foo 463 106..123 'takes_...&&Foo)': &&Foo
463 117..123 '&&&Foo': &&&Foo 464 116..122 '&&&Foo': &&&Foo
464 118..123 '&&Foo': &&Foo 465 117..122 '&&Foo': &&Foo
465 119..123 '&Foo': &Foo 466 118..122 '&Foo': &Foo
466 120..123 'Foo': Foo 467 119..122 'Foo': Foo
467 "### 468 "###
468 ); 469 );
469} 470}
@@ -483,18 +484,18 @@ fn test() {
483} 484}
484"#, true), 485"#, true),
485 @r###" 486 @r###"
486 127..128 'x': &str 487 126..127 'x': &str
487 136..138 '{}': () 488 135..137 '{}': ()
488 169..180 '{ loop {} }': String 489 168..179 '{ loop {} }': String
489 171..178 'loop {}': ! 490 170..177 'loop {}': !
490 176..178 '{}': () 491 175..177 '{}': ()
491 191..236 '{ ... }); }': () 492 190..235 '{ ... }); }': ()
492 197..210 'takes_ref_str': fn takes_ref_str(&str) 493 196..209 'takes_ref_str': fn takes_ref_str(&str)
493 197..233 'takes_...g() })': () 494 196..232 'takes_...g() })': ()
494 211..232 '&{ ret...ng() }': &String 495 210..231 '&{ ret...ng() }': &String
495 212..232 '{ retu...ng() }': String 496 211..231 '{ retu...ng() }': String
496 214..228 'returns_string': fn returns_string() -> String 497 213..227 'returns_string': fn returns_string() -> String
497 214..230 'return...ring()': String 498 213..229 'return...ring()': String
498 "### 499 "###
499 ); 500 );
500} 501}
@@ -513,19 +514,19 @@ fn foo() {
513} 514}
514"#, true), 515"#, true),
515 @r###" 516 @r###"
516 10..106 '{ ... }; }': () 517 9..105 '{ ... }; }': ()
517 20..21 'x': || -> &u32 518 19..20 'x': || -> &u32
518 24..103 '|| { ... }': || -> &u32 519 23..102 '|| { ... }': || -> &u32
519 27..103 '{ ... }': &u32 520 26..102 '{ ... }': &u32
520 37..82 'if tru... }': () 521 36..81 'if tru... }': ()
521 40..44 'true': bool 522 39..43 'true': bool
522 45..82 '{ ... }': () 523 44..81 '{ ... }': ()
523 59..71 'return &1u32': ! 524 58..70 'return &1u32': !
524 66..71 '&1u32': &u32 525 65..70 '&1u32': &u32
525 67..71 '1u32': u32 526 66..70 '1u32': u32
526 91..97 '&&1u32': &&u32 527 90..96 '&&1u32': &&u32
527 92..97 '&1u32': &u32 528 91..96 '&1u32': &u32
528 93..97 '1u32': u32 529 92..96 '1u32': u32
529 "### 530 "###
530 ); 531 );
531} 532}
@@ -540,12 +541,12 @@ fn test() {
540} 541}
541"#, true), 542"#, true),
542 @r###" 543 @r###"
543 8..9 'x': u32 544 7..8 'x': u32
544 25..30 '{ 1 }': isize 545 24..29 '{ 1 }': isize
545 27..28 '1': isize 546 26..27 '1': isize
546 41..79 '{ ...foo; }': () 547 40..78 '{ ...foo; }': ()
547 51..52 'f': fn(u32) -> isize 548 50..51 'f': fn(u32) -> isize
548 73..76 'foo': fn foo(u32) -> isize 549 72..75 'foo': fn foo(u32) -> isize
549 "### 550 "###
550 ); 551 );
551} 552}
@@ -567,27 +568,27 @@ fn test() {
567} 568}
568"#, true), 569"#, true),
569 @r###" 570 @r###"
570 9..10 'x': u32 571 8..9 'x': u32
571 26..31 '{ 1 }': isize 572 25..30 '{ 1 }': isize
572 28..29 '1': isize 573 27..28 '1': isize
573 40..41 'x': u32 574 39..40 'x': u32
574 57..62 '{ 2 }': isize 575 56..61 '{ 2 }': isize
575 59..60 '2': isize 576 58..59 '2': isize
576 71..72 'x': u32 577 70..71 'x': u32
577 88..93 '{ 3 }': isize 578 87..92 '{ 3 }': isize
578 90..91 '3': isize 579 89..90 '3': isize
579 104..193 '{ ... }; }': () 580 103..192 '{ ... }; }': ()
580 114..115 'x': fn(u32) -> isize 581 113..114 'x': fn(u32) -> isize
581 118..190 'match ... }': fn(u32) -> isize 582 117..189 'match ... }': fn(u32) -> isize
582 124..125 '1': i32 583 123..124 '1': i32
583 136..137 '1': i32 584 135..136 '1': i32
584 136..137 '1': i32 585 135..136 '1': i32
585 141..145 'foo1': fn foo1(u32) -> isize 586 140..144 'foo1': fn foo1(u32) -> isize
586 155..156 '2': i32 587 154..155 '2': i32
587 155..156 '2': i32 588 154..155 '2': i32
588 160..164 'foo2': fn foo2(u32) -> isize 589 159..163 'foo2': fn foo2(u32) -> isize
589 174..175 '_': i32 590 173..174 '_': i32
590 179..183 'foo3': fn foo3(u32) -> isize 591 178..182 'foo3': fn foo3(u32) -> isize
591 "### 592 "###
592 ); 593 );
593} 594}
@@ -601,12 +602,12 @@ fn test() {
601} 602}
602"#, true), 603"#, true),
603 @r###" 604 @r###"
604 11..55 '{ ...1 }; }': () 605 10..54 '{ ...1 }; }': ()
605 21..22 'f': fn(u32) -> isize 606 20..21 'f': fn(u32) -> isize
606 43..52 '|x| { 1 }': |u32| -> isize 607 42..51 '|x| { 1 }': |u32| -> isize
607 44..45 'x': u32 608 43..44 'x': u32
608 47..52 '{ 1 }': isize 609 46..51 '{ 1 }': isize
609 49..50 '1': isize 610 48..49 '1': isize
610 "### 611 "###
611 ); 612 );
612} 613}
@@ -624,11 +625,11 @@ impl<TT> S<TT> {
624} 625}
625"#, true), 626"#, true),
626 @r###" 627 @r###"
627 51..55 'self': &S<TT> 628 50..54 'self': &S<TT>
628 64..87 '{ ... }': &TT 629 63..86 '{ ... }': &TT
629 74..81 '&self.t': &TT 630 73..80 '&self.t': &TT
630 75..79 'self': &S<TT> 631 74..78 'self': &S<TT>
631 75..81 'self.t': TT 632 74..80 'self.t': TT
632 "### 633 "###
633 ); 634 );
634} 635}
@@ -649,21 +650,69 @@ fn test() {
649} 650}
650"#, true), 651"#, true),
651 @r###" 652 @r###"
652 162..199 '{ ... 3]; }': () 653 161..198 '{ ... 3]; }': ()
653 172..173 'f': &[usize] 654 171..172 'f': &[usize]
654 186..196 '&[1, 2, 3]': &[usize; _] 655 185..195 '&[1, 2, 3]': &[usize; _]
655 187..196 '[1, 2, 3]': [usize; _] 656 186..195 '[1, 2, 3]': [usize; _]
656 188..189 '1': usize 657 187..188 '1': usize
657 191..192 '2': usize 658 190..191 '2': usize
658 194..195 '3': usize 659 193..194 '3': usize
660 "###
661 );
662}
663
664#[test]
665fn coerce_unsize_trait_object_simple() {
666 assert_snapshot!(
667 infer_with_mismatches(r#"
668#[lang = "sized"]
669pub trait Sized {}
670#[lang = "unsize"]
671pub trait Unsize<T> {}
672#[lang = "coerce_unsized"]
673pub trait CoerceUnsized<T> {}
674
675impl<T: Unsize<U>, U> CoerceUnsized<&U> for &T {}
676
677trait Foo<T, U> {}
678trait Bar<U, T, X>: Foo<T, U> {}
679trait Baz<T, X>: Bar<usize, T, X> {}
680
681struct S<T, X>;
682impl<T, X> Foo<T, usize> for S<T, X> {}
683impl<T, X> Bar<usize, T, X> for S<T, X> {}
684impl<T, X> Baz<T, X> for S<T, X> {}
685
686fn test() {
687 let obj: &dyn Baz<i8, i16> = &S;
688 let obj: &dyn Bar<_, i8, i16> = &S;
689 let obj: &dyn Foo<i8, _> = &S;
690}
691"#, true),
692 @r###"
693 424..539 '{ ... &S; }': ()
694 434..437 'obj': &dyn Baz<i8, i16>
695 459..461 '&S': &S<i8, i16>
696 460..461 'S': S<i8, i16>
697 471..474 'obj': &dyn Bar<usize, i8, i16>
698 499..501 '&S': &S<i8, i16>
699 500..501 'S': S<i8, i16>
700 511..514 'obj': &dyn Foo<i8, usize>
701 534..536 '&S': &S<i8, {unknown}>
702 535..536 'S': S<i8, {unknown}>
659 "### 703 "###
660 ); 704 );
661} 705}
662 706
663#[test] 707#[test]
664fn coerce_unsize_trait_object() { 708// The rust reference says this should be possible, but rustc doesn't implement
709// it. We used to support it, but Chalk doesn't.
710#[ignore]
711fn coerce_unsize_trait_object_to_trait_object() {
665 assert_snapshot!( 712 assert_snapshot!(
666 infer_with_mismatches(r#" 713 infer_with_mismatches(r#"
714#[lang = "sized"]
715pub trait Sized {}
667#[lang = "unsize"] 716#[lang = "unsize"]
668pub trait Unsize<T> {} 717pub trait Unsize<T> {}
669#[lang = "coerce_unsized"] 718#[lang = "coerce_unsized"]
@@ -689,19 +738,19 @@ fn test() {
689} 738}
690"#, true), 739"#, true),
691 @r###" 740 @r###"
692 388..573 '{ ...bj2; }': () 741 424..609 '{ ...bj2; }': ()
693 398..401 'obj': &dyn Baz<i8, i16> 742 434..437 'obj': &dyn Baz<i8, i16>
694 423..425 '&S': &S<i8, i16> 743 459..461 '&S': &S<i8, i16>
695 424..425 'S': S<i8, i16> 744 460..461 'S': S<i8, i16>
696 435..438 'obj': &dyn Bar<usize, i8, i16> 745 471..474 'obj': &dyn Bar<usize, i8, i16>
697 460..463 'obj': &dyn Baz<i8, i16> 746 496..499 'obj': &dyn Baz<i8, i16>
698 473..476 'obj': &dyn Foo<i8, usize> 747 509..512 'obj': &dyn Foo<i8, usize>
699 495..498 'obj': &dyn Bar<usize, i8, i16> 748 531..534 'obj': &dyn Bar<usize, i8, i16>
700 508..512 'obj2': &dyn Baz<i8, i16> 749 544..548 'obj2': &dyn Baz<i8, i16>
701 534..536 '&S': &S<i8, i16> 750 570..572 '&S': &S<i8, i16>
702 535..536 'S': S<i8, i16> 751 571..572 'S': S<i8, i16>
703 546..547 '_': &dyn Foo<i8, usize> 752 582..583 '_': &dyn Foo<i8, usize>
704 566..570 'obj2': &dyn Baz<i8, i16> 753 602..606 'obj2': &dyn Baz<i8, i16>
705 "### 754 "###
706 ); 755 );
707} 756}
@@ -710,6 +759,8 @@ fn test() {
710fn coerce_unsize_super_trait_cycle() { 759fn coerce_unsize_super_trait_cycle() {
711 assert_snapshot!( 760 assert_snapshot!(
712 infer_with_mismatches(r#" 761 infer_with_mismatches(r#"
762#[lang = "sized"]
763pub trait Sized {}
713#[lang = "unsize"] 764#[lang = "unsize"]
714pub trait Unsize<T> {} 765pub trait Unsize<T> {}
715#[lang = "coerce_unsized"] 766#[lang = "coerce_unsized"]
@@ -730,16 +781,17 @@ impl D for S {}
730 781
731fn test() { 782fn test() {
732 let obj: &dyn D = &S; 783 let obj: &dyn D = &S;
733 let obj: &dyn A = obj; 784 let obj: &dyn A = &S;
734} 785}
735"#, true), 786"#, true),
736 @r###" 787 @r###"
737 292..348 '{ ...obj; }': () 788 328..383 '{ ... &S; }': ()
738 302..305 'obj': &dyn D 789 338..341 'obj': &dyn D
739 316..318 '&S': &S 790 352..354 '&S': &S
740 317..318 'S': S 791 353..354 'S': S
741 328..331 'obj': &dyn A 792 364..367 'obj': &dyn A
742 342..345 'obj': &dyn D 793 378..380 '&S': &S
794 379..380 'S': S
743 "### 795 "###
744 ); 796 );
745} 797}