]> git.lizzy.rs Git - rust.git/blob - crates/hir_ty/src/tests/regression.rs
1edec1615fd65a9bc044cdb2c2caad7b7b1a3521
[rust.git] / crates / hir_ty / src / tests / regression.rs
1 use expect_test::expect;
2
3 use super::{check_infer, check_types};
4
5 #[test]
6 fn bug_484() {
7     check_infer(
8         r#"
9         fn test() {
10             let x = if true {};
11         }
12         "#,
13         expect![[r#"
14             10..37 '{     ... {}; }': ()
15             20..21 'x': ()
16             24..34 'if true {}': ()
17             27..31 'true': bool
18             32..34 '{}': ()
19         "#]],
20     );
21 }
22
23 #[test]
24 fn no_panic_on_field_of_enum() {
25     check_infer(
26         r#"
27         enum X {}
28
29         fn test(x: X) {
30             x.some_field;
31         }
32         "#,
33         expect![[r#"
34             19..20 'x': X
35             25..46 '{     ...eld; }': ()
36             31..32 'x': X
37             31..43 'x.some_field': {unknown}
38         "#]],
39     );
40 }
41
42 #[test]
43 fn bug_585() {
44     check_infer(
45         r#"
46         fn test() {
47             X {};
48             match x {
49                 A::B {} => (),
50                 A::Y() => (),
51             }
52         }
53         "#,
54         expect![[r#"
55             10..88 '{     ...   } }': ()
56             16..20 'X {}': {unknown}
57             26..86 'match ...     }': ()
58             32..33 'x': {unknown}
59             44..51 'A::B {}': {unknown}
60             55..57 '()': ()
61             67..73 'A::Y()': {unknown}
62             77..79 '()': ()
63         "#]],
64     );
65 }
66
67 #[test]
68 fn bug_651() {
69     check_infer(
70         r#"
71         fn quux() {
72             let y = 92;
73             1 + y;
74         }
75         "#,
76         expect![[r#"
77             10..40 '{     ...+ y; }': ()
78             20..21 'y': i32
79             24..26 '92': i32
80             32..33 '1': i32
81             32..37 '1 + y': i32
82             36..37 'y': i32
83         "#]],
84     );
85 }
86
87 #[test]
88 fn recursive_vars() {
89     check_infer(
90         r#"
91         fn test() {
92             let y = unknown;
93             [y, &y];
94         }
95         "#,
96         expect![[r#"
97             10..47 '{     ...&y]; }': ()
98             20..21 'y': {unknown}
99             24..31 'unknown': {unknown}
100             37..44 '[y, &y]': [{unknown}; 2]
101             38..39 'y': {unknown}
102             41..43 '&y': &{unknown}
103             42..43 'y': {unknown}
104         "#]],
105     );
106 }
107
108 #[test]
109 fn recursive_vars_2() {
110     check_infer(
111         r#"
112         fn test() {
113             let x = unknown;
114             let y = unknown;
115             [(x, y), (&y, &x)];
116         }
117         "#,
118         expect![[r#"
119             10..79 '{     ...x)]; }': ()
120             20..21 'x': &{unknown}
121             24..31 'unknown': &{unknown}
122             41..42 'y': {unknown}
123             45..52 'unknown': {unknown}
124             58..76 '[(x, y..., &x)]': [(&{unknown}, {unknown}); 2]
125             59..65 '(x, y)': (&{unknown}, {unknown})
126             60..61 'x': &{unknown}
127             63..64 'y': {unknown}
128             67..75 '(&y, &x)': (&{unknown}, {unknown})
129             68..70 '&y': &{unknown}
130             69..70 'y': {unknown}
131             72..74 '&x': &&{unknown}
132             73..74 'x': &{unknown}
133         "#]],
134     );
135 }
136
137 #[test]
138 fn infer_std_crash_1() {
139     // caused stack overflow, taken from std
140     check_infer(
141         r#"
142         enum Maybe<T> {
143             Real(T),
144             Fake,
145         }
146
147         fn write() {
148             match something_unknown {
149                 Maybe::Real(ref mut something) => (),
150             }
151         }
152         "#,
153         expect![[r#"
154             53..138 '{     ...   } }': ()
155             59..136 'match ...     }': ()
156             65..82 'someth...nknown': Maybe<{unknown}>
157             93..123 'Maybe:...thing)': Maybe<{unknown}>
158             105..122 'ref mu...ething': &mut {unknown}
159             127..129 '()': ()
160         "#]],
161     );
162 }
163
164 #[test]
165 fn infer_std_crash_2() {
166     // caused "equating two type variables, ...", taken from std
167     check_infer(
168         r#"
169         fn test_line_buffer() {
170             &[0, b'\n', 1, b'\n'];
171         }
172         "#,
173         expect![[r#"
174             22..52 '{     ...n']; }': ()
175             28..49 '&[0, b...b'\n']': &[u8; 4]
176             29..49 '[0, b'...b'\n']': [u8; 4]
177             30..31 '0': u8
178             33..38 'b'\n'': u8
179             40..41 '1': u8
180             43..48 'b'\n'': u8
181         "#]],
182     );
183 }
184
185 #[test]
186 fn infer_std_crash_3() {
187     // taken from rustc
188     check_infer(
189         r#"
190         pub fn compute() {
191             match nope!() {
192                 SizeSkeleton::Pointer { non_zero: true, tail } => {}
193             }
194         }
195         "#,
196         expect![[r#"
197             17..107 '{     ...   } }': ()
198             23..105 'match ...     }': ()
199             29..36 'nope!()': {unknown}
200             47..93 'SizeSk...tail }': {unknown}
201             81..85 'true': bool
202             81..85 'true': bool
203             87..91 'tail': {unknown}
204             97..99 '{}': ()
205         "#]],
206     );
207 }
208
209 #[test]
210 fn infer_std_crash_4() {
211     // taken from rustc
212     check_infer(
213         r#"
214         pub fn primitive_type() {
215             match *self {
216                 BorrowedRef { type_: Primitive(p), ..} => {},
217             }
218         }
219         "#,
220         expect![[r#"
221             24..105 '{     ...   } }': ()
222             30..103 'match ...     }': ()
223             36..41 '*self': {unknown}
224             37..41 'self': {unknown}
225             52..90 'Borrow...), ..}': {unknown}
226             73..85 'Primitive(p)': {unknown}
227             83..84 'p': {unknown}
228             94..96 '{}': ()
229         "#]],
230     );
231 }
232
233 #[test]
234 fn infer_std_crash_5() {
235     // taken from rustc
236     check_infer(
237         r#"
238         fn extra_compiler_flags() {
239             for content in doesnt_matter {
240                 let name = if doesnt_matter {
241                     first
242                 } else {
243                     &content
244                 };
245
246                 let content = if ICE_REPORT_COMPILER_FLAGS_STRIP_VALUE.contains(&name) {
247                     name
248                 } else {
249                     content
250                 };
251             }
252         }
253         "#,
254         expect![[r#"
255             26..322 '{     ...   } }': ()
256             32..320 'for co...     }': ()
257             36..43 'content': {unknown}
258             47..60 'doesnt_matter': {unknown}
259             61..320 '{     ...     }': ()
260             75..79 'name': &{unknown}
261             82..166 'if doe...     }': &{unknown}
262             85..98 'doesnt_matter': bool
263             99..128 '{     ...     }': &{unknown}
264             113..118 'first': &{unknown}
265             134..166 '{     ...     }': &{unknown}
266             148..156 '&content': &{unknown}
267             149..156 'content': {unknown}
268             181..188 'content': &{unknown}
269             191..313 'if ICE...     }': &{unknown}
270             194..231 'ICE_RE..._VALUE': {unknown}
271             194..247 'ICE_RE...&name)': bool
272             241..246 '&name': &&{unknown}
273             242..246 'name': &{unknown}
274             248..276 '{     ...     }': &{unknown}
275             262..266 'name': &{unknown}
276             282..313 '{     ...     }': {unknown}
277             296..303 'content': {unknown}
278         "#]],
279     );
280 }
281
282 #[test]
283 fn infer_nested_generics_crash() {
284     // another crash found typechecking rustc
285     check_infer(
286         r#"
287         struct Canonical<V> {
288             value: V,
289         }
290         struct QueryResponse<V> {
291             value: V,
292         }
293         fn test<R>(query_response: Canonical<QueryResponse<R>>) {
294             &query_response.value;
295         }
296         "#,
297         expect![[r#"
298             91..105 'query_response': Canonical<QueryResponse<R>>
299             136..166 '{     ...lue; }': ()
300             142..163 '&query....value': &QueryResponse<R>
301             143..157 'query_response': Canonical<QueryResponse<R>>
302             143..163 'query_....value': QueryResponse<R>
303         "#]],
304     );
305 }
306
307 #[test]
308 fn infer_paren_macro_call() {
309     check_infer(
310         r#"
311         macro_rules! bar { () => {0u32} }
312         fn test() {
313             let a = (bar!());
314         }
315         "#,
316         expect![[r#"
317             !0..4 '0u32': u32
318             44..69 '{     ...()); }': ()
319             54..55 'a': u32
320         "#]],
321     );
322 }
323
324 #[test]
325 fn infer_array_macro_call() {
326     check_infer(
327         r#"
328         macro_rules! bar { () => {0u32} }
329         fn test() {
330             let a = [bar!()];
331         }
332         "#,
333         expect![[r#"
334             !0..4 '0u32': u32
335             44..69 '{     ...()]; }': ()
336             54..55 'a': [u32; 1]
337             58..66 '[bar!()]': [u32; 1]
338         "#]],
339     );
340 }
341
342 #[test]
343 fn bug_1030() {
344     check_infer(
345         r#"
346         struct HashSet<T, H>;
347         struct FxHasher;
348         type FxHashSet<T> = HashSet<T, FxHasher>;
349
350         impl<T, H> HashSet<T, H> {
351             fn default() -> HashSet<T, H> {}
352         }
353
354         pub fn main_loop() {
355             FxHashSet::default();
356         }
357         "#,
358         expect![[r#"
359             143..145 '{}': ()
360             168..197 '{     ...t(); }': ()
361             174..192 'FxHash...efault': fn default<{unknown}, FxHasher>() -> HashSet<{unknown}, FxHasher>
362             174..194 'FxHash...ault()': HashSet<{unknown}, FxHasher>
363         "#]],
364     );
365 }
366
367 #[test]
368 fn issue_2669() {
369     check_infer(
370         r#"
371         trait A {}
372         trait Write {}
373         struct Response<T> {}
374
375         trait D {
376             fn foo();
377         }
378
379         impl<T:A> D for Response<T> {
380             fn foo() {
381                 end();
382                 fn end<W: Write>() {
383                     let _x: T =  loop {};
384                 }
385             }
386         }
387         "#,
388         expect![[r#"
389             119..214 '{     ...     }': ()
390             129..132 'end': fn end<{unknown}>()
391             129..134 'end()': ()
392             163..208 '{     ...     }': ()
393             181..183 '_x': !
394             190..197 'loop {}': !
395             195..197 '{}': ()
396         "#]],
397     )
398 }
399
400 #[test]
401 fn issue_2705() {
402     check_infer(
403         r#"
404         trait Trait {}
405         fn test() {
406             <Trait<u32>>::foo()
407         }
408         "#,
409         expect![[r#"
410             25..52 '{     ...oo() }': ()
411             31..48 '<Trait...>::foo': {unknown}
412             31..50 '<Trait...:foo()': ()
413         "#]],
414     );
415 }
416
417 #[test]
418 fn issue_2683_chars_impl() {
419     check_types(
420         r#"
421 //- /main.rs crate:main deps:std
422 fn test() {
423     let chars: std::str::Chars<'_>;
424     (chars.next(), chars.nth(1));
425 } //^ (Option<char>, Option<char>)
426
427 //- /std.rs crate:std
428 #[prelude_import]
429 use self::prelude::rust_2018::*;
430 pub mod prelude {
431     pub mod rust_2018 {
432         pub use crate::iter::Iterator;
433         pub use crate::option::Option;
434     }
435 }
436
437 pub mod iter {
438     pub use self::traits::Iterator;
439     pub mod traits {
440         pub use self::iterator::Iterator;
441
442         pub mod iterator {
443             pub trait Iterator {
444                 type Item;
445                 fn next(&mut self) -> Option<Self::Item>;
446                 fn nth(&mut self, n: usize) -> Option<Self::Item> {}
447             }
448         }
449     }
450 }
451
452 pub mod option {
453     pub enum Option<T> {}
454 }
455
456 pub mod str {
457     pub struct Chars<'a> {}
458     impl<'a> Iterator for Chars<'a> {
459         type Item = char;
460         fn next(&mut self) -> Option<char> {}
461     }
462 }
463 "#,
464     );
465 }
466
467 #[test]
468 fn issue_3642_bad_macro_stackover() {
469     check_types(
470         r#"
471 #[macro_export]
472 macro_rules! match_ast {
473     (match $node:ident { $($tt:tt)* }) => { match_ast!(match ($node) { $($tt)* }) };
474
475     (match ($node:expr) {
476         $( ast::$ast:ident($it:ident) => $res:expr, )*
477         _ => $catch_all:expr $(,)?
478     }) => {{
479         $( if let Some($it) = ast::$ast::cast($node.clone()) { $res } else )*
480         { $catch_all }
481     }};
482 }
483
484 fn main() {
485     let anchor = match_ast! {
486        //^ ()
487         match parent {
488             as => {},
489             _ => return None
490         }
491     };
492 }"#,
493     );
494 }
495
496 #[test]
497 fn issue_3999_slice() {
498     check_infer(
499         r#"
500         fn foo(params: &[usize]) {
501             match params {
502                 [ps @ .., _] => {}
503             }
504         }
505         "#,
506         expect![[r#"
507             7..13 'params': &[usize]
508             25..80 '{     ...   } }': ()
509             31..78 'match ...     }': ()
510             37..43 'params': &[usize]
511             54..66 '[ps @ .., _]': [usize]
512             55..62 'ps @ ..': &[usize]
513             60..62 '..': [usize]
514             64..65 '_': usize
515             70..72 '{}': ()
516         "#]],
517     );
518 }
519
520 #[test]
521 fn issue_3999_struct() {
522     // rust-analyzer should not panic on seeing this malformed
523     // record pattern.
524     check_infer(
525         r#"
526         struct Bar {
527             a: bool,
528         }
529         fn foo(b: Bar) {
530             match b {
531                 Bar { a: .. } => {},
532             }
533         }
534         "#,
535         expect![[r#"
536             35..36 'b': Bar
537             43..95 '{     ...   } }': ()
538             49..93 'match ...     }': ()
539             55..56 'b': Bar
540             67..80 'Bar { a: .. }': Bar
541             76..78 '..': bool
542             84..86 '{}': ()
543         "#]],
544     );
545 }
546
547 #[test]
548 fn issue_4235_name_conflicts() {
549     check_infer(
550         r#"
551         struct FOO {}
552         static FOO:FOO = FOO {};
553
554         impl FOO {
555             fn foo(&self) {}
556         }
557
558         fn main() {
559             let a = &FOO;
560             a.foo();
561         }
562         "#,
563         expect![[r#"
564             31..37 'FOO {}': FOO
565             63..67 'self': &FOO
566             69..71 '{}': ()
567             85..119 '{     ...o(); }': ()
568             95..96 'a': &FOO
569             99..103 '&FOO': &FOO
570             100..103 'FOO': FOO
571             109..110 'a': &FOO
572             109..116 'a.foo()': ()
573         "#]],
574     );
575 }
576
577 #[test]
578 fn issue_4465_dollar_crate_at_type() {
579     check_infer(
580         r#"
581         pub struct Foo {}
582         pub fn anything<T>() -> T {
583             loop {}
584         }
585         macro_rules! foo {
586             () => {{
587                 let r: $crate::Foo = anything();
588                 r
589             }};
590         }
591         fn main() {
592             let _a = foo!();
593         }
594         "#,
595         expect![[r#"
596             44..59 '{     loop {} }': T
597             50..57 'loop {}': !
598             55..57 '{}': ()
599             !0..31 '{letr:...g();r}': Foo
600             !4..5 'r': Foo
601             !18..26 'anything': fn anything<Foo>() -> Foo
602             !18..28 'anything()': Foo
603             !29..30 'r': Foo
604             163..187 '{     ...!(); }': ()
605             173..175 '_a': Foo
606         "#]],
607     );
608 }
609
610 #[test]
611 fn issue_6811() {
612     check_infer(
613         r#"
614         macro_rules! profile_function {
615             () => {
616                 let _a = 1;
617                 let _b = 1;
618             };
619         }
620         fn main() {
621             profile_function!();
622         }
623         "#,
624         expect![[r#"
625             !3..5 '_a': i32
626             !6..7 '1': i32
627             !11..13 '_b': i32
628             !14..15 '1': i32
629             103..131 '{     ...!(); }': ()
630         "#]],
631     );
632 }
633
634 #[test]
635 fn issue_4053_diesel_where_clauses() {
636     check_infer(
637         r#"
638         trait BoxedDsl<DB> {
639             type Output;
640             fn internal_into_boxed(self) -> Self::Output;
641         }
642
643         struct SelectStatement<From, Select, Distinct, Where, Order, LimitOffset, GroupBy, Locking> {
644             order: Order,
645         }
646
647         trait QueryFragment<DB: Backend> {}
648
649         trait Into<T> { fn into(self) -> T; }
650
651         impl<F, S, D, W, O, LOf, DB> BoxedDsl<DB>
652             for SelectStatement<F, S, D, W, O, LOf, G>
653         where
654             O: Into<dyn QueryFragment<DB>>,
655         {
656             type Output = XXX;
657
658             fn internal_into_boxed(self) -> Self::Output {
659                 self.order.into();
660             }
661         }
662         "#,
663         expect![[r#"
664             65..69 'self': Self
665             267..271 'self': Self
666             466..470 'self': SelectStatement<F, S, D, W, O, LOf, {unknown}, {unknown}>
667             488..522 '{     ...     }': ()
668             498..502 'self': SelectStatement<F, S, D, W, O, LOf, {unknown}, {unknown}>
669             498..508 'self.order': O
670             498..515 'self.o...into()': dyn QueryFragment<DB>
671         "#]],
672     );
673 }
674
675 #[test]
676 fn issue_4953() {
677     check_infer(
678         r#"
679         pub struct Foo(pub i64);
680         impl Foo {
681             fn test() -> Self { Self(0i64) }
682         }
683         "#,
684         expect![[r#"
685             58..72 '{ Self(0i64) }': Foo
686             60..64 'Self': Foo(i64) -> Foo
687             60..70 'Self(0i64)': Foo
688             65..69 '0i64': i64
689         "#]],
690     );
691     check_infer(
692         r#"
693         pub struct Foo<T>(pub T);
694         impl Foo<i64> {
695             fn test() -> Self { Self(0i64) }
696         }
697         "#,
698         expect![[r#"
699             64..78 '{ Self(0i64) }': Foo<i64>
700             66..70 'Self': Foo<i64>(i64) -> Foo<i64>
701             66..76 'Self(0i64)': Foo<i64>
702             71..75 '0i64': i64
703         "#]],
704     );
705 }
706
707 #[test]
708 fn issue_4931() {
709     check_infer(
710         r#"
711         trait Div<T> {
712             type Output;
713         }
714
715         trait CheckedDiv: Div<()> {}
716
717         trait PrimInt: CheckedDiv<Output = ()> {
718             fn pow(self);
719         }
720
721         fn check<T: PrimInt>(i: T) {
722             i.pow();
723         }
724         "#,
725         expect![[r#"
726             117..121 'self': Self
727             148..149 'i': T
728             154..170 '{     ...w(); }': ()
729             160..161 'i': T
730             160..167 'i.pow()': ()
731         "#]],
732     );
733 }
734
735 #[test]
736 fn issue_4885() {
737     check_infer(
738         r#"
739         #[lang = "coerce_unsized"]
740         pub trait CoerceUnsized<T> {}
741
742         trait Future {
743             type Output;
744         }
745         trait Foo<R> {
746             type Bar;
747         }
748         fn foo<R, K>(key: &K) -> impl Future<Output = K::Bar>
749         where
750             K: Foo<R>,
751         {
752             bar(key)
753         }
754         fn bar<R, K>(key: &K) -> impl Future<Output = K::Bar>
755         where
756             K: Foo<R>,
757         {
758         }
759         "#,
760         expect![[r#"
761             136..139 'key': &K
762             198..214 '{     ...key) }': impl Future<Output = <K as Foo<R>>::Bar>
763             204..207 'bar': fn bar<R, K>(&K) -> impl Future<Output = <K as Foo<R>>::Bar>
764             204..212 'bar(key)': impl Future<Output = <K as Foo<R>>::Bar>
765             208..211 'key': &K
766             228..231 'key': &K
767             290..293 '{ }': ()
768         "#]],
769     );
770 }
771
772 #[test]
773 fn issue_4800() {
774     check_infer(
775         r#"
776         trait Debug {}
777
778         struct Foo<T>;
779
780         type E1<T> = (T, T, T);
781         type E2<T> = E1<E1<E1<(T, T, T)>>>;
782
783         impl Debug for Foo<E2<()>> {}
784
785         struct Request;
786
787         pub trait Future {
788             type Output;
789         }
790
791         pub struct PeerSet<D>;
792
793         impl<D> Service<Request> for PeerSet<D>
794         where
795             D: Discover,
796             D::Key: Debug,
797         {
798             type Error = ();
799             type Future = dyn Future<Output = Self::Error>;
800
801             fn call(&mut self) -> Self::Future {
802                 loop {}
803             }
804         }
805
806         pub trait Discover {
807             type Key;
808         }
809
810         pub trait Service<Request> {
811             type Error;
812             type Future: Future<Output = Self::Error>;
813             fn call(&mut self) -> Self::Future;
814         }
815         "#,
816         expect![[r#"
817             379..383 'self': &mut PeerSet<D>
818             401..424 '{     ...     }': dyn Future<Output = ()>
819             411..418 'loop {}': !
820             416..418 '{}': ()
821             575..579 'self': &mut Self
822         "#]],
823     );
824 }
825
826 #[test]
827 fn issue_4966() {
828     check_infer(
829         r#"
830         pub trait IntoIterator {
831             type Item;
832         }
833
834         struct Repeat<A> { element: A }
835
836         struct Map<F> { f: F }
837
838         struct Vec<T> {}
839
840         #[lang = "deref"]
841         pub trait Deref {
842             type Target;
843         }
844
845         impl<T> Deref for Vec<T> {
846             type Target = [T];
847         }
848
849         fn from_iter<A, T: IntoIterator<Item = A>>(iter: T) -> Vec<A> {}
850
851         fn main() {
852             let inner = Map { f: |_: &f64| 0.0 };
853
854             let repeat = Repeat { element: inner };
855
856             let vec = from_iter(repeat);
857
858             vec.foo_bar();
859         }
860         "#,
861         expect![[r#"
862             270..274 'iter': T
863             289..291 '{}': ()
864             303..447 '{     ...r(); }': ()
865             313..318 'inner': Map<|&f64| -> f64>
866             321..345 'Map { ... 0.0 }': Map<|&f64| -> f64>
867             330..343 '|_: &f64| 0.0': |&f64| -> f64
868             331..332 '_': &f64
869             340..343 '0.0': f64
870             356..362 'repeat': Repeat<Map<|&f64| -> f64>>
871             365..390 'Repeat...nner }': Repeat<Map<|&f64| -> f64>>
872             383..388 'inner': Map<|&f64| -> f64>
873             401..404 'vec': Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
874             407..416 'from_iter': fn from_iter<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>, Repeat<Map<|&f64| -> f64>>>(Repeat<Map<|&f64| -> f64>>) -> Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
875             407..424 'from_i...epeat)': Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
876             417..423 'repeat': Repeat<Map<|&f64| -> f64>>
877             431..434 'vec': Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
878             431..444 'vec.foo_bar()': {unknown}
879         "#]],
880     );
881 }
882
883 #[test]
884 fn issue_6628() {
885     check_infer(
886         r#"
887 //- minicore: fn
888 struct S<T>();
889 impl<T> S<T> {
890     fn f(&self, _t: T) {}
891     fn g<F: FnOnce(&T)>(&self, _f: F) {}
892 }
893 fn main() {
894     let s = S();
895     s.g(|_x| {});
896     s.f(10);
897 }
898 "#,
899         expect![[r#"
900             40..44 'self': &S<T>
901             46..48 '_t': T
902             53..55 '{}': ()
903             81..85 'self': &S<T>
904             87..89 '_f': F
905             94..96 '{}': ()
906             109..160 '{     ...10); }': ()
907             119..120 's': S<i32>
908             123..124 'S': S<i32>() -> S<i32>
909             123..126 'S()': S<i32>
910             132..133 's': S<i32>
911             132..144 's.g(|_x| {})': ()
912             136..143 '|_x| {}': |&i32| -> ()
913             137..139 '_x': &i32
914             141..143 '{}': ()
915             150..151 's': S<i32>
916             150..157 's.f(10)': ()
917             154..156 '10': i32
918         "#]],
919     );
920 }
921
922 #[test]
923 fn issue_6852() {
924     check_infer(
925         r#"
926 //- minicore: deref
927 use core::ops::Deref;
928
929 struct BufWriter {}
930
931 struct Mutex<T> {}
932 struct MutexGuard<'a, T> {}
933 impl<T> Mutex<T> {
934     fn lock(&self) -> MutexGuard<'_, T> {}
935 }
936 impl<'a, T: 'a> Deref for MutexGuard<'a, T> {
937     type Target = T;
938 }
939 fn flush(&self) {
940     let w: &Mutex<BufWriter>;
941     *(w.lock());
942 }
943 "#,
944         expect![[r#"
945             123..127 'self': &Mutex<T>
946             150..152 '{}': ()
947             234..238 'self': &{unknown}
948             240..290 '{     ...()); }': ()
949             250..251 'w': &Mutex<BufWriter>
950             276..287 '*(w.lock())': BufWriter
951             278..279 'w': &Mutex<BufWriter>
952             278..286 'w.lock()': MutexGuard<BufWriter>
953         "#]],
954     );
955 }
956
957 #[test]
958 fn param_overrides_fn() {
959     check_types(
960         r#"
961         fn example(example: i32) {
962             fn f() {}
963             example;
964           //^^^^^^^ i32
965         }
966         "#,
967     )
968 }
969
970 #[test]
971 fn lifetime_from_chalk_during_deref() {
972     check_types(
973         r#"
974 //- minicore: deref
975 struct Box<T: ?Sized> {}
976 impl<T> core::ops::Deref for Box<T> {
977     type Target = T;
978
979     fn deref(&self) -> &Self::Target {
980         loop {}
981     }
982 }
983
984 trait Iterator {
985     type Item;
986 }
987
988 pub struct Iter<'a, T: 'a> {
989     inner: Box<dyn IterTrait<'a, T, Item = &'a T> + 'a>,
990 }
991
992 trait IterTrait<'a, T: 'a>: Iterator<Item = &'a T> {
993     fn clone_box(&self);
994 }
995
996 fn clone_iter<T>(s: Iter<T>) {
997     s.inner.clone_box();
998     //^^^^^^^^^^^^^^^^^^^ ()
999 }
1000 "#,
1001     )
1002 }
1003
1004 #[test]
1005 fn issue_8686() {
1006     check_infer(
1007         r#"
1008 pub trait Try: FromResidual {
1009     type Output;
1010     type Residual;
1011 }
1012 pub trait FromResidual<R = <Self as Try>::Residual> {
1013      fn from_residual(residual: R) -> Self;
1014 }
1015
1016 struct ControlFlow<B, C>;
1017 impl<B, C> Try for ControlFlow<B, C> {
1018     type Output = C;
1019     type Residual = ControlFlow<B, !>;
1020 }
1021 impl<B, C> FromResidual for ControlFlow<B, C> {
1022     fn from_residual(r: ControlFlow<B, !>) -> Self { ControlFlow }
1023 }
1024
1025 fn test() {
1026     ControlFlow::from_residual(ControlFlow::<u32, !>);
1027 }
1028         "#,
1029         expect![[r#"
1030             144..152 'residual': R
1031             365..366 'r': ControlFlow<B, !>
1032             395..410 '{ ControlFlow }': ControlFlow<B, C>
1033             397..408 'ControlFlow': ControlFlow<B, C>
1034             424..482 '{     ...!>); }': ()
1035             430..456 'Contro...sidual': fn from_residual<ControlFlow<u32, {unknown}>, ControlFlow<u32, !>>(ControlFlow<u32, !>) -> ControlFlow<u32, {unknown}>
1036             430..479 'Contro...2, !>)': ControlFlow<u32, {unknown}>
1037             457..478 'Contro...32, !>': ControlFlow<u32, !>
1038         "#]],
1039     );
1040 }
1041
1042 #[test]
1043 fn cfg_tail() {
1044     // https://github.com/rust-analyzer/rust-analyzer/issues/8378
1045     check_infer(
1046         r#"
1047         fn fake_tail(){
1048             { "first" }
1049             #[cfg(never)] 9
1050         }
1051         fn multiple_fake(){
1052             { "fake" }
1053             { "fake" }
1054             { "second" }
1055             #[cfg(never)] { 11 }
1056             #[cfg(never)] 12;
1057             #[cfg(never)] 13
1058         }
1059         fn no_normal_tail(){
1060             { "third" }
1061             #[cfg(never)] 14;
1062             #[cfg(never)] 15;
1063         }
1064         fn no_actual_tail(){
1065             { "fourth" };
1066             #[cfg(never)] 14;
1067             #[cfg(never)] 15
1068         }
1069         "#,
1070         expect![[r#"
1071             14..53 '{     ...)] 9 }': &str
1072             20..31 '{ "first" }': &str
1073             22..29 '"first"': &str
1074             72..190 '{     ...] 13 }': &str
1075             78..88 '{ "fake" }': &str
1076             80..86 '"fake"': &str
1077             93..103 '{ "fake" }': &str
1078             95..101 '"fake"': &str
1079             108..120 '{ "second" }': &str
1080             110..118 '"second"': &str
1081             210..273 '{     ... 15; }': &str
1082             216..227 '{ "third" }': &str
1083             218..225 '"third"': &str
1084             293..357 '{     ...] 15 }': ()
1085             299..311 '{ "fourth" }': &str
1086             301..309 '"fourth"': &str
1087         "#]],
1088     )
1089 }