]> git.lizzy.rs Git - rust.git/blob - crates/hir_ty/src/tests/traits.rs
internal: switch some tests to minicore
[rust.git] / crates / hir_ty / src / tests / traits.rs
1 use expect_test::expect;
2
3 use super::{check_infer, check_infer_with_mismatches, check_types};
4
5 #[test]
6 fn infer_await() {
7     check_types(
8         r#"
9 //- minicore: future
10 struct IntFuture;
11
12 impl core::future::Future for IntFuture {
13     type Output = u64;
14 }
15
16 fn test() {
17     let r = IntFuture;
18     let v = r.await;
19     v;
20 } //^ u64
21 "#,
22     );
23 }
24
25 #[test]
26 fn infer_async() {
27     check_types(
28         r#"
29 //- minicore: future
30 async fn foo() -> u64 { 128 }
31
32 fn test() {
33     let r = foo();
34     let v = r.await;
35     v;
36 } //^ u64
37 "#,
38     );
39 }
40
41 #[test]
42 fn infer_desugar_async() {
43     check_types(
44         r#"
45 //- minicore: future
46 async fn foo() -> u64 { 128 }
47
48 fn test() {
49     let r = foo();
50     r;
51 } //^ impl Future<Output = u64>
52 "#,
53     );
54 }
55
56 #[test]
57 fn infer_async_block() {
58     check_types(
59         r#"
60 //- minicore: future, option
61 async fn test() {
62     let a = async { 42 };
63     a;
64 //  ^ impl Future<Output = i32>
65     let x = a.await;
66     x;
67 //  ^ i32
68     let b = async {}.await;
69     b;
70 //  ^ ()
71     let c = async {
72         let y = None;
73         y
74     //  ^ Option<u64>
75     };
76     let _: Option<u64> = c.await;
77     c;
78 //  ^ impl Future<Output = Option<u64>>
79 }
80 "#,
81     );
82 }
83
84 #[test]
85 fn infer_try() {
86     check_types(
87         r#"
88 //- /main.rs crate:main deps:core
89 fn test() {
90     let r: Result<i32, u64> = Result::Ok(1);
91     let v = r?;
92     v;
93 } //^ i32
94
95 //- /core.rs crate:core
96 pub mod ops {
97     pub trait Try {
98         type Ok;
99         type Error;
100     }
101 }
102
103 pub mod result {
104     pub enum Result<O, E> {
105         Ok(O),
106         Err(E)
107     }
108
109     impl<O, E> crate::ops::Try for Result<O, E> {
110         type Ok = O;
111         type Error = E;
112     }
113 }
114
115 pub mod prelude {
116     pub mod rust_2018 {
117         pub use crate::{result::*, ops::*};
118     }
119 }
120 "#,
121     );
122 }
123
124 #[test]
125 fn infer_try_trait_v2() {
126     check_types(
127         r#"
128 //- /main.rs crate:main deps:core
129 fn test() {
130     let r: Result<i32, u64> = Result::Ok(1);
131     let v = r?;
132     v;
133 } //^ i32
134
135 //- /core.rs crate:core
136 mod ops {
137     mod try_trait {
138         pub trait Try: FromResidual {
139             type Output;
140             type Residual;
141         }
142         pub trait FromResidual<R = <Self as Try>::Residual> {}
143     }
144
145     pub use self::try_trait::FromResidual;
146     pub use self::try_trait::Try;
147 }
148
149 mov convert {
150     pub trait From<T> {}
151     impl<T> From<T> for T {}
152 }
153
154 pub mod result {
155     use crate::convert::From;
156     use crate::ops::{Try, FromResidual};
157
158     pub enum Infallible {}
159     pub enum Result<O, E> {
160         Ok(O),
161         Err(E)
162     }
163
164     impl<O, E> Try for Result<O, E> {
165         type Output = O;
166         type Error = Result<Infallible, E>;
167     }
168
169     impl<T, E, F: From<E>> FromResidual<Result<Infallible, E>> for Result<T, F> {}
170 }
171
172 pub mod prelude {
173     pub mod rust_2018 {
174         pub use crate::result::*;
175     }
176 }
177 "#,
178     );
179 }
180
181 #[test]
182 fn infer_for_loop() {
183     check_types(
184         r#"
185 //- /main.rs crate:main deps:core,alloc
186 #![no_std]
187 use alloc::collections::Vec;
188
189 fn test() {
190     let v = Vec::new();
191     v.push("foo");
192     for x in v {
193         x;
194     } //^ &str
195 }
196
197 //- /core.rs crate:core
198 pub mod iter {
199     pub trait IntoIterator {
200         type Item;
201     }
202 }
203 pub mod prelude {
204     pub mod rust_2018 {
205         pub use crate::iter::*;
206     }
207 }
208
209 //- /alloc.rs crate:alloc deps:core
210 #![no_std]
211 mod collections {
212     struct Vec<T> {}
213     impl<T> Vec<T> {
214         pub fn new() -> Self { Vec {} }
215         pub fn push(&mut self, t: T) { }
216     }
217
218     impl<T> IntoIterator for Vec<T> {
219         type Item=T;
220     }
221 }
222 "#,
223     );
224 }
225
226 #[test]
227 fn infer_ops_neg() {
228     check_types(
229         r#"
230 //- /main.rs crate:main deps:std
231 struct Bar;
232 struct Foo;
233
234 impl std::ops::Neg for Bar {
235     type Output = Foo;
236 }
237
238 fn test() {
239     let a = Bar;
240     let b = -a;
241     b;
242 } //^ Foo
243
244 //- /std.rs crate:std
245 #[prelude_import] use ops::*;
246 mod ops {
247     #[lang = "neg"]
248     pub trait Neg {
249         type Output;
250     }
251 }
252 "#,
253     );
254 }
255
256 #[test]
257 fn infer_ops_not() {
258     check_types(
259         r#"
260 //- /main.rs crate:main deps:std
261 struct Bar;
262 struct Foo;
263
264 impl std::ops::Not for Bar {
265     type Output = Foo;
266 }
267
268 fn test() {
269     let a = Bar;
270     let b = !a;
271     b;
272 } //^ Foo
273
274 //- /std.rs crate:std
275 #[prelude_import] use ops::*;
276 mod ops {
277     #[lang = "not"]
278     pub trait Not {
279         type Output;
280     }
281 }
282 "#,
283     );
284 }
285
286 #[test]
287 fn infer_from_bound_1() {
288     check_infer(
289         r#"
290 trait Trait<T> {}
291 struct S<T>(T);
292 impl<U> Trait<U> for S<U> {}
293 fn foo<T: Trait<u32>>(t: T) {}
294 fn test() {
295     let s = S(unknown);
296     foo(s);
297 }"#,
298         expect![[r#"
299             85..86 't': T
300             91..93 '{}': ()
301             104..143 '{     ...(s); }': ()
302             114..115 's': S<u32>
303             118..119 'S': S<u32>(u32) -> S<u32>
304             118..128 'S(unknown)': S<u32>
305             120..127 'unknown': u32
306             134..137 'foo': fn foo<S<u32>>(S<u32>)
307             134..140 'foo(s)': ()
308             138..139 's': S<u32>
309         "#]],
310     );
311 }
312
313 #[test]
314 fn infer_from_bound_2() {
315     check_infer(
316         r#"
317 trait Trait<T> {}
318 struct S<T>(T);
319 impl<U> Trait<U> for S<U> {}
320 fn foo<U, T: Trait<U>>(t: T) -> U {}
321 fn test() {
322     let s = S(unknown);
323     let x: u32 = foo(s);
324 }"#,
325         expect![[r#"
326             86..87 't': T
327             97..99 '{}': ()
328             110..162 '{     ...(s); }': ()
329             120..121 's': S<u32>
330             124..125 'S': S<u32>(u32) -> S<u32>
331             124..134 'S(unknown)': S<u32>
332             126..133 'unknown': u32
333             144..145 'x': u32
334             153..156 'foo': fn foo<u32, S<u32>>(S<u32>) -> u32
335             153..159 'foo(s)': u32
336             157..158 's': S<u32>
337         "#]],
338     );
339 }
340
341 #[test]
342 fn trait_default_method_self_bound_implements_trait() {
343     cov_mark::check!(trait_self_implements_self);
344     check_infer(
345         r#"
346 trait Trait {
347     fn foo(&self) -> i64;
348     fn bar(&self) -> {
349         let x = self.foo();
350     }
351 }"#,
352         expect![[r#"
353             26..30 'self': &Self
354             52..56 'self': &Self
355             61..96 '{     ...     }': ()
356             75..76 'x': i64
357             79..83 'self': &Self
358             79..89 'self.foo()': i64
359         "#]],
360     );
361 }
362
363 #[test]
364 fn trait_default_method_self_bound_implements_super_trait() {
365     check_infer(
366         r#"
367 trait SuperTrait {
368     fn foo(&self) -> i64;
369 }
370 trait Trait: SuperTrait {
371     fn bar(&self) -> {
372         let x = self.foo();
373     }
374 }"#,
375         expect![[r#"
376             31..35 'self': &Self
377             85..89 'self': &Self
378             94..129 '{     ...     }': ()
379             108..109 'x': i64
380             112..116 'self': &Self
381             112..122 'self.foo()': i64
382         "#]],
383     );
384 }
385
386 #[test]
387 fn infer_project_associated_type() {
388     check_infer(
389         r#"
390 trait Iterable {
391     type Item;
392 }
393 struct S;
394 impl Iterable for S { type Item = u32; }
395 fn test<T: Iterable>() {
396     let x: <S as Iterable>::Item = 1;
397     let y: <T as Iterable>::Item = no_matter;
398     let z: T::Item = no_matter;
399     let a: <T>::Item = no_matter;
400 }"#,
401         expect![[r#"
402             108..261 '{     ...ter; }': ()
403             118..119 'x': u32
404             145..146 '1': u32
405             156..157 'y': Iterable::Item<T>
406             183..192 'no_matter': Iterable::Item<T>
407             202..203 'z': Iterable::Item<T>
408             215..224 'no_matter': Iterable::Item<T>
409             234..235 'a': Iterable::Item<T>
410             249..258 'no_matter': Iterable::Item<T>
411         "#]],
412     );
413 }
414
415 #[test]
416 fn infer_return_associated_type() {
417     check_infer(
418         r#"
419 trait Iterable {
420     type Item;
421 }
422 struct S;
423 impl Iterable for S { type Item = u32; }
424 fn foo1<T: Iterable>(t: T) -> T::Item {}
425 fn foo2<T: Iterable>(t: T) -> <T as Iterable>::Item {}
426 fn foo3<T: Iterable>(t: T) -> <T>::Item {}
427 fn test() {
428     let x = foo1(S);
429     let y = foo2(S);
430     let z = foo3(S);
431 }"#,
432         expect![[r#"
433             106..107 't': T
434             123..125 '{}': ()
435             147..148 't': T
436             178..180 '{}': ()
437             202..203 't': T
438             221..223 '{}': ()
439             234..300 '{     ...(S); }': ()
440             244..245 'x': u32
441             248..252 'foo1': fn foo1<S>(S) -> <S as Iterable>::Item
442             248..255 'foo1(S)': u32
443             253..254 'S': S
444             265..266 'y': u32
445             269..273 'foo2': fn foo2<S>(S) -> <S as Iterable>::Item
446             269..276 'foo2(S)': u32
447             274..275 'S': S
448             286..287 'z': u32
449             290..294 'foo3': fn foo3<S>(S) -> <S as Iterable>::Item
450             290..297 'foo3(S)': u32
451             295..296 'S': S
452         "#]],
453     );
454 }
455
456 #[test]
457 fn infer_associated_type_bound() {
458     check_infer(
459         r#"
460 trait Iterable {
461     type Item;
462 }
463 fn test<T: Iterable<Item=u32>>() {
464     let y: T::Item = unknown;
465 }"#,
466         expect![[r#"
467             67..100 '{     ...own; }': ()
468             77..78 'y': u32
469             90..97 'unknown': u32
470         "#]],
471     );
472 }
473
474 #[test]
475 fn infer_const_body() {
476     check_infer(
477         r#"
478 const A: u32 = 1 + 1;
479 static B: u64 = { let x = 1; x };"#,
480         expect![[r#"
481             15..16 '1': u32
482             15..20 '1 + 1': u32
483             19..20 '1': u32
484             38..54 '{ let ...1; x }': u64
485             44..45 'x': u64
486             48..49 '1': u64
487             51..52 'x': u64
488         "#]],
489     );
490 }
491
492 #[test]
493 fn tuple_struct_fields() {
494     check_infer(
495         r#"
496 struct S(i32, u64);
497 fn test() -> u64 {
498     let a = S(4, 6);
499     let b = a.0;
500     a.1
501 }"#,
502         expect![[r#"
503             37..86 '{     ... a.1 }': u64
504             47..48 'a': S
505             51..52 'S': S(i32, u64) -> S
506             51..58 'S(4, 6)': S
507             53..54 '4': i32
508             56..57 '6': u64
509             68..69 'b': i32
510             72..73 'a': S
511             72..75 'a.0': i32
512             81..82 'a': S
513             81..84 'a.1': u64
514         "#]],
515     );
516 }
517
518 #[test]
519 fn tuple_struct_with_fn() {
520     check_infer(
521         r#"
522 struct S(fn(u32) -> u64);
523 fn test() -> u64 {
524     let a = S(|i| 2*i);
525     let b = a.0(4);
526     a.0(2)
527 }"#,
528         expect![[r#"
529             43..101 '{     ...0(2) }': u64
530             53..54 'a': S
531             57..58 'S': S(fn(u32) -> u64) -> S
532             57..67 'S(|i| 2*i)': S
533             59..66 '|i| 2*i': |u32| -> u64
534             60..61 'i': u32
535             63..64 '2': u32
536             63..66 '2*i': u32
537             65..66 'i': u32
538             77..78 'b': u64
539             81..82 'a': S
540             81..84 'a.0': fn(u32) -> u64
541             81..87 'a.0(4)': u64
542             85..86 '4': u32
543             93..94 'a': S
544             93..96 'a.0': fn(u32) -> u64
545             93..99 'a.0(2)': u64
546             97..98 '2': u32
547         "#]],
548     );
549 }
550
551 #[test]
552 fn indexing_arrays() {
553     check_infer(
554         "fn main() { &mut [9][2]; }",
555         expect![[r#"
556             10..26 '{ &mut...[2]; }': ()
557             12..23 '&mut [9][2]': &mut {unknown}
558             17..20 '[9]': [i32; 1]
559             17..23 '[9][2]': {unknown}
560             18..19 '9': i32
561             21..22 '2': i32
562         "#]],
563     )
564 }
565
566 #[test]
567 fn infer_ops_index() {
568     check_types(
569         r#"
570 //- /main.rs crate:main deps:std
571 struct Bar;
572 struct Foo;
573
574 impl std::ops::Index<u32> for Bar {
575     type Output = Foo;
576 }
577
578 fn test() {
579     let a = Bar;
580     let b = a[1u32];
581     b;
582 } //^ Foo
583
584 //- /std.rs crate:std
585 #[prelude_import] use ops::*;
586 mod ops {
587     #[lang = "index"]
588     pub trait Index<Idx> {
589         type Output;
590     }
591 }
592 "#,
593     );
594 }
595
596 #[test]
597 fn infer_ops_index_int() {
598     check_types(
599         r#"
600 //- /main.rs crate:main deps:std
601 struct Bar;
602 struct Foo;
603
604 impl std::ops::Index<u32> for Bar {
605     type Output = Foo;
606 }
607
608 struct Range;
609 impl std::ops::Index<Range> for Bar {
610     type Output = Bar;
611 }
612
613 fn test() {
614     let a = Bar;
615     let b = a[1];
616     b;
617   //^ Foo
618 }
619
620 //- /std.rs crate:std
621 #[prelude_import] use ops::*;
622 mod ops {
623     #[lang = "index"]
624     pub trait Index<Idx> {
625         type Output;
626     }
627 }
628 "#,
629     );
630 }
631
632 #[test]
633 fn infer_ops_index_autoderef() {
634     check_types(
635         r#"
636 //- /main.rs crate:main deps:std
637 fn test() {
638     let a = &[1u32, 2, 3];
639     let b = a[1u32];
640     b;
641 } //^ u32
642
643 //- /std.rs crate:std
644 impl<T> ops::Index<u32> for [T] {
645     type Output = T;
646 }
647
648 #[prelude_import] use ops::*;
649 mod ops {
650     #[lang = "index"]
651     pub trait Index<Idx> {
652         type Output;
653     }
654 }
655 "#,
656     );
657 }
658
659 #[test]
660 fn deref_trait() {
661     check_types(
662         r#"
663 //- minicore: deref
664 struct Arc<T>;
665 impl<T> core::ops::Deref for Arc<T> {
666     type Target = T;
667 }
668
669 struct S;
670 impl S {
671     fn foo(&self) -> u128 {}
672 }
673
674 fn test(s: Arc<S>) {
675     (*s, s.foo());
676 } //^ (S, u128)
677 "#,
678     );
679 }
680
681 #[test]
682 fn deref_trait_with_inference_var() {
683     check_types(
684         r#"
685 //- minicore: deref
686 struct Arc<T>;
687 fn new_arc<T>() -> Arc<T> {}
688 impl<T> core::ops::Deref for Arc<T> {
689     type Target = T;
690 }
691
692 struct S;
693 fn foo(a: Arc<S>) {}
694
695 fn test() {
696     let a = new_arc();
697     let b = (*a);
698           //^ S
699     foo(a);
700 }
701 "#,
702     );
703 }
704
705 #[test]
706 fn deref_trait_infinite_recursion() {
707     check_types(
708         r#"
709 //- minicore: deref
710 struct S;
711
712 impl core::ops::Deref for S {
713     type Target = S;
714 }
715
716 fn test(s: S) {
717     s.foo();
718 }       //^ {unknown}
719 "#,
720     );
721 }
722
723 #[test]
724 fn deref_trait_with_question_mark_size() {
725     check_types(
726         r#"
727 //- minicore: deref
728 struct Arc<T>;
729 impl<T: ?Sized> core::ops::Deref for Arc<T> {
730     type Target = T;
731 }
732
733 struct S;
734 impl S {
735     fn foo(&self) -> u128 {}
736 }
737
738 fn test(s: Arc<S>) {
739     (*s, s.foo());
740 } //^ (S, u128)
741 "#,
742     );
743 }
744
745 #[test]
746 fn obligation_from_function_clause() {
747     check_types(
748         r#"
749 struct S;
750
751 trait Trait<T> {}
752 impl Trait<u32> for S {}
753
754 fn foo<T: Trait<U>, U>(t: T) -> U {}
755
756 fn test(s: S) {
757     (foo(s));
758 } //^ u32
759 "#,
760     );
761 }
762
763 #[test]
764 fn obligation_from_method_clause() {
765     check_types(
766         r#"
767 //- /main.rs
768 struct S;
769
770 trait Trait<T> {}
771 impl Trait<isize> for S {}
772
773 struct O;
774 impl O {
775     fn foo<T: Trait<U>, U>(&self, t: T) -> U {}
776 }
777
778 fn test() {
779     O.foo(S);
780 }      //^ isize
781 "#,
782     );
783 }
784
785 #[test]
786 fn obligation_from_self_method_clause() {
787     check_types(
788         r#"
789 struct S;
790
791 trait Trait<T> {}
792 impl Trait<i64> for S {}
793
794 impl S {
795     fn foo<U>(&self) -> U where Self: Trait<U> {}
796 }
797
798 fn test() {
799     S.foo();
800 }       //^ i64
801 "#,
802     );
803 }
804
805 #[test]
806 fn obligation_from_impl_clause() {
807     check_types(
808         r#"
809 struct S;
810
811 trait Trait<T> {}
812 impl Trait<&str> for S {}
813
814 struct O<T>;
815 impl<U, T: Trait<U>> O<T> {
816     fn foo(&self) -> U {}
817 }
818
819 fn test(o: O<S>) {
820     o.foo();
821 }       //^ &str
822 "#,
823     );
824 }
825
826 #[test]
827 fn generic_param_env_1() {
828     check_types(
829         r#"
830 trait Clone {}
831 trait Trait { fn foo(self) -> u128; }
832 struct S;
833 impl Clone for S {}
834 impl<T> Trait for T where T: Clone {}
835 fn test<T: Clone>(t: T) { t.foo(); }
836                              //^ u128
837 "#,
838     );
839 }
840
841 #[test]
842 fn generic_param_env_1_not_met() {
843     check_types(
844         r#"
845 //- /main.rs
846 trait Clone {}
847 trait Trait { fn foo(self) -> u128; }
848 struct S;
849 impl Clone for S {}
850 impl<T> Trait for T where T: Clone {}
851 fn test<T>(t: T) { t.foo(); }
852                        //^ {unknown}
853 "#,
854     );
855 }
856
857 #[test]
858 fn generic_param_env_2() {
859     check_types(
860         r#"
861 trait Trait { fn foo(self) -> u128; }
862 struct S;
863 impl Trait for S {}
864 fn test<T: Trait>(t: T) { t.foo(); }
865                               //^ u128
866 "#,
867     );
868 }
869
870 #[test]
871 fn generic_param_env_2_not_met() {
872     check_types(
873         r#"
874 trait Trait { fn foo(self) -> u128; }
875 struct S;
876 impl Trait for S {}
877 fn test<T>(t: T) { t.foo(); }
878                        //^ {unknown}
879 "#,
880     );
881 }
882
883 #[test]
884 fn generic_param_env_deref() {
885     check_types(
886         r#"
887 #[lang = "deref"]
888 trait Deref {
889     type Target;
890 }
891 trait Trait {}
892 impl<T> Deref for T where T: Trait {
893     type Target = i128;
894 }
895 fn test<T: Trait>(t: T) { (*t); }
896                         //^ i128
897 "#,
898     );
899 }
900
901 #[test]
902 fn associated_type_placeholder() {
903     // inside the generic function, the associated type gets normalized to a placeholder `ApplL::Out<T>` [https://rust-lang.github.io/rustc-guide/traits/associated-types.html#placeholder-associated-types].
904     check_types(
905         r#"
906 pub trait ApplyL {
907     type Out;
908 }
909
910 pub struct RefMutL<T>;
911
912 impl<T> ApplyL for RefMutL<T> {
913     type Out = <T as ApplyL>::Out;
914 }
915
916 fn test<T: ApplyL>() {
917     let y: <RefMutL<T> as ApplyL>::Out = no_matter;
918     y;
919 } //^ ApplyL::Out<T>
920 "#,
921     );
922 }
923
924 #[test]
925 fn associated_type_placeholder_2() {
926     check_types(
927         r#"
928 pub trait ApplyL {
929     type Out;
930 }
931 fn foo<T: ApplyL>(t: T) -> <T as ApplyL>::Out;
932
933 fn test<T: ApplyL>(t: T) {
934     let y = foo(t);
935     y;
936 } //^ ApplyL::Out<T>
937 "#,
938     );
939 }
940
941 #[test]
942 fn argument_impl_trait() {
943     check_infer_with_mismatches(
944         r#"
945 trait Trait<T> {
946     fn foo(&self) -> T;
947     fn foo2(&self) -> i64;
948 }
949 fn bar(x: impl Trait<u16>) {}
950 struct S<T>(T);
951 impl<T> Trait<T> for S<T> {}
952
953 fn test(x: impl Trait<u64>, y: &impl Trait<u32>) {
954     x;
955     y;
956     let z = S(1);
957     bar(z);
958     x.foo();
959     y.foo();
960     z.foo();
961     x.foo2();
962     y.foo2();
963     z.foo2();
964 }"#,
965         expect![[r#"
966             29..33 'self': &Self
967             54..58 'self': &Self
968             77..78 'x': impl Trait<u16>
969             97..99 '{}': ()
970             154..155 'x': impl Trait<u64>
971             174..175 'y': &impl Trait<u32>
972             195..323 '{     ...2(); }': ()
973             201..202 'x': impl Trait<u64>
974             208..209 'y': &impl Trait<u32>
975             219..220 'z': S<u16>
976             223..224 'S': S<u16>(u16) -> S<u16>
977             223..227 'S(1)': S<u16>
978             225..226 '1': u16
979             233..236 'bar': fn bar(S<u16>)
980             233..239 'bar(z)': ()
981             237..238 'z': S<u16>
982             245..246 'x': impl Trait<u64>
983             245..252 'x.foo()': u64
984             258..259 'y': &impl Trait<u32>
985             258..265 'y.foo()': u32
986             271..272 'z': S<u16>
987             271..278 'z.foo()': u16
988             284..285 'x': impl Trait<u64>
989             284..292 'x.foo2()': i64
990             298..299 'y': &impl Trait<u32>
991             298..306 'y.foo2()': i64
992             312..313 'z': S<u16>
993             312..320 'z.foo2()': i64
994         "#]],
995     );
996 }
997
998 #[test]
999 fn argument_impl_trait_type_args_1() {
1000     check_infer_with_mismatches(
1001         r#"
1002 trait Trait {}
1003 trait Foo {
1004     // this function has an implicit Self param, an explicit type param,
1005     // and an implicit impl Trait param!
1006     fn bar<T>(x: impl Trait) -> T { loop {} }
1007 }
1008 fn foo<T>(x: impl Trait) -> T { loop {} }
1009 struct S;
1010 impl Trait for S {}
1011 struct F;
1012 impl Foo for F {}
1013
1014 fn test() {
1015     Foo::bar(S);
1016     <F as Foo>::bar(S);
1017     F::bar(S);
1018     Foo::bar::<u32>(S);
1019     <F as Foo>::bar::<u32>(S);
1020
1021     foo(S);
1022     foo::<u32>(S);
1023     foo::<u32, i32>(S); // we should ignore the extraneous i32
1024 }"#,
1025         expect![[r#"
1026             155..156 'x': impl Trait
1027             175..186 '{ loop {} }': T
1028             177..184 'loop {}': !
1029             182..184 '{}': ()
1030             199..200 'x': impl Trait
1031             219..230 '{ loop {} }': T
1032             221..228 'loop {}': !
1033             226..228 '{}': ()
1034             300..509 '{     ... i32 }': ()
1035             306..314 'Foo::bar': fn bar<{unknown}, {unknown}>(S) -> {unknown}
1036             306..317 'Foo::bar(S)': {unknown}
1037             315..316 'S': S
1038             323..338 '<F as Foo>::bar': fn bar<F, {unknown}>(S) -> {unknown}
1039             323..341 '<F as ...bar(S)': {unknown}
1040             339..340 'S': S
1041             347..353 'F::bar': fn bar<F, {unknown}>(S) -> {unknown}
1042             347..356 'F::bar(S)': {unknown}
1043             354..355 'S': S
1044             362..377 'Foo::bar::<u32>': fn bar<{unknown}, u32>(S) -> u32
1045             362..380 'Foo::b...32>(S)': u32
1046             378..379 'S': S
1047             386..408 '<F as ...:<u32>': fn bar<F, u32>(S) -> u32
1048             386..411 '<F as ...32>(S)': u32
1049             409..410 'S': S
1050             418..421 'foo': fn foo<{unknown}>(S) -> {unknown}
1051             418..424 'foo(S)': {unknown}
1052             422..423 'S': S
1053             430..440 'foo::<u32>': fn foo<u32>(S) -> u32
1054             430..443 'foo::<u32>(S)': u32
1055             441..442 'S': S
1056             449..464 'foo::<u32, i32>': fn foo<u32>(S) -> u32
1057             449..467 'foo::<...32>(S)': u32
1058             465..466 'S': S
1059         "#]],
1060     );
1061 }
1062
1063 #[test]
1064 fn argument_impl_trait_type_args_2() {
1065     check_infer_with_mismatches(
1066         r#"
1067 trait Trait {}
1068 struct S;
1069 impl Trait for S {}
1070 struct F<T>;
1071 impl<T> F<T> {
1072     fn foo<U>(self, x: impl Trait) -> (T, U) { loop {} }
1073 }
1074
1075 fn test() {
1076     F.foo(S);
1077     F::<u32>.foo(S);
1078     F::<u32>.foo::<i32>(S);
1079     F::<u32>.foo::<i32, u32>(S); // extraneous argument should be ignored
1080 }"#,
1081         expect![[r#"
1082             87..91 'self': F<T>
1083             93..94 'x': impl Trait
1084             118..129 '{ loop {} }': (T, U)
1085             120..127 'loop {}': !
1086             125..127 '{}': ()
1087             143..283 '{     ...ored }': ()
1088             149..150 'F': F<{unknown}>
1089             149..157 'F.foo(S)': ({unknown}, {unknown})
1090             155..156 'S': S
1091             163..171 'F::<u32>': F<u32>
1092             163..178 'F::<u32>.foo(S)': (u32, {unknown})
1093             176..177 'S': S
1094             184..192 'F::<u32>': F<u32>
1095             184..206 'F::<u3...32>(S)': (u32, i32)
1096             204..205 'S': S
1097             212..220 'F::<u32>': F<u32>
1098             212..239 'F::<u3...32>(S)': (u32, i32)
1099             237..238 'S': S
1100         "#]],
1101     );
1102 }
1103
1104 #[test]
1105 fn argument_impl_trait_to_fn_pointer() {
1106     check_infer_with_mismatches(
1107         r#"
1108 trait Trait {}
1109 fn foo(x: impl Trait) { loop {} }
1110 struct S;
1111 impl Trait for S {}
1112
1113 fn test() {
1114     let f: fn(S) -> () = foo;
1115 }"#,
1116         expect![[r#"
1117             22..23 'x': impl Trait
1118             37..48 '{ loop {} }': ()
1119             39..46 'loop {}': !
1120             44..46 '{}': ()
1121             90..123 '{     ...foo; }': ()
1122             100..101 'f': fn(S)
1123             117..120 'foo': fn foo(S)
1124         "#]],
1125     );
1126 }
1127
1128 #[test]
1129 fn impl_trait() {
1130     check_infer(
1131         r#"
1132 trait Trait<T> {
1133     fn foo(&self) -> T;
1134     fn foo2(&self) -> i64;
1135 }
1136 fn bar() -> impl Trait<u64> {}
1137
1138 fn test(x: impl Trait<u64>, y: &impl Trait<u64>) {
1139     x;
1140     y;
1141     let z = bar();
1142     x.foo();
1143     y.foo();
1144     z.foo();
1145     x.foo2();
1146     y.foo2();
1147     z.foo2();
1148 }"#,
1149         expect![[r#"
1150             29..33 'self': &Self
1151             54..58 'self': &Self
1152             98..100 '{}': ()
1153             110..111 'x': impl Trait<u64>
1154             130..131 'y': &impl Trait<u64>
1155             151..268 '{     ...2(); }': ()
1156             157..158 'x': impl Trait<u64>
1157             164..165 'y': &impl Trait<u64>
1158             175..176 'z': impl Trait<u64>
1159             179..182 'bar': fn bar() -> impl Trait<u64>
1160             179..184 'bar()': impl Trait<u64>
1161             190..191 'x': impl Trait<u64>
1162             190..197 'x.foo()': u64
1163             203..204 'y': &impl Trait<u64>
1164             203..210 'y.foo()': u64
1165             216..217 'z': impl Trait<u64>
1166             216..223 'z.foo()': u64
1167             229..230 'x': impl Trait<u64>
1168             229..237 'x.foo2()': i64
1169             243..244 'y': &impl Trait<u64>
1170             243..251 'y.foo2()': i64
1171             257..258 'z': impl Trait<u64>
1172             257..265 'z.foo2()': i64
1173         "#]],
1174     );
1175 }
1176
1177 #[test]
1178 fn simple_return_pos_impl_trait() {
1179     cov_mark::check!(lower_rpit);
1180     check_infer(
1181         r#"
1182 trait Trait<T> {
1183     fn foo(&self) -> T;
1184 }
1185 fn bar() -> impl Trait<u64> { loop {} }
1186
1187 fn test() {
1188     let a = bar();
1189     a.foo();
1190 }"#,
1191         expect![[r#"
1192             29..33 'self': &Self
1193             71..82 '{ loop {} }': !
1194             73..80 'loop {}': !
1195             78..80 '{}': ()
1196             94..129 '{     ...o(); }': ()
1197             104..105 'a': impl Trait<u64>
1198             108..111 'bar': fn bar() -> impl Trait<u64>
1199             108..113 'bar()': impl Trait<u64>
1200             119..120 'a': impl Trait<u64>
1201             119..126 'a.foo()': u64
1202         "#]],
1203     );
1204 }
1205
1206 #[test]
1207 fn more_return_pos_impl_trait() {
1208     check_infer(
1209         r#"
1210 trait Iterator {
1211     type Item;
1212     fn next(&mut self) -> Self::Item;
1213 }
1214 trait Trait<T> {
1215     fn foo(&self) -> T;
1216 }
1217 fn bar() -> (impl Iterator<Item = impl Trait<u32>>, impl Trait<u64>) { loop {} }
1218 fn baz<T>(t: T) -> (impl Iterator<Item = impl Trait<T>>, impl Trait<T>) { loop {} }
1219
1220 fn test() {
1221     let (a, b) = bar();
1222     a.next().foo();
1223     b.foo();
1224     let (c, d) = baz(1u128);
1225     c.next().foo();
1226     d.foo();
1227 }"#,
1228         expect![[r#"
1229             49..53 'self': &mut Self
1230             101..105 'self': &Self
1231             184..195 '{ loop {} }': ({unknown}, {unknown})
1232             186..193 'loop {}': !
1233             191..193 '{}': ()
1234             206..207 't': T
1235             268..279 '{ loop {} }': ({unknown}, {unknown})
1236             270..277 'loop {}': !
1237             275..277 '{}': ()
1238             291..413 '{     ...o(); }': ()
1239             301..307 '(a, b)': (impl Iterator<Item = impl Trait<u32>>, impl Trait<u64>)
1240             302..303 'a': impl Iterator<Item = impl Trait<u32>>
1241             305..306 'b': impl Trait<u64>
1242             310..313 'bar': fn bar() -> (impl Iterator<Item = impl Trait<u32>>, impl Trait<u64>)
1243             310..315 'bar()': (impl Iterator<Item = impl Trait<u32>>, impl Trait<u64>)
1244             321..322 'a': impl Iterator<Item = impl Trait<u32>>
1245             321..329 'a.next()': impl Trait<u32>
1246             321..335 'a.next().foo()': u32
1247             341..342 'b': impl Trait<u64>
1248             341..348 'b.foo()': u64
1249             358..364 '(c, d)': (impl Iterator<Item = impl Trait<u128>>, impl Trait<u128>)
1250             359..360 'c': impl Iterator<Item = impl Trait<u128>>
1251             362..363 'd': impl Trait<u128>
1252             367..370 'baz': fn baz<u128>(u128) -> (impl Iterator<Item = impl Trait<u128>>, impl Trait<u128>)
1253             367..377 'baz(1u128)': (impl Iterator<Item = impl Trait<u128>>, impl Trait<u128>)
1254             371..376 '1u128': u128
1255             383..384 'c': impl Iterator<Item = impl Trait<u128>>
1256             383..391 'c.next()': impl Trait<u128>
1257             383..397 'c.next().foo()': u128
1258             403..404 'd': impl Trait<u128>
1259             403..410 'd.foo()': u128
1260         "#]],
1261     );
1262 }
1263
1264 #[test]
1265 fn dyn_trait() {
1266     check_infer(
1267         r#"
1268 trait Trait<T> {
1269     fn foo(&self) -> T;
1270     fn foo2(&self) -> i64;
1271 }
1272 fn bar() -> dyn Trait<u64> {}
1273
1274 fn test(x: dyn Trait<u64>, y: &dyn Trait<u64>) {
1275     x;
1276     y;
1277     let z = bar();
1278     x.foo();
1279     y.foo();
1280     z.foo();
1281     x.foo2();
1282     y.foo2();
1283     z.foo2();
1284 }"#,
1285         expect![[r#"
1286             29..33 'self': &Self
1287             54..58 'self': &Self
1288             97..99 '{}': ()
1289             109..110 'x': dyn Trait<u64>
1290             128..129 'y': &dyn Trait<u64>
1291             148..265 '{     ...2(); }': ()
1292             154..155 'x': dyn Trait<u64>
1293             161..162 'y': &dyn Trait<u64>
1294             172..173 'z': dyn Trait<u64>
1295             176..179 'bar': fn bar() -> dyn Trait<u64>
1296             176..181 'bar()': dyn Trait<u64>
1297             187..188 'x': dyn Trait<u64>
1298             187..194 'x.foo()': u64
1299             200..201 'y': &dyn Trait<u64>
1300             200..207 'y.foo()': u64
1301             213..214 'z': dyn Trait<u64>
1302             213..220 'z.foo()': u64
1303             226..227 'x': dyn Trait<u64>
1304             226..234 'x.foo2()': i64
1305             240..241 'y': &dyn Trait<u64>
1306             240..248 'y.foo2()': i64
1307             254..255 'z': dyn Trait<u64>
1308             254..262 'z.foo2()': i64
1309         "#]],
1310     );
1311 }
1312
1313 #[test]
1314 fn dyn_trait_in_impl() {
1315     check_infer(
1316         r#"
1317 trait Trait<T, U> {
1318     fn foo(&self) -> (T, U);
1319 }
1320 struct S<T, U> {}
1321 impl<T, U> S<T, U> {
1322     fn bar(&self) -> &dyn Trait<T, U> { loop {} }
1323 }
1324 trait Trait2<T, U> {
1325     fn baz(&self) -> (T, U);
1326 }
1327 impl<T, U> Trait2<T, U> for dyn Trait<T, U> { }
1328
1329 fn test(s: S<u32, i32>) {
1330     s.bar().baz();
1331 }"#,
1332         expect![[r#"
1333             32..36 'self': &Self
1334             102..106 'self': &S<T, U>
1335             128..139 '{ loop {} }': &dyn Trait<T, U>
1336             130..137 'loop {}': !
1337             135..137 '{}': ()
1338             175..179 'self': &Self
1339             251..252 's': S<u32, i32>
1340             267..289 '{     ...z(); }': ()
1341             273..274 's': S<u32, i32>
1342             273..280 's.bar()': &dyn Trait<u32, i32>
1343             273..286 's.bar().baz()': (u32, i32)
1344         "#]],
1345     );
1346 }
1347
1348 #[test]
1349 fn dyn_trait_bare() {
1350     check_infer(
1351         r#"
1352 trait Trait {
1353     fn foo(&self) -> u64;
1354 }
1355 fn bar() -> Trait {}
1356
1357 fn test(x: Trait, y: &Trait) -> u64 {
1358     x;
1359     y;
1360     let z = bar();
1361     x.foo();
1362     y.foo();
1363     z.foo();
1364 }"#,
1365         expect![[r#"
1366             26..30 'self': &Self
1367             60..62 '{}': ()
1368             72..73 'x': dyn Trait
1369             82..83 'y': &dyn Trait
1370             100..175 '{     ...o(); }': ()
1371             106..107 'x': dyn Trait
1372             113..114 'y': &dyn Trait
1373             124..125 'z': dyn Trait
1374             128..131 'bar': fn bar() -> dyn Trait
1375             128..133 'bar()': dyn Trait
1376             139..140 'x': dyn Trait
1377             139..146 'x.foo()': u64
1378             152..153 'y': &dyn Trait
1379             152..159 'y.foo()': u64
1380             165..166 'z': dyn Trait
1381             165..172 'z.foo()': u64
1382         "#]],
1383     );
1384 }
1385
1386 #[test]
1387 fn weird_bounds() {
1388     check_infer(
1389         r#"
1390 trait Trait {}
1391 fn test(
1392     a: impl Trait + 'lifetime,
1393     b: impl 'lifetime,
1394     c: impl (Trait),
1395     d: impl ('lifetime),
1396     e: impl ?Sized,
1397     f: impl Trait + ?Sized
1398 ) {}
1399 "#,
1400         expect![[r#"
1401             28..29 'a': impl Trait
1402             59..60 'b': impl
1403             82..83 'c': impl Trait
1404             103..104 'd': impl
1405             128..129 'e': impl
1406             148..149 'f': impl Trait
1407             173..175 '{}': ()
1408         "#]],
1409     );
1410 }
1411
1412 #[test]
1413 fn error_bound_chalk() {
1414     check_types(
1415         r#"
1416 trait Trait {
1417     fn foo(&self) -> u32 {}
1418 }
1419
1420 fn test(x: (impl Trait + UnknownTrait)) {
1421     x.foo();
1422 }       //^ u32
1423 "#,
1424     );
1425 }
1426
1427 #[test]
1428 fn assoc_type_bindings() {
1429     check_infer(
1430         r#"
1431 trait Trait {
1432     type Type;
1433 }
1434
1435 fn get<T: Trait>(t: T) -> <T as Trait>::Type {}
1436 fn get2<U, T: Trait<Type = U>>(t: T) -> U {}
1437 fn set<T: Trait<Type = u64>>(t: T) -> T {t}
1438
1439 struct S<T>;
1440 impl<T> Trait for S<T> { type Type = T; }
1441
1442 fn test<T: Trait<Type = u32>>(x: T, y: impl Trait<Type = i64>) {
1443     get(x);
1444     get2(x);
1445     get(y);
1446     get2(y);
1447     get(set(S));
1448     get2(set(S));
1449     get2(S::<str>);
1450 }"#,
1451         expect![[r#"
1452             49..50 't': T
1453             77..79 '{}': ()
1454             111..112 't': T
1455             122..124 '{}': ()
1456             154..155 't': T
1457             165..168 '{t}': T
1458             166..167 't': T
1459             256..257 'x': T
1460             262..263 'y': impl Trait<Type = i64>
1461             289..397 '{     ...r>); }': ()
1462             295..298 'get': fn get<T>(T) -> <T as Trait>::Type
1463             295..301 'get(x)': u32
1464             299..300 'x': T
1465             307..311 'get2': fn get2<u32, T>(T) -> u32
1466             307..314 'get2(x)': u32
1467             312..313 'x': T
1468             320..323 'get': fn get<impl Trait<Type = i64>>(impl Trait<Type = i64>) -> <impl Trait<Type = i64> as Trait>::Type
1469             320..326 'get(y)': i64
1470             324..325 'y': impl Trait<Type = i64>
1471             332..336 'get2': fn get2<i64, impl Trait<Type = i64>>(impl Trait<Type = i64>) -> i64
1472             332..339 'get2(y)': i64
1473             337..338 'y': impl Trait<Type = i64>
1474             345..348 'get': fn get<S<u64>>(S<u64>) -> <S<u64> as Trait>::Type
1475             345..356 'get(set(S))': u64
1476             349..352 'set': fn set<S<u64>>(S<u64>) -> S<u64>
1477             349..355 'set(S)': S<u64>
1478             353..354 'S': S<u64>
1479             362..366 'get2': fn get2<u64, S<u64>>(S<u64>) -> u64
1480             362..374 'get2(set(S))': u64
1481             367..370 'set': fn set<S<u64>>(S<u64>) -> S<u64>
1482             367..373 'set(S)': S<u64>
1483             371..372 'S': S<u64>
1484             380..384 'get2': fn get2<str, S<str>>(S<str>) -> str
1485             380..394 'get2(S::<str>)': str
1486             385..393 'S::<str>': S<str>
1487         "#]],
1488     );
1489 }
1490
1491 #[test]
1492 fn impl_trait_assoc_binding_projection_bug() {
1493     check_types(
1494         r#"
1495 //- minicore: iterator
1496 pub trait Language {
1497     type Kind;
1498 }
1499 pub enum RustLanguage {}
1500 impl Language for RustLanguage {
1501     type Kind = SyntaxKind;
1502 }
1503 struct SyntaxNode<L> {}
1504 fn foo() -> impl Iterator<Item = SyntaxNode<RustLanguage>> {}
1505
1506 trait Clone {
1507     fn clone(&self) -> Self;
1508 }
1509
1510 fn api_walkthrough() {
1511     for node in foo() {
1512         node.clone();
1513     }            //^ {unknown}
1514 }
1515 "#,
1516     );
1517 }
1518
1519 #[test]
1520 fn projection_eq_within_chalk() {
1521     check_infer(
1522         r#"
1523 trait Trait1 {
1524     type Type;
1525 }
1526 trait Trait2<T> {
1527     fn foo(self) -> T;
1528 }
1529 impl<T, U> Trait2<T> for U where U: Trait1<Type = T> {}
1530
1531 fn test<T: Trait1<Type = u32>>(x: T) {
1532     x.foo();
1533 }"#,
1534         expect![[r#"
1535             61..65 'self': Self
1536             163..164 'x': T
1537             169..185 '{     ...o(); }': ()
1538             175..176 'x': T
1539             175..182 'x.foo()': u32
1540         "#]],
1541     );
1542 }
1543
1544 #[test]
1545 fn where_clause_trait_in_scope_for_method_resolution() {
1546     check_types(
1547         r#"
1548 mod foo {
1549     trait Trait {
1550         fn foo(&self) -> u32 {}
1551     }
1552 }
1553
1554 fn test<T: foo::Trait>(x: T) {
1555     x.foo();
1556 }      //^ u32
1557 "#,
1558     );
1559 }
1560
1561 #[test]
1562 fn super_trait_method_resolution() {
1563     check_infer(
1564         r#"
1565 mod foo {
1566     trait SuperTrait {
1567         fn foo(&self) -> u32 {}
1568     }
1569 }
1570 trait Trait1: foo::SuperTrait {}
1571 trait Trait2 where Self: foo::SuperTrait {}
1572
1573 fn test<T: Trait1, U: Trait2>(x: T, y: U) {
1574     x.foo();
1575     y.foo();
1576 }"#,
1577         expect![[r#"
1578             49..53 'self': &Self
1579             62..64 '{}': ()
1580             181..182 'x': T
1581             187..188 'y': U
1582             193..222 '{     ...o(); }': ()
1583             199..200 'x': T
1584             199..206 'x.foo()': u32
1585             212..213 'y': U
1586             212..219 'y.foo()': u32
1587         "#]],
1588     );
1589 }
1590
1591 #[test]
1592 fn super_trait_impl_trait_method_resolution() {
1593     check_infer(
1594         r#"
1595 mod foo {
1596     trait SuperTrait {
1597         fn foo(&self) -> u32 {}
1598     }
1599 }
1600 trait Trait1: foo::SuperTrait {}
1601
1602 fn test(x: &impl Trait1) {
1603     x.foo();
1604 }"#,
1605         expect![[r#"
1606             49..53 'self': &Self
1607             62..64 '{}': ()
1608             115..116 'x': &impl Trait1
1609             132..148 '{     ...o(); }': ()
1610             138..139 'x': &impl Trait1
1611             138..145 'x.foo()': u32
1612         "#]],
1613     );
1614 }
1615
1616 #[test]
1617 fn super_trait_cycle() {
1618     // This just needs to not crash
1619     check_infer(
1620         r#"
1621         trait A: B {}
1622         trait B: A {}
1623
1624         fn test<T: A>(x: T) {
1625             x.foo();
1626         }
1627         "#,
1628         expect![[r#"
1629             43..44 'x': T
1630             49..65 '{     ...o(); }': ()
1631             55..56 'x': T
1632             55..62 'x.foo()': {unknown}
1633         "#]],
1634     );
1635 }
1636
1637 #[test]
1638 fn super_trait_assoc_type_bounds() {
1639     check_infer(
1640         r#"
1641 trait SuperTrait { type Type; }
1642 trait Trait where Self: SuperTrait {}
1643
1644 fn get2<U, T: Trait<Type = U>>(t: T) -> U {}
1645 fn set<T: Trait<Type = u64>>(t: T) -> T {t}
1646
1647 struct S<T>;
1648 impl<T> SuperTrait for S<T> { type Type = T; }
1649 impl<T> Trait for S<T> {}
1650
1651 fn test() {
1652     get2(set(S));
1653 }"#,
1654         expect![[r#"
1655             102..103 't': T
1656             113..115 '{}': ()
1657             145..146 't': T
1658             156..159 '{t}': T
1659             157..158 't': T
1660             258..279 '{     ...S)); }': ()
1661             264..268 'get2': fn get2<u64, S<u64>>(S<u64>) -> u64
1662             264..276 'get2(set(S))': u64
1663             269..272 'set': fn set<S<u64>>(S<u64>) -> S<u64>
1664             269..275 'set(S)': S<u64>
1665             273..274 'S': S<u64>
1666         "#]],
1667     );
1668 }
1669
1670 #[test]
1671 fn fn_trait() {
1672     check_infer_with_mismatches(
1673         r#"
1674 trait FnOnce<Args> {
1675     type Output;
1676
1677     fn call_once(self, args: Args) -> <Self as FnOnce<Args>>::Output;
1678 }
1679
1680 fn test<F: FnOnce(u32, u64) -> u128>(f: F) {
1681     f.call_once((1, 2));
1682 }"#,
1683         expect![[r#"
1684             56..60 'self': Self
1685             62..66 'args': Args
1686             149..150 'f': F
1687             155..183 '{     ...2)); }': ()
1688             161..162 'f': F
1689             161..180 'f.call...1, 2))': u128
1690             173..179 '(1, 2)': (u32, u64)
1691             174..175 '1': u32
1692             177..178 '2': u64
1693         "#]],
1694     );
1695 }
1696
1697 #[test]
1698 fn fn_ptr_and_item() {
1699     check_infer_with_mismatches(
1700         r#"
1701 #[lang="fn_once"]
1702 trait FnOnce<Args> {
1703     type Output;
1704
1705     fn call_once(self, args: Args) -> Self::Output;
1706 }
1707
1708 trait Foo<T> {
1709     fn foo(&self) -> T;
1710 }
1711
1712 struct Bar<T>(T);
1713
1714 impl<A1, R, F: FnOnce(A1) -> R> Foo<(A1, R)> for Bar<F> {
1715     fn foo(&self) -> (A1, R) { loop {} }
1716 }
1717
1718 enum Opt<T> { None, Some(T) }
1719 impl<T> Opt<T> {
1720     fn map<U, F: FnOnce(T) -> U>(self, f: F) -> Opt<U> { loop {} }
1721 }
1722
1723 fn test() {
1724     let bar: Bar<fn(u8) -> u32>;
1725     bar.foo();
1726
1727     let opt: Opt<u8>;
1728     let f: fn(u8) -> u32;
1729     opt.map(f);
1730 }"#,
1731         expect![[r#"
1732             74..78 'self': Self
1733             80..84 'args': Args
1734             139..143 'self': &Self
1735             243..247 'self': &Bar<F>
1736             260..271 '{ loop {} }': (A1, R)
1737             262..269 'loop {}': !
1738             267..269 '{}': ()
1739             355..359 'self': Opt<T>
1740             361..362 'f': F
1741             377..388 '{ loop {} }': Opt<U>
1742             379..386 'loop {}': !
1743             384..386 '{}': ()
1744             402..518 '{     ...(f); }': ()
1745             412..415 'bar': Bar<fn(u8) -> u32>
1746             441..444 'bar': Bar<fn(u8) -> u32>
1747             441..450 'bar.foo()': (u8, u32)
1748             461..464 'opt': Opt<u8>
1749             483..484 'f': fn(u8) -> u32
1750             505..508 'opt': Opt<u8>
1751             505..515 'opt.map(f)': Opt<u32>
1752             513..514 'f': fn(u8) -> u32
1753         "#]],
1754     );
1755 }
1756
1757 #[test]
1758 fn fn_trait_deref_with_ty_default() {
1759     check_infer(
1760         r#"
1761 #[lang = "deref"]
1762 trait Deref {
1763     type Target;
1764
1765     fn deref(&self) -> &Self::Target;
1766 }
1767
1768 #[lang="fn_once"]
1769 trait FnOnce<Args> {
1770     type Output;
1771
1772     fn call_once(self, args: Args) -> Self::Output;
1773 }
1774
1775 struct Foo;
1776
1777 impl Foo {
1778     fn foo(&self) -> usize {}
1779 }
1780
1781 struct Lazy<T, F = fn() -> T>(F);
1782
1783 impl<T, F> Lazy<T, F> {
1784     pub fn new(f: F) -> Lazy<T, F> {}
1785 }
1786
1787 impl<T, F: FnOnce() -> T> Deref for Lazy<T, F> {
1788     type Target = T;
1789 }
1790
1791 fn test() {
1792     let lazy1: Lazy<Foo, _> = Lazy::new(|| Foo);
1793     let r1 = lazy1.foo();
1794
1795     fn make_foo_fn() -> Foo {}
1796     let make_foo_fn_ptr: fn() -> Foo = make_foo_fn;
1797     let lazy2: Lazy<Foo, _> = Lazy::new(make_foo_fn_ptr);
1798     let r2 = lazy2.foo();
1799 }"#,
1800         expect![[r#"
1801             64..68 'self': &Self
1802             165..169 'self': Self
1803             171..175 'args': Args
1804             239..243 'self': &Foo
1805             254..256 '{}': ()
1806             334..335 'f': F
1807             354..356 '{}': ()
1808             443..689 '{     ...o(); }': ()
1809             453..458 'lazy1': Lazy<Foo, || -> Foo>
1810             475..484 'Lazy::new': fn new<Foo, || -> Foo>(|| -> Foo) -> Lazy<Foo, || -> Foo>
1811             475..492 'Lazy::...| Foo)': Lazy<Foo, || -> Foo>
1812             485..491 '|| Foo': || -> Foo
1813             488..491 'Foo': Foo
1814             502..504 'r1': usize
1815             507..512 'lazy1': Lazy<Foo, || -> Foo>
1816             507..518 'lazy1.foo()': usize
1817             560..575 'make_foo_fn_ptr': fn() -> Foo
1818             591..602 'make_foo_fn': fn make_foo_fn() -> Foo
1819             612..617 'lazy2': Lazy<Foo, fn() -> Foo>
1820             634..643 'Lazy::new': fn new<Foo, fn() -> Foo>(fn() -> Foo) -> Lazy<Foo, fn() -> Foo>
1821             634..660 'Lazy::...n_ptr)': Lazy<Foo, fn() -> Foo>
1822             644..659 'make_foo_fn_ptr': fn() -> Foo
1823             670..672 'r2': usize
1824             675..680 'lazy2': Lazy<Foo, fn() -> Foo>
1825             675..686 'lazy2.foo()': usize
1826             549..551 '{}': ()
1827         "#]],
1828     );
1829 }
1830
1831 #[test]
1832 fn closure_1() {
1833     check_infer_with_mismatches(
1834         r#"
1835 //- minicore: fn
1836 enum Option<T> { Some(T), None }
1837 impl<T> Option<T> {
1838     fn map<U, F: FnOnce(T) -> U>(self, f: F) -> Option<U> { loop {} }
1839 }
1840
1841 fn test() {
1842     let x = Option::Some(1u32);
1843     x.map(|v| v + 1);
1844     x.map(|_v| 1u64);
1845     let y: Option<i64> = x.map(|_v| 1);
1846 }"#,
1847         expect![[r#"
1848             86..90 'self': Option<T>
1849             92..93 'f': F
1850             111..122 '{ loop {} }': Option<U>
1851             113..120 'loop {}': !
1852             118..120 '{}': ()
1853             136..255 '{     ... 1); }': ()
1854             146..147 'x': Option<u32>
1855             150..162 'Option::Some': Some<u32>(u32) -> Option<u32>
1856             150..168 'Option...(1u32)': Option<u32>
1857             163..167 '1u32': u32
1858             174..175 'x': Option<u32>
1859             174..190 'x.map(...v + 1)': Option<u32>
1860             180..189 '|v| v + 1': |u32| -> u32
1861             181..182 'v': u32
1862             184..185 'v': u32
1863             184..189 'v + 1': u32
1864             188..189 '1': u32
1865             196..197 'x': Option<u32>
1866             196..212 'x.map(... 1u64)': Option<u64>
1867             202..211 '|_v| 1u64': |u32| -> u64
1868             203..205 '_v': u32
1869             207..211 '1u64': u64
1870             222..223 'y': Option<i64>
1871             239..240 'x': Option<u32>
1872             239..252 'x.map(|_v| 1)': Option<i64>
1873             245..251 '|_v| 1': |u32| -> i64
1874             246..248 '_v': u32
1875             250..251 '1': i64
1876         "#]],
1877     );
1878 }
1879
1880 #[test]
1881 fn closure_2() {
1882     check_infer_with_mismatches(
1883         r#"
1884 #[lang = "add"]
1885 pub trait Add<Rhs = Self> {
1886     type Output;
1887     fn add(self, rhs: Rhs) -> Self::Output;
1888 }
1889
1890 trait FnOnce<Args> {
1891     type Output;
1892 }
1893
1894 impl Add for u64 {
1895     type Output = Self;
1896     fn add(self, rhs: u64) -> Self::Output {0}
1897 }
1898
1899 impl Add for u128 {
1900     type Output = Self;
1901     fn add(self, rhs: u128) -> Self::Output {0}
1902 }
1903
1904 fn test<F: FnOnce(u32) -> u64>(f: F) {
1905     f(1);
1906     let g = |v| v + 1;
1907     g(1u64);
1908     let h = |v| 1u128 + v;
1909 }"#,
1910         expect![[r#"
1911             72..76 'self': Self
1912             78..81 'rhs': Rhs
1913             203..207 'self': u64
1914             209..212 'rhs': u64
1915             235..238 '{0}': u64
1916             236..237 '0': u64
1917             297..301 'self': u128
1918             303..306 'rhs': u128
1919             330..333 '{0}': u128
1920             331..332 '0': u128
1921             368..369 'f': F
1922             374..450 '{     ...+ v; }': ()
1923             380..381 'f': F
1924             380..384 'f(1)': {unknown}
1925             382..383 '1': i32
1926             394..395 'g': |u64| -> u64
1927             398..407 '|v| v + 1': |u64| -> u64
1928             399..400 'v': u64
1929             402..403 'v': u64
1930             402..407 'v + 1': u64
1931             406..407 '1': u64
1932             413..414 'g': |u64| -> u64
1933             413..420 'g(1u64)': u64
1934             415..419 '1u64': u64
1935             430..431 'h': |u128| -> u128
1936             434..447 '|v| 1u128 + v': |u128| -> u128
1937             435..436 'v': u128
1938             438..443 '1u128': u128
1939             438..447 '1u128 + v': u128
1940             446..447 'v': u128
1941         "#]],
1942     );
1943 }
1944
1945 #[test]
1946 fn closure_as_argument_inference_order() {
1947     check_infer_with_mismatches(
1948         r#"
1949 //- minicore: fn
1950 fn foo1<T, U, F: FnOnce(T) -> U>(x: T, f: F) -> U { loop {} }
1951 fn foo2<T, U, F: FnOnce(T) -> U>(f: F, x: T) -> U { loop {} }
1952
1953 struct S;
1954 impl S {
1955     fn method(self) -> u64;
1956
1957     fn foo1<T, U, F: FnOnce(T) -> U>(self, x: T, f: F) -> U { loop {} }
1958     fn foo2<T, U, F: FnOnce(T) -> U>(self, f: F, x: T) -> U { loop {} }
1959 }
1960
1961 fn test() {
1962     let x1 = foo1(S, |s| s.method());
1963     let x2 = foo2(|s| s.method(), S);
1964     let x3 = S.foo1(S, |s| s.method());
1965     let x4 = S.foo2(|s| s.method(), S);
1966 }"#,
1967         expect![[r#"
1968             33..34 'x': T
1969             39..40 'f': F
1970             50..61 '{ loop {} }': U
1971             52..59 'loop {}': !
1972             57..59 '{}': ()
1973             95..96 'f': F
1974             101..102 'x': T
1975             112..123 '{ loop {} }': U
1976             114..121 'loop {}': !
1977             119..121 '{}': ()
1978             158..162 'self': S
1979             210..214 'self': S
1980             216..217 'x': T
1981             222..223 'f': F
1982             233..244 '{ loop {} }': U
1983             235..242 'loop {}': !
1984             240..242 '{}': ()
1985             282..286 'self': S
1986             288..289 'f': F
1987             294..295 'x': T
1988             305..316 '{ loop {} }': U
1989             307..314 'loop {}': !
1990             312..314 '{}': ()
1991             330..489 '{     ... S); }': ()
1992             340..342 'x1': u64
1993             345..349 'foo1': fn foo1<S, u64, |S| -> u64>(S, |S| -> u64) -> u64
1994             345..368 'foo1(S...hod())': u64
1995             350..351 'S': S
1996             353..367 '|s| s.method()': |S| -> u64
1997             354..355 's': S
1998             357..358 's': S
1999             357..367 's.method()': u64
2000             378..380 'x2': u64
2001             383..387 'foo2': fn foo2<S, u64, |S| -> u64>(|S| -> u64, S) -> u64
2002             383..406 'foo2(|...(), S)': u64
2003             388..402 '|s| s.method()': |S| -> u64
2004             389..390 's': S
2005             392..393 's': S
2006             392..402 's.method()': u64
2007             404..405 'S': S
2008             416..418 'x3': u64
2009             421..422 'S': S
2010             421..446 'S.foo1...hod())': u64
2011             428..429 'S': S
2012             431..445 '|s| s.method()': |S| -> u64
2013             432..433 's': S
2014             435..436 's': S
2015             435..445 's.method()': u64
2016             456..458 'x4': u64
2017             461..462 'S': S
2018             461..486 'S.foo2...(), S)': u64
2019             468..482 '|s| s.method()': |S| -> u64
2020             469..470 's': S
2021             472..473 's': S
2022             472..482 's.method()': u64
2023             484..485 'S': S
2024         "#]],
2025     );
2026 }
2027
2028 #[test]
2029 fn fn_item_fn_trait() {
2030     check_types(
2031         r#"
2032 //- minicore: fn
2033 struct S;
2034
2035 fn foo() -> S {}
2036
2037 fn takes_closure<U, F: FnOnce() -> U>(f: F) -> U { f() }
2038
2039 fn test() {
2040     takes_closure(foo);
2041 } //^^^^^^^^^^^^^^^^^^ S
2042 "#,
2043     );
2044 }
2045
2046 #[test]
2047 fn unselected_projection_in_trait_env_1() {
2048     check_types(
2049         r#"
2050 //- /main.rs
2051 trait Trait {
2052     type Item;
2053 }
2054
2055 trait Trait2 {
2056     fn foo(&self) -> u32;
2057 }
2058
2059 fn test<T: Trait>() where T::Item: Trait2 {
2060     let x: T::Item = no_matter;
2061     x.foo();
2062 }       //^ u32
2063 "#,
2064     );
2065 }
2066
2067 #[test]
2068 fn unselected_projection_in_trait_env_2() {
2069     check_types(
2070         r#"
2071 trait Trait<T> {
2072     type Item;
2073 }
2074
2075 trait Trait2 {
2076     fn foo(&self) -> u32;
2077 }
2078
2079 fn test<T, U>() where T::Item: Trait2, T: Trait<U::Item>, U: Trait<()> {
2080     let x: T::Item = no_matter;
2081     x.foo();
2082 }       //^ u32
2083 "#,
2084     );
2085 }
2086
2087 #[test]
2088 fn unselected_projection_on_impl_self() {
2089     check_infer(
2090         r#"
2091 //- /main.rs
2092 trait Trait {
2093     type Item;
2094
2095     fn f(&self, x: Self::Item);
2096 }
2097
2098 struct S;
2099
2100 impl Trait for S {
2101     type Item = u32;
2102     fn f(&self, x: Self::Item) { let y = x; }
2103 }
2104
2105 struct S2;
2106
2107 impl Trait for S2 {
2108     type Item = i32;
2109     fn f(&self, x: <Self>::Item) { let y = x; }
2110 }"#,
2111         expect![[r#"
2112             40..44 'self': &Self
2113             46..47 'x': Trait::Item<Self>
2114             126..130 'self': &S
2115             132..133 'x': u32
2116             147..161 '{ let y = x; }': ()
2117             153..154 'y': u32
2118             157..158 'x': u32
2119             228..232 'self': &S2
2120             234..235 'x': i32
2121             251..265 '{ let y = x; }': ()
2122             257..258 'y': i32
2123             261..262 'x': i32
2124         "#]],
2125     );
2126 }
2127
2128 #[test]
2129 fn unselected_projection_on_trait_self() {
2130     check_types(
2131         r#"
2132 trait Trait {
2133     type Item;
2134
2135     fn f(&self) -> Self::Item { loop {} }
2136 }
2137
2138 struct S;
2139 impl Trait for S {
2140     type Item = u32;
2141 }
2142
2143 fn test() {
2144     S.f();
2145 }     //^ u32
2146 "#,
2147     );
2148 }
2149
2150 #[test]
2151 fn unselected_projection_chalk_fold() {
2152     check_types(
2153         r#"
2154 trait Interner {}
2155 trait Fold<I: Interner, TI = I> {
2156     type Result;
2157 }
2158
2159 struct Ty<I: Interner> {}
2160 impl<I: Interner, TI: Interner> Fold<I, TI> for Ty<I> {
2161     type Result = Ty<TI>;
2162 }
2163
2164 fn fold<I: Interner, T>(interner: &I, t: T) -> T::Result
2165 where
2166     T: Fold<I, I>,
2167 {
2168     loop {}
2169 }
2170
2171 fn foo<I: Interner>(interner: &I, t: Ty<I>) {
2172     fold(interner, t);
2173 }     //^ Ty<I>
2174 "#,
2175     );
2176 }
2177
2178 #[test]
2179 fn trait_impl_self_ty() {
2180     check_types(
2181         r#"
2182 trait Trait<T> {
2183    fn foo(&self);
2184 }
2185
2186 struct S;
2187
2188 impl Trait<Self> for S {}
2189
2190 fn test() {
2191     S.foo();
2192 }       //^ ()
2193 "#,
2194     );
2195 }
2196
2197 #[test]
2198 fn trait_impl_self_ty_cycle() {
2199     check_types(
2200         r#"
2201 trait Trait {
2202    fn foo(&self);
2203 }
2204
2205 struct S<T>;
2206
2207 impl Trait for S<Self> {}
2208
2209 fn test() {
2210     S.foo();
2211 }       //^ {unknown}
2212 "#,
2213     );
2214 }
2215
2216 #[test]
2217 fn unselected_projection_in_trait_env_cycle_1() {
2218     // this is a legitimate cycle
2219     check_types(
2220         r#"
2221 trait Trait {
2222     type Item;
2223 }
2224
2225 trait Trait2<T> {}
2226
2227 fn test<T: Trait>() where T: Trait2<T::Item> {
2228     let x: T::Item = no_matter;
2229 }                       //^ {unknown}
2230 "#,
2231     );
2232 }
2233
2234 #[test]
2235 fn unselected_projection_in_trait_env_cycle_2() {
2236     // this is a legitimate cycle
2237     check_types(
2238         r#"
2239 //- /main.rs
2240 trait Trait<T> {
2241     type Item;
2242 }
2243
2244 fn test<T, U>() where T: Trait<U::Item>, U: Trait<T::Item> {
2245     let x: T::Item = no_matter;
2246 }                   //^ {unknown}
2247 "#,
2248     );
2249 }
2250
2251 #[test]
2252 fn unselected_projection_in_trait_env_cycle_3() {
2253     // this is a cycle for rustc; we currently accept it
2254     check_types(
2255         r#"
2256 //- /main.rs
2257 trait Trait {
2258     type Item;
2259     type OtherItem;
2260 }
2261
2262 fn test<T>() where T: Trait<OtherItem = T::Item> {
2263     let x: T::Item = no_matter;
2264 }                   //^ Trait::Item<T>
2265 "#,
2266     );
2267 }
2268
2269 #[test]
2270 fn unselected_projection_in_trait_env_no_cycle() {
2271     // this is not a cycle
2272     check_types(
2273         r#"
2274 //- /main.rs
2275 trait Index {
2276     type Output;
2277 }
2278
2279 type Key<S: UnificationStoreBase> = <S as UnificationStoreBase>::Key;
2280
2281 pub trait UnificationStoreBase: Index<Output = Key<Self>> {
2282     type Key;
2283
2284     fn len(&self) -> usize;
2285 }
2286
2287 pub trait UnificationStoreMut: UnificationStoreBase {
2288     fn push(&mut self, value: Self::Key);
2289 }
2290
2291 fn test<T>(t: T) where T: UnificationStoreMut {
2292     let x;
2293     t.push(x);
2294     let y: Key<T>;
2295     (x, y);
2296 }      //^ (UnificationStoreBase::Key<T>, UnificationStoreBase::Key<T>)
2297 "#,
2298     );
2299 }
2300
2301 #[test]
2302 fn inline_assoc_type_bounds_1() {
2303     check_types(
2304         r#"
2305 trait Iterator {
2306     type Item;
2307 }
2308 trait OtherTrait<T> {
2309     fn foo(&self) -> T;
2310 }
2311
2312 // workaround for Chalk assoc type normalization problems
2313 pub struct S<T>;
2314 impl<T: Iterator> Iterator for S<T> {
2315     type Item = <T as Iterator>::Item;
2316 }
2317
2318 fn test<I: Iterator<Item: OtherTrait<u32>>>() {
2319     let x: <S<I> as Iterator>::Item;
2320     x.foo();
2321 }       //^ u32
2322 "#,
2323     );
2324 }
2325
2326 #[test]
2327 fn inline_assoc_type_bounds_2() {
2328     check_types(
2329         r#"
2330 trait Iterator {
2331     type Item;
2332 }
2333
2334 fn test<I: Iterator<Item: Iterator<Item = u32>>>() {
2335     let x: <<I as Iterator>::Item as Iterator>::Item;
2336     x;
2337 } //^ u32
2338 "#,
2339     );
2340 }
2341
2342 #[test]
2343 fn proc_macro_server_types() {
2344     check_infer(
2345         r#"
2346 macro_rules! with_api {
2347     ($S:ident, $self:ident, $m:ident) => {
2348         $m! {
2349             TokenStream {
2350                 fn new() -> $S::TokenStream;
2351             },
2352             Group {
2353             },
2354         }
2355     };
2356 }
2357 macro_rules! associated_item {
2358     (type TokenStream) =>
2359         (type TokenStream: 'static;);
2360     (type Group) =>
2361         (type Group: 'static;);
2362     ($($item:tt)*) => ($($item)*;)
2363 }
2364 macro_rules! declare_server_traits {
2365     ($($name:ident {
2366         $(fn $method:ident($($arg:ident: $arg_ty:ty),* $(,)?) $(-> $ret_ty:ty)?;)*
2367     }),* $(,)?) => {
2368         pub trait Types {
2369             $(associated_item!(type $name);)*
2370         }
2371
2372         $(pub trait $name: Types {
2373             $(associated_item!(fn $method($($arg: $arg_ty),*) $(-> $ret_ty)?);)*
2374         })*
2375
2376         pub trait Server: Types $(+ $name)* {}
2377         impl<S: Types $(+ $name)*> Server for S {}
2378     }
2379 }
2380
2381 with_api!(Self, self_, declare_server_traits);
2382 struct G {}
2383 struct T {}
2384 struct Rustc;
2385 impl Types for Rustc {
2386     type TokenStream = T;
2387     type Group = G;
2388 }
2389
2390 fn make<T>() -> T { loop {} }
2391 impl TokenStream for Rustc {
2392     fn new() -> Self::TokenStream {
2393         let group: Self::Group = make();
2394         make()
2395     }
2396 }"#,
2397         expect![[r#"
2398             1061..1072 '{ loop {} }': T
2399             1063..1070 'loop {}': !
2400             1068..1070 '{}': ()
2401             1136..1199 '{     ...     }': T
2402             1150..1155 'group': G
2403             1171..1175 'make': fn make<G>() -> G
2404             1171..1177 'make()': G
2405             1187..1191 'make': fn make<T>() -> T
2406             1187..1193 'make()': T
2407         "#]],
2408     );
2409 }
2410
2411 #[test]
2412 fn unify_impl_trait() {
2413     check_infer_with_mismatches(
2414         r#"
2415 trait Trait<T> {}
2416
2417 fn foo(x: impl Trait<u32>) { loop {} }
2418 fn bar<T>(x: impl Trait<T>) -> T { loop {} }
2419
2420 struct S<T>(T);
2421 impl<T> Trait<T> for S<T> {}
2422
2423 fn default<T>() -> T { loop {} }
2424
2425 fn test() -> impl Trait<i32> {
2426     let s1 = S(default());
2427     foo(s1);
2428     let x: i32 = bar(S(default()));
2429     S(default())
2430 }"#,
2431         expect![[r#"
2432             26..27 'x': impl Trait<u32>
2433             46..57 '{ loop {} }': ()
2434             48..55 'loop {}': !
2435             53..55 '{}': ()
2436             68..69 'x': impl Trait<T>
2437             91..102 '{ loop {} }': T
2438             93..100 'loop {}': !
2439             98..100 '{}': ()
2440             171..182 '{ loop {} }': T
2441             173..180 'loop {}': !
2442             178..180 '{}': ()
2443             213..309 '{     ...t()) }': S<{unknown}>
2444             223..225 's1': S<u32>
2445             228..229 'S': S<u32>(u32) -> S<u32>
2446             228..240 'S(default())': S<u32>
2447             230..237 'default': fn default<u32>() -> u32
2448             230..239 'default()': u32
2449             246..249 'foo': fn foo(S<u32>)
2450             246..253 'foo(s1)': ()
2451             250..252 's1': S<u32>
2452             263..264 'x': i32
2453             272..275 'bar': fn bar<i32>(S<i32>) -> i32
2454             272..289 'bar(S(...lt()))': i32
2455             276..277 'S': S<i32>(i32) -> S<i32>
2456             276..288 'S(default())': S<i32>
2457             278..285 'default': fn default<i32>() -> i32
2458             278..287 'default()': i32
2459             295..296 'S': S<{unknown}>({unknown}) -> S<{unknown}>
2460             295..307 'S(default())': S<{unknown}>
2461             297..304 'default': fn default<{unknown}>() -> {unknown}
2462             297..306 'default()': {unknown}
2463         "#]],
2464     );
2465 }
2466
2467 #[test]
2468 fn assoc_types_from_bounds() {
2469     check_infer(
2470         r#"
2471 //- minicore: fn
2472 trait T {
2473     type O;
2474 }
2475
2476 impl T for () {
2477     type O = ();
2478 }
2479
2480 fn f<X, F>(_v: F)
2481 where
2482     X: T,
2483     F: FnOnce(&X::O),
2484 { }
2485
2486 fn main() {
2487     f::<(), _>(|z| { z; });
2488 }"#,
2489         expect![[r#"
2490             72..74 '_v': F
2491             117..120 '{ }': ()
2492             132..163 '{     ... }); }': ()
2493             138..148 'f::<(), _>': fn f<(), |&()| -> ()>(|&()| -> ())
2494             138..160 'f::<()... z; })': ()
2495             149..159 '|z| { z; }': |&()| -> ()
2496             150..151 'z': &()
2497             153..159 '{ z; }': ()
2498             155..156 'z': &()
2499         "#]],
2500     );
2501 }
2502
2503 #[test]
2504 fn associated_type_bound() {
2505     check_types(
2506         r#"
2507 pub trait Trait {
2508     type Item: OtherTrait<u32>;
2509 }
2510 pub trait OtherTrait<T> {
2511     fn foo(&self) -> T;
2512 }
2513
2514 // this is just a workaround for chalk#234
2515 pub struct S<T>;
2516 impl<T: Trait> Trait for S<T> {
2517     type Item = <T as Trait>::Item;
2518 }
2519
2520 fn test<T: Trait>() {
2521     let y: <S<T> as Trait>::Item = no_matter;
2522     y.foo();
2523 }       //^ u32
2524 "#,
2525     );
2526 }
2527
2528 #[test]
2529 fn dyn_trait_through_chalk() {
2530     check_types(
2531         r#"
2532 //- minicore: deref
2533 struct Box<T> {}
2534 impl<T> core::ops::Deref for Box<T> {
2535     type Target = T;
2536 }
2537 trait Trait {
2538     fn foo(&self);
2539 }
2540
2541 fn test(x: Box<dyn Trait>) {
2542     x.foo();
2543 }       //^ ()
2544 "#,
2545     );
2546 }
2547
2548 #[test]
2549 fn string_to_owned() {
2550     check_types(
2551         r#"
2552 struct String {}
2553 pub trait ToOwned {
2554     type Owned;
2555     fn to_owned(&self) -> Self::Owned;
2556 }
2557 impl ToOwned for str {
2558     type Owned = String;
2559 }
2560 fn test() {
2561     "foo".to_owned();
2562 }               //^ String
2563 "#,
2564     );
2565 }
2566
2567 #[test]
2568 fn iterator_chain() {
2569     check_infer_with_mismatches(
2570         r#"
2571 //- minicore: fn, option
2572 pub trait Iterator {
2573     type Item;
2574
2575     fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
2576     where
2577         F: FnMut(Self::Item) -> Option<B>,
2578     { loop {} }
2579
2580     fn for_each<F>(self, f: F)
2581     where
2582         F: FnMut(Self::Item),
2583     { loop {} }
2584 }
2585
2586 pub trait IntoIterator {
2587     type Item;
2588     type IntoIter: Iterator<Item = Self::Item>;
2589     fn into_iter(self) -> Self::IntoIter;
2590 }
2591
2592 pub struct FilterMap<I, F> { }
2593 impl<B, I: Iterator, F> Iterator for FilterMap<I, F>
2594 where
2595     F: FnMut(I::Item) -> Option<B>,
2596 {
2597     type Item = B;
2598 }
2599
2600 #[stable(feature = "rust1", since = "1.0.0")]
2601 impl<I: Iterator> IntoIterator for I {
2602     type Item = I::Item;
2603     type IntoIter = I;
2604
2605     fn into_iter(self) -> I {
2606         self
2607     }
2608 }
2609
2610 struct Vec<T> {}
2611 impl<T> Vec<T> {
2612     fn new() -> Self { loop {} }
2613 }
2614
2615 impl<T> IntoIterator for Vec<T> {
2616     type Item = T;
2617     type IntoIter = IntoIter<T>;
2618 }
2619
2620 pub struct IntoIter<T> { }
2621 impl<T> Iterator for IntoIter<T> {
2622     type Item = T;
2623 }
2624
2625 fn main() {
2626     Vec::<i32>::new().into_iter()
2627     .filter_map(|x| if x > 0 { Some(x as u32) } else { None })
2628     .for_each(|y| { y; });
2629 }"#,
2630         expect![[r#"
2631             61..65 'self': Self
2632             67..68 'f': F
2633             152..163 '{ loop {} }': FilterMap<Self, F>
2634             154..161 'loop {}': !
2635             159..161 '{}': ()
2636             184..188 'self': Self
2637             190..191 'f': F
2638             240..251 '{ loop {} }': ()
2639             242..249 'loop {}': !
2640             247..249 '{}': ()
2641             360..364 'self': Self
2642             689..693 'self': I
2643             700..720 '{     ...     }': I
2644             710..714 'self': I
2645             779..790 '{ loop {} }': Vec<T>
2646             781..788 'loop {}': !
2647             786..788 '{}': ()
2648             977..1104 '{     ... }); }': ()
2649             983..998 'Vec::<i32>::new': fn new<i32>() -> Vec<i32>
2650             983..1000 'Vec::<...:new()': Vec<i32>
2651             983..1012 'Vec::<...iter()': IntoIter<i32>
2652             983..1075 'Vec::<...one })': FilterMap<IntoIter<i32>, |i32| -> Option<u32>>
2653             983..1101 'Vec::<... y; })': ()
2654             1029..1074 '|x| if...None }': |i32| -> Option<u32>
2655             1030..1031 'x': i32
2656             1033..1074 'if x >...None }': Option<u32>
2657             1036..1037 'x': i32
2658             1036..1041 'x > 0': bool
2659             1040..1041 '0': i32
2660             1042..1060 '{ Some...u32) }': Option<u32>
2661             1044..1048 'Some': Some<u32>(u32) -> Option<u32>
2662             1044..1058 'Some(x as u32)': Option<u32>
2663             1049..1050 'x': i32
2664             1049..1057 'x as u32': u32
2665             1066..1074 '{ None }': Option<u32>
2666             1068..1072 'None': Option<u32>
2667             1090..1100 '|y| { y; }': |u32| -> ()
2668             1091..1092 'y': u32
2669             1094..1100 '{ y; }': ()
2670             1096..1097 'y': u32
2671         "#]],
2672     );
2673 }
2674
2675 #[test]
2676 fn nested_assoc() {
2677     check_types(
2678         r#"
2679 struct Bar;
2680 struct Foo;
2681
2682 trait A {
2683     type OutputA;
2684 }
2685
2686 impl A for Bar {
2687     type OutputA = Foo;
2688 }
2689
2690 trait B {
2691     type Output;
2692     fn foo() -> Self::Output;
2693 }
2694
2695 impl<T:A> B for T {
2696     type Output = T::OutputA;
2697     fn foo() -> Self::Output { loop {} }
2698 }
2699
2700 fn main() {
2701     Bar::foo();
2702 }          //^ Foo
2703 "#,
2704     );
2705 }
2706
2707 #[test]
2708 fn trait_object_no_coercion() {
2709     check_infer_with_mismatches(
2710         r#"
2711 trait Foo {}
2712
2713 fn foo(x: &dyn Foo) {}
2714
2715 fn test(x: &dyn Foo) {
2716     foo(x);
2717 }"#,
2718         expect![[r#"
2719             21..22 'x': &dyn Foo
2720             34..36 '{}': ()
2721             46..47 'x': &dyn Foo
2722             59..74 '{     foo(x); }': ()
2723             65..68 'foo': fn foo(&dyn Foo)
2724             65..71 'foo(x)': ()
2725             69..70 'x': &dyn Foo
2726         "#]],
2727     );
2728 }
2729
2730 #[test]
2731 fn builtin_copy() {
2732     check_infer_with_mismatches(
2733         r#"
2734 #[lang = "copy"]
2735 trait Copy {}
2736
2737 struct IsCopy;
2738 impl Copy for IsCopy {}
2739 struct NotCopy;
2740
2741 trait Test { fn test(&self) -> bool; }
2742 impl<T: Copy> Test for T {}
2743
2744 fn test() {
2745     IsCopy.test();
2746     NotCopy.test();
2747     (IsCopy, IsCopy).test();
2748     (IsCopy, NotCopy).test();
2749 }"#,
2750         expect![[r#"
2751             110..114 'self': &Self
2752             166..267 '{     ...t(); }': ()
2753             172..178 'IsCopy': IsCopy
2754             172..185 'IsCopy.test()': bool
2755             191..198 'NotCopy': NotCopy
2756             191..205 'NotCopy.test()': {unknown}
2757             211..227 '(IsCop...sCopy)': (IsCopy, IsCopy)
2758             211..234 '(IsCop...test()': bool
2759             212..218 'IsCopy': IsCopy
2760             220..226 'IsCopy': IsCopy
2761             240..257 '(IsCop...tCopy)': (IsCopy, NotCopy)
2762             240..264 '(IsCop...test()': {unknown}
2763             241..247 'IsCopy': IsCopy
2764             249..256 'NotCopy': NotCopy
2765         "#]],
2766     );
2767 }
2768
2769 #[test]
2770 fn builtin_fn_def_copy() {
2771     check_infer_with_mismatches(
2772         r#"
2773 #[lang = "copy"]
2774 trait Copy {}
2775
2776 fn foo() {}
2777 fn bar<T: Copy>(T) -> T {}
2778 struct Struct(usize);
2779 enum Enum { Variant(usize) }
2780
2781 trait Test { fn test(&self) -> bool; }
2782 impl<T: Copy> Test for T {}
2783
2784 fn test() {
2785     foo.test();
2786     bar.test();
2787     Struct.test();
2788     Enum::Variant.test();
2789 }"#,
2790         expect![[r#"
2791             41..43 '{}': ()
2792             60..61 'T': {unknown}
2793             68..70 '{}': ()
2794             68..70: expected T, got ()
2795             145..149 'self': &Self
2796             201..281 '{     ...t(); }': ()
2797             207..210 'foo': fn foo()
2798             207..217 'foo.test()': bool
2799             223..226 'bar': fn bar<{unknown}>({unknown}) -> {unknown}
2800             223..233 'bar.test()': bool
2801             239..245 'Struct': Struct(usize) -> Struct
2802             239..252 'Struct.test()': bool
2803             258..271 'Enum::Variant': Variant(usize) -> Enum
2804             258..278 'Enum::...test()': bool
2805         "#]],
2806     );
2807 }
2808
2809 #[test]
2810 fn builtin_fn_ptr_copy() {
2811     check_infer_with_mismatches(
2812         r#"
2813 #[lang = "copy"]
2814 trait Copy {}
2815
2816 trait Test { fn test(&self) -> bool; }
2817 impl<T: Copy> Test for T {}
2818
2819 fn test(f1: fn(), f2: fn(usize) -> u8, f3: fn(u8, u8) -> &u8) {
2820     f1.test();
2821     f2.test();
2822     f3.test();
2823 }"#,
2824         expect![[r#"
2825             54..58 'self': &Self
2826             108..110 'f1': fn()
2827             118..120 'f2': fn(usize) -> u8
2828             139..141 'f3': fn(u8, u8) -> &u8
2829             162..210 '{     ...t(); }': ()
2830             168..170 'f1': fn()
2831             168..177 'f1.test()': bool
2832             183..185 'f2': fn(usize) -> u8
2833             183..192 'f2.test()': bool
2834             198..200 'f3': fn(u8, u8) -> &u8
2835             198..207 'f3.test()': bool
2836         "#]],
2837     );
2838 }
2839
2840 #[test]
2841 fn builtin_sized() {
2842     check_infer_with_mismatches(
2843         r#"
2844 #[lang = "sized"]
2845 trait Sized {}
2846
2847 trait Test { fn test(&self) -> bool; }
2848 impl<T: Sized> Test for T {}
2849
2850 fn test() {
2851     1u8.test();
2852     (*"foo").test(); // not Sized
2853     (1u8, 1u8).test();
2854     (1u8, *"foo").test(); // not Sized
2855 }"#,
2856         expect![[r#"
2857             56..60 'self': &Self
2858             113..228 '{     ...ized }': ()
2859             119..122 '1u8': u8
2860             119..129 '1u8.test()': bool
2861             135..150 '(*"foo").test()': {unknown}
2862             136..142 '*"foo"': str
2863             137..142 '"foo"': &str
2864             169..179 '(1u8, 1u8)': (u8, u8)
2865             169..186 '(1u8, ...test()': bool
2866             170..173 '1u8': u8
2867             175..178 '1u8': u8
2868             192..205 '(1u8, *"foo")': (u8, str)
2869             192..212 '(1u8, ...test()': {unknown}
2870             193..196 '1u8': u8
2871             198..204 '*"foo"': str
2872             199..204 '"foo"': &str
2873         "#]],
2874     );
2875 }
2876
2877 #[test]
2878 fn integer_range_iterate() {
2879     check_types(
2880         r#"
2881 //- /main.rs crate:main deps:core
2882 fn test() {
2883     for x in 0..100 { x; }
2884 }                   //^ i32
2885
2886 //- /core.rs crate:core
2887 pub mod ops {
2888     pub struct Range<Idx> {
2889         pub start: Idx,
2890         pub end: Idx,
2891     }
2892 }
2893
2894 pub mod iter {
2895     pub trait Iterator {
2896         type Item;
2897     }
2898
2899     pub trait IntoIterator {
2900         type Item;
2901         type IntoIter: Iterator<Item = Self::Item>;
2902     }
2903
2904     impl<T> IntoIterator for T where T: Iterator {
2905         type Item = <T as Iterator>::Item;
2906         type IntoIter = Self;
2907     }
2908 }
2909
2910 trait Step {}
2911 impl Step for i32 {}
2912 impl Step for i64 {}
2913
2914 impl<A: Step> iter::Iterator for ops::Range<A> {
2915     type Item = A;
2916 }
2917 "#,
2918     );
2919 }
2920
2921 #[test]
2922 fn infer_closure_arg() {
2923     check_infer(
2924         r#"
2925 //- /lib.rs
2926
2927 enum Option<T> {
2928     None,
2929     Some(T)
2930 }
2931
2932 fn foo() {
2933     let s = Option::None;
2934     let f = |x: Option<i32>| {};
2935     (&f)(s)
2936 }"#,
2937         expect![[r#"
2938             52..126 '{     ...)(s) }': ()
2939             62..63 's': Option<i32>
2940             66..78 'Option::None': Option<i32>
2941             88..89 'f': |Option<i32>| -> ()
2942             92..111 '|x: Op...2>| {}': |Option<i32>| -> ()
2943             93..94 'x': Option<i32>
2944             109..111 '{}': ()
2945             117..124 '(&f)(s)': ()
2946             118..120 '&f': &|Option<i32>| -> ()
2947             119..120 'f': |Option<i32>| -> ()
2948             122..123 's': Option<i32>
2949         "#]],
2950     );
2951 }
2952
2953 #[test]
2954 fn infer_fn_trait_arg() {
2955     check_infer_with_mismatches(
2956         r#"
2957 //- minicore: fn, option
2958 fn foo<F, T>(f: F) -> T
2959 where
2960     F: Fn(Option<i32>) -> T,
2961 {
2962     let s = None;
2963     f(s)
2964 }
2965 "#,
2966         expect![[r#"
2967             13..14 'f': F
2968             59..89 '{     ...f(s) }': T
2969             69..70 's': Option<i32>
2970             73..77 'None': Option<i32>
2971             83..84 'f': F
2972             83..87 'f(s)': T
2973             85..86 's': Option<i32>
2974         "#]],
2975     );
2976 }
2977
2978 #[test]
2979 fn infer_box_fn_arg() {
2980     // The type mismatch is because we don't define Unsize and CoerceUnsized
2981     check_infer_with_mismatches(
2982         r#"
2983 //- /lib.rs deps:std
2984
2985 #[lang = "fn_once"]
2986 pub trait FnOnce<Args> {
2987     type Output;
2988
2989     extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
2990 }
2991
2992 #[lang = "deref"]
2993 pub trait Deref {
2994     type Target: ?Sized;
2995
2996     fn deref(&self) -> &Self::Target;
2997 }
2998
2999 #[lang = "owned_box"]
3000 pub struct Box<T: ?Sized> {
3001     inner: *mut T,
3002 }
3003
3004 impl<T: ?Sized> Deref for Box<T> {
3005     type Target = T;
3006
3007     fn deref(&self) -> &T {
3008         &self.inner
3009     }
3010 }
3011
3012 enum Option<T> {
3013     None,
3014     Some(T)
3015 }
3016
3017 fn foo() {
3018     let s = Option::None;
3019     let f: Box<dyn FnOnce(&Option<i32>)> = box (|ps| {});
3020     f(&s);
3021 }"#,
3022         expect![[r#"
3023             100..104 'self': Self
3024             106..110 'args': Args
3025             214..218 'self': &Self
3026             384..388 'self': &Box<T>
3027             396..423 '{     ...     }': &T
3028             406..417 '&self.inner': &*mut T
3029             407..411 'self': &Box<T>
3030             407..417 'self.inner': *mut T
3031             478..576 '{     ...&s); }': ()
3032             488..489 's': Option<i32>
3033             492..504 'Option::None': Option<i32>
3034             514..515 'f': Box<dyn FnOnce(&Option<i32>)>
3035             549..562 'box (|ps| {})': Box<|{unknown}| -> ()>
3036             554..561 '|ps| {}': |{unknown}| -> ()
3037             555..557 'ps': {unknown}
3038             559..561 '{}': ()
3039             568..569 'f': Box<dyn FnOnce(&Option<i32>)>
3040             568..573 'f(&s)': ()
3041             570..572 '&s': &Option<i32>
3042             571..572 's': Option<i32>
3043             549..562: expected Box<dyn FnOnce(&Option<i32>)>, got Box<|{unknown}| -> ()>
3044         "#]],
3045     );
3046 }
3047
3048 #[test]
3049 fn infer_dyn_fn_output() {
3050     check_types(
3051         r#"
3052 //- minicore: fn
3053 fn foo() {
3054     let f: &dyn Fn() -> i32;
3055     f();
3056   //^^^ i32
3057 }"#,
3058     );
3059 }
3060
3061 #[test]
3062 fn infer_dyn_fn_once_output() {
3063     check_types(
3064         r#"
3065 //- minicore: fn
3066 fn foo() {
3067     let f: dyn FnOnce() -> i32;
3068     f();
3069   //^^^ i32
3070 }"#,
3071     );
3072 }
3073
3074 #[test]
3075 fn variable_kinds_1() {
3076     check_types(
3077         r#"
3078 trait Trait<T> { fn get(self, t: T) -> T; }
3079 struct S;
3080 impl Trait<u128> for S {}
3081 impl Trait<f32> for S {}
3082 fn test() {
3083     S.get(1);
3084   //^^^^^^^^ u128
3085     S.get(1.);
3086   //^^^^^^^^ f32
3087 }
3088         "#,
3089     );
3090 }
3091
3092 #[test]
3093 fn variable_kinds_2() {
3094     check_types(
3095         r#"
3096 trait Trait { fn get(self) -> Self; }
3097 impl Trait for u128 {}
3098 impl Trait for f32 {}
3099 fn test() {
3100     1.get();
3101   //^^^^^^^ u128
3102     (1.).get();
3103   //^^^^^^^^^^ f32
3104 }
3105         "#,
3106     );
3107 }
3108
3109 #[test]
3110 fn underscore_import() {
3111     check_types(
3112         r#"
3113 mod tr {
3114     pub trait Tr {
3115         fn method(&self) -> u8 { 0 }
3116     }
3117 }
3118
3119 struct Tr;
3120 impl crate::tr::Tr for Tr {}
3121
3122 use crate::tr::Tr as _;
3123 fn test() {
3124     Tr.method();
3125   //^^^^^^^^^^^ u8
3126 }
3127     "#,
3128     );
3129 }
3130
3131 #[test]
3132 fn inner_use() {
3133     check_types(
3134         r#"
3135 mod m {
3136     pub trait Tr {
3137         fn method(&self) -> u8 { 0 }
3138     }
3139
3140     impl Tr for () {}
3141 }
3142
3143 fn f() {
3144     use m::Tr;
3145
3146     ().method();
3147   //^^^^^^^^^^^ u8
3148 }
3149         "#,
3150     );
3151 }
3152
3153 #[test]
3154 fn trait_in_scope_with_inner_item() {
3155     check_infer(
3156         r#"
3157 mod m {
3158     pub trait Tr {
3159         fn method(&self) -> u8 { 0 }
3160     }
3161
3162     impl Tr for () {}
3163 }
3164
3165 use m::Tr;
3166
3167 fn f() {
3168     fn inner() {
3169         ().method();
3170       //^^^^^^^^^^^ u8
3171     }
3172 }"#,
3173         expect![[r#"
3174             46..50 'self': &Self
3175             58..63 '{ 0 }': u8
3176             60..61 '0': u8
3177             115..185 '{     ...   } }': ()
3178             132..183 '{     ...     }': ()
3179             142..144 '()': ()
3180             142..153 '().method()': u8
3181         "#]],
3182     );
3183 }
3184
3185 #[test]
3186 fn inner_use_in_block() {
3187     check_types(
3188         r#"
3189 mod m {
3190     pub trait Tr {
3191         fn method(&self) -> u8 { 0 }
3192     }
3193
3194     impl Tr for () {}
3195 }
3196
3197 fn f() {
3198     {
3199         use m::Tr;
3200
3201         ().method();
3202       //^^^^^^^^^^^ u8
3203     }
3204
3205     {
3206         ().method();
3207       //^^^^^^^^^^^ {unknown}
3208     }
3209
3210     ().method();
3211   //^^^^^^^^^^^ {unknown}
3212 }
3213         "#,
3214     );
3215 }
3216
3217 #[test]
3218 fn nested_inner_function_calling_self() {
3219     check_infer(
3220         r#"
3221 struct S;
3222 fn f() {
3223     fn inner() -> S {
3224         let s = inner();
3225     }
3226 }"#,
3227         expect![[r#"
3228             17..73 '{     ...   } }': ()
3229             39..71 '{     ...     }': ()
3230             53..54 's': S
3231             57..62 'inner': fn inner() -> S
3232             57..64 'inner()': S
3233         "#]],
3234     )
3235 }
3236
3237 #[test]
3238 fn infer_default_trait_type_parameter() {
3239     check_infer(
3240         r#"
3241 struct A;
3242
3243 trait Op<RHS=Self> {
3244     type Output;
3245
3246     fn do_op(self, rhs: RHS) -> Self::Output;
3247 }
3248
3249 impl Op for A {
3250     type Output = bool;
3251
3252     fn do_op(self, rhs: Self) -> Self::Output {
3253         true
3254     }
3255 }
3256
3257 fn test() {
3258     let x = A;
3259     let y = A;
3260     let r = x.do_op(y);
3261 }"#,
3262         expect![[r#"
3263             63..67 'self': Self
3264             69..72 'rhs': RHS
3265             153..157 'self': A
3266             159..162 'rhs': A
3267             186..206 '{     ...     }': bool
3268             196..200 'true': bool
3269             220..277 '{     ...(y); }': ()
3270             230..231 'x': A
3271             234..235 'A': A
3272             245..246 'y': A
3273             249..250 'A': A
3274             260..261 'r': bool
3275             264..265 'x': A
3276             264..274 'x.do_op(y)': bool
3277             272..273 'y': A
3278         "#]],
3279     )
3280 }
3281
3282 #[test]
3283 fn qualified_path_as_qualified_trait() {
3284     check_infer(
3285         r#"
3286 mod foo {
3287
3288     pub trait Foo {
3289         type Target;
3290     }
3291     pub trait Bar {
3292         type Output;
3293         fn boo() -> Self::Output {
3294             loop {}
3295         }
3296     }
3297 }
3298
3299 struct F;
3300 impl foo::Foo for F {
3301     type Target = ();
3302 }
3303 impl foo::Bar for F {
3304     type Output = <F as foo::Foo>::Target;
3305 }
3306
3307 fn foo() {
3308     use foo::Bar;
3309     let x = <F as Bar>::boo();
3310 }"#,
3311         expect![[r#"
3312             132..163 '{     ...     }': Bar::Output<Self>
3313             146..153 'loop {}': !
3314             151..153 '{}': ()
3315             306..358 '{     ...o(); }': ()
3316             334..335 'x': ()
3317             338..353 '<F as Bar>::boo': fn boo<F>() -> <F as Bar>::Output
3318             338..355 '<F as ...:boo()': ()
3319         "#]],
3320     );
3321 }
3322
3323 #[test]
3324 fn renamed_extern_crate_in_block() {
3325     check_types(
3326         r#"
3327 //- /lib.rs crate:lib deps:serde
3328 use serde::Deserialize;
3329
3330 struct Foo {}
3331
3332 const _ : () = {
3333     extern crate serde as _serde;
3334     impl _serde::Deserialize for Foo {
3335         fn deserialize() -> u8 { 0 }
3336     }
3337 };
3338
3339 fn foo() {
3340     Foo::deserialize();
3341   //^^^^^^^^^^^^^^^^^^ u8
3342 }
3343
3344 //- /serde.rs crate:serde
3345
3346 pub trait Deserialize {
3347     fn deserialize() -> u8;
3348 }"#,
3349     );
3350 }
3351
3352 #[test]
3353 fn bin_op_adt_with_rhs_primitive() {
3354     check_infer_with_mismatches(
3355         r#"
3356 #[lang = "add"]
3357 pub trait Add<Rhs = Self> {
3358     type Output;
3359     fn add(self, rhs: Rhs) -> Self::Output;
3360 }
3361
3362 struct Wrapper(u32);
3363 impl Add<u32> for Wrapper {
3364     type Output = Self;
3365     fn add(self, rhs: u32) -> Wrapper {
3366         Wrapper(rhs)
3367     }
3368 }
3369 fn main(){
3370     let wrapped = Wrapper(10);
3371     let num: u32 = 2;
3372     let res = wrapped + num;
3373
3374 }"#,
3375         expect![[r#"
3376             72..76 'self': Self
3377             78..81 'rhs': Rhs
3378             192..196 'self': Wrapper
3379             198..201 'rhs': u32
3380             219..247 '{     ...     }': Wrapper
3381             229..236 'Wrapper': Wrapper(u32) -> Wrapper
3382             229..241 'Wrapper(rhs)': Wrapper
3383             237..240 'rhs': u32
3384             259..345 '{     ...um;  }': ()
3385             269..276 'wrapped': Wrapper
3386             279..286 'Wrapper': Wrapper(u32) -> Wrapper
3387             279..290 'Wrapper(10)': Wrapper
3388             287..289 '10': u32
3389             300..303 'num': u32
3390             311..312 '2': u32
3391             322..325 'res': Wrapper
3392             328..335 'wrapped': Wrapper
3393             328..341 'wrapped + num': Wrapper
3394             338..341 'num': u32
3395         "#]],
3396     )
3397 }
3398
3399 #[test]
3400 fn array_length() {
3401     check_infer(
3402         r#"
3403 trait T {
3404     type Output;
3405     fn do_thing(&self) -> Self::Output;
3406 }
3407
3408 impl T for [u8; 4] {
3409     type Output = usize;
3410     fn do_thing(&self) -> Self::Output {
3411         2
3412     }
3413 }
3414
3415 impl T for [u8; 2] {
3416     type Output = u8;
3417     fn do_thing(&self) -> Self::Output {
3418         2
3419     }
3420 }
3421
3422 fn main() {
3423     let v = [0u8; 2];
3424     let v2 = v.do_thing();
3425     let v3 = [0u8; 4];
3426     let v4 = v3.do_thing();
3427 }
3428 "#,
3429         expect![[r#"
3430             44..48 'self': &Self
3431             133..137 'self': &[u8; 4]
3432             155..172 '{     ...     }': usize
3433             165..166 '2': usize
3434             236..240 'self': &[u8; 2]
3435             258..275 '{     ...     }': u8
3436             268..269 '2': u8
3437             289..392 '{     ...g(); }': ()
3438             299..300 'v': [u8; 2]
3439             303..311 '[0u8; 2]': [u8; 2]
3440             304..307 '0u8': u8
3441             309..310 '2': usize
3442             321..323 'v2': u8
3443             326..327 'v': [u8; 2]
3444             326..338 'v.do_thing()': u8
3445             348..350 'v3': [u8; 4]
3446             353..361 '[0u8; 4]': [u8; 4]
3447             354..357 '0u8': u8
3448             359..360 '4': usize
3449             371..373 'v4': usize
3450             376..378 'v3': [u8; 4]
3451             376..389 'v3.do_thing()': usize
3452         "#]],
3453     )
3454 }
3455
3456 // FIXME: We should infer the length of the returned array :)
3457 #[test]
3458 fn const_generics() {
3459     check_infer(
3460         r#"
3461 trait T {
3462     type Output;
3463     fn do_thing(&self) -> Self::Output;
3464 }
3465
3466 impl<const L: usize> T for [u8; L] {
3467     type Output = [u8; L];
3468     fn do_thing(&self) -> Self::Output {
3469         *self
3470     }
3471 }
3472
3473 fn main() {
3474     let v = [0u8; 2];
3475     let v2 = v.do_thing();
3476 }
3477 "#,
3478         expect![[r#"
3479             44..48 'self': &Self
3480             151..155 'self': &[u8; _]
3481             173..194 '{     ...     }': [u8; _]
3482             183..188 '*self': [u8; _]
3483             184..188 'self': &[u8; _]
3484             208..260 '{     ...g(); }': ()
3485             218..219 'v': [u8; 2]
3486             222..230 '[0u8; 2]': [u8; 2]
3487             223..226 '0u8': u8
3488             228..229 '2': usize
3489             240..242 'v2': [u8; _]
3490             245..246 'v': [u8; 2]
3491             245..257 'v.do_thing()': [u8; _]
3492         "#]],
3493     )
3494 }
3495
3496 #[test]
3497 fn fn_returning_unit() {
3498     check_infer_with_mismatches(
3499         r#"
3500 //- minicore: fn
3501 fn test<F: FnOnce()>(f: F) {
3502     let _: () = f();
3503 }"#,
3504         expect![[r#"
3505             21..22 'f': F
3506             27..51 '{     ...f(); }': ()
3507             37..38 '_': ()
3508             45..46 'f': F
3509             45..48 'f()': ()
3510         "#]],
3511     );
3512 }
3513
3514 #[test]
3515 fn trait_in_scope_of_trait_impl() {
3516     check_infer(
3517         r#"
3518 mod foo {
3519     pub trait Foo {
3520         fn foo(self);
3521         fn bar(self) -> usize { 0 }
3522     }
3523 }
3524 impl foo::Foo for u32 {
3525     fn foo(self) {
3526         let _x = self.bar();
3527     }
3528 }
3529     "#,
3530         expect![[r#"
3531             45..49 'self': Self
3532             67..71 'self': Self
3533             82..87 '{ 0 }': usize
3534             84..85 '0': usize
3535             131..135 'self': u32
3536             137..173 '{     ...     }': ()
3537             151..153 '_x': usize
3538             156..160 'self': u32
3539             156..166 'self.bar()': usize
3540         "#]],
3541     );
3542 }
3543
3544 #[test]
3545 fn infer_async_ret_type() {
3546     check_types(
3547         r#"
3548 //- minicore: future, result
3549 struct Fooey;
3550
3551 impl Fooey {
3552     fn collect<B: Convert>(self) -> B {
3553         B::new()
3554     }
3555 }
3556
3557 trait Convert {
3558     fn new() -> Self;
3559 }
3560 impl Convert for u32 {
3561     fn new() -> Self {
3562         0
3563     }
3564 }
3565
3566 async fn get_accounts() -> Result<u32, ()> {
3567     let ret = Fooey.collect();
3568     //                      ^ u32
3569     Ok(ret)
3570 }
3571 "#,
3572     );
3573 }
3574
3575 #[test]
3576 fn local_impl_1() {
3577     check_types(
3578         r#"
3579 trait Trait<T> {
3580     fn foo(&self) -> T;
3581 }
3582
3583 fn test() {
3584     struct S;
3585     impl Trait<u32> for S {
3586         fn foo(&self) { 0 }
3587     }
3588
3589     S.foo();
3590  // ^^^^^^^ u32
3591 }
3592 "#,
3593     );
3594 }
3595
3596 #[test]
3597 fn local_impl_2() {
3598     check_types(
3599         r#"
3600 struct S;
3601
3602 fn test() {
3603     trait Trait<T> {
3604         fn foo(&self) -> T;
3605     }
3606     impl Trait<u32> for S {
3607         fn foo(&self) { 0 }
3608     }
3609
3610     S.foo();
3611  // ^^^^^^^ u32
3612 }
3613 "#,
3614     );
3615 }
3616
3617 #[test]
3618 fn local_impl_3() {
3619     check_types(
3620         r#"
3621 trait Trait<T> {
3622     fn foo(&self) -> T;
3623 }
3624
3625 fn test() {
3626     struct S1;
3627     {
3628         struct S2;
3629
3630         impl Trait<S1> for S2 {
3631             fn foo(&self) { S1 }
3632         }
3633
3634         S2.foo();
3635      // ^^^^^^^^ S1
3636     }
3637 }
3638 "#,
3639     );
3640 }