]> git.lizzy.rs Git - rust.git/blob - crates/hir_ty/src/tests/regression.rs
minor: use minicore
[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 //- minicore: iterator
422 pub struct Chars<'a> {}
423 impl<'a> Iterator for Chars<'a> {
424     type Item = char;
425     fn next(&mut self) -> Option<char> {}
426 }
427
428 fn test() {
429     let chars: Chars<'_>;
430     (chars.next(), chars.nth(1));
431 } //^ (Option<char>, Option<char>)
432 "#,
433     );
434 }
435
436 #[test]
437 fn issue_3642_bad_macro_stackover() {
438     check_types(
439         r#"
440 #[macro_export]
441 macro_rules! match_ast {
442     (match $node:ident { $($tt:tt)* }) => { match_ast!(match ($node) { $($tt)* }) };
443
444     (match ($node:expr) {
445         $( ast::$ast:ident($it:ident) => $res:expr, )*
446         _ => $catch_all:expr $(,)?
447     }) => {{
448         $( if let Some($it) = ast::$ast::cast($node.clone()) { $res } else )*
449         { $catch_all }
450     }};
451 }
452
453 fn main() {
454     let anchor = match_ast! {
455        //^ ()
456         match parent {
457             as => {},
458             _ => return None
459         }
460     };
461 }"#,
462     );
463 }
464
465 #[test]
466 fn issue_3999_slice() {
467     check_infer(
468         r#"
469         fn foo(params: &[usize]) {
470             match params {
471                 [ps @ .., _] => {}
472             }
473         }
474         "#,
475         expect![[r#"
476             7..13 'params': &[usize]
477             25..80 '{     ...   } }': ()
478             31..78 'match ...     }': ()
479             37..43 'params': &[usize]
480             54..66 '[ps @ .., _]': [usize]
481             55..62 'ps @ ..': &[usize]
482             60..62 '..': [usize]
483             64..65 '_': usize
484             70..72 '{}': ()
485         "#]],
486     );
487 }
488
489 #[test]
490 fn issue_3999_struct() {
491     // rust-analyzer should not panic on seeing this malformed
492     // record pattern.
493     check_infer(
494         r#"
495         struct Bar {
496             a: bool,
497         }
498         fn foo(b: Bar) {
499             match b {
500                 Bar { a: .. } => {},
501             }
502         }
503         "#,
504         expect![[r#"
505             35..36 'b': Bar
506             43..95 '{     ...   } }': ()
507             49..93 'match ...     }': ()
508             55..56 'b': Bar
509             67..80 'Bar { a: .. }': Bar
510             76..78 '..': bool
511             84..86 '{}': ()
512         "#]],
513     );
514 }
515
516 #[test]
517 fn issue_4235_name_conflicts() {
518     check_infer(
519         r#"
520         struct FOO {}
521         static FOO:FOO = FOO {};
522
523         impl FOO {
524             fn foo(&self) {}
525         }
526
527         fn main() {
528             let a = &FOO;
529             a.foo();
530         }
531         "#,
532         expect![[r#"
533             31..37 'FOO {}': FOO
534             63..67 'self': &FOO
535             69..71 '{}': ()
536             85..119 '{     ...o(); }': ()
537             95..96 'a': &FOO
538             99..103 '&FOO': &FOO
539             100..103 'FOO': FOO
540             109..110 'a': &FOO
541             109..116 'a.foo()': ()
542         "#]],
543     );
544 }
545
546 #[test]
547 fn issue_4465_dollar_crate_at_type() {
548     check_infer(
549         r#"
550         pub struct Foo {}
551         pub fn anything<T>() -> T {
552             loop {}
553         }
554         macro_rules! foo {
555             () => {{
556                 let r: $crate::Foo = anything();
557                 r
558             }};
559         }
560         fn main() {
561             let _a = foo!();
562         }
563         "#,
564         expect![[r#"
565             44..59 '{     loop {} }': T
566             50..57 'loop {}': !
567             55..57 '{}': ()
568             !0..31 '{letr:...g();r}': Foo
569             !4..5 'r': Foo
570             !18..26 'anything': fn anything<Foo>() -> Foo
571             !18..28 'anything()': Foo
572             !29..30 'r': Foo
573             163..187 '{     ...!(); }': ()
574             173..175 '_a': Foo
575         "#]],
576     );
577 }
578
579 #[test]
580 fn issue_6811() {
581     check_infer(
582         r#"
583         macro_rules! profile_function {
584             () => {
585                 let _a = 1;
586                 let _b = 1;
587             };
588         }
589         fn main() {
590             profile_function!();
591         }
592         "#,
593         expect![[r#"
594             !3..5 '_a': i32
595             !6..7 '1': i32
596             !11..13 '_b': i32
597             !14..15 '1': i32
598             103..131 '{     ...!(); }': ()
599         "#]],
600     );
601 }
602
603 #[test]
604 fn issue_4053_diesel_where_clauses() {
605     check_infer(
606         r#"
607         trait BoxedDsl<DB> {
608             type Output;
609             fn internal_into_boxed(self) -> Self::Output;
610         }
611
612         struct SelectStatement<From, Select, Distinct, Where, Order, LimitOffset, GroupBy, Locking> {
613             order: Order,
614         }
615
616         trait QueryFragment<DB: Backend> {}
617
618         trait Into<T> { fn into(self) -> T; }
619
620         impl<F, S, D, W, O, LOf, DB> BoxedDsl<DB>
621             for SelectStatement<F, S, D, W, O, LOf, G>
622         where
623             O: Into<dyn QueryFragment<DB>>,
624         {
625             type Output = XXX;
626
627             fn internal_into_boxed(self) -> Self::Output {
628                 self.order.into();
629             }
630         }
631         "#,
632         expect![[r#"
633             65..69 'self': Self
634             267..271 'self': Self
635             466..470 'self': SelectStatement<F, S, D, W, O, LOf, {unknown}, {unknown}>
636             488..522 '{     ...     }': ()
637             498..502 'self': SelectStatement<F, S, D, W, O, LOf, {unknown}, {unknown}>
638             498..508 'self.order': O
639             498..515 'self.o...into()': dyn QueryFragment<DB>
640         "#]],
641     );
642 }
643
644 #[test]
645 fn issue_4953() {
646     check_infer(
647         r#"
648         pub struct Foo(pub i64);
649         impl Foo {
650             fn test() -> Self { Self(0i64) }
651         }
652         "#,
653         expect![[r#"
654             58..72 '{ Self(0i64) }': Foo
655             60..64 'Self': Foo(i64) -> Foo
656             60..70 'Self(0i64)': Foo
657             65..69 '0i64': i64
658         "#]],
659     );
660     check_infer(
661         r#"
662         pub struct Foo<T>(pub T);
663         impl Foo<i64> {
664             fn test() -> Self { Self(0i64) }
665         }
666         "#,
667         expect![[r#"
668             64..78 '{ Self(0i64) }': Foo<i64>
669             66..70 'Self': Foo<i64>(i64) -> Foo<i64>
670             66..76 'Self(0i64)': Foo<i64>
671             71..75 '0i64': i64
672         "#]],
673     );
674 }
675
676 #[test]
677 fn issue_4931() {
678     check_infer(
679         r#"
680         trait Div<T> {
681             type Output;
682         }
683
684         trait CheckedDiv: Div<()> {}
685
686         trait PrimInt: CheckedDiv<Output = ()> {
687             fn pow(self);
688         }
689
690         fn check<T: PrimInt>(i: T) {
691             i.pow();
692         }
693         "#,
694         expect![[r#"
695             117..121 'self': Self
696             148..149 'i': T
697             154..170 '{     ...w(); }': ()
698             160..161 'i': T
699             160..167 'i.pow()': ()
700         "#]],
701     );
702 }
703
704 #[test]
705 fn issue_4885() {
706     check_infer(
707         r#"
708         //- minicore: coerce_unsized, future
709         use core::future::Future;
710         trait Foo<R> {
711             type Bar;
712         }
713         fn foo<R, K>(key: &K) -> impl Future<Output = K::Bar>
714         where
715             K: Foo<R>,
716         {
717             bar(key)
718         }
719         fn bar<R, K>(key: &K) -> impl Future<Output = K::Bar>
720         where
721             K: Foo<R>,
722         {
723         }
724         "#,
725         expect![[r#"
726             70..73 'key': &K
727             132..148 '{     ...key) }': impl Future<Output = <K as Foo<R>>::Bar>
728             138..141 'bar': fn bar<R, K>(&K) -> impl Future<Output = <K as Foo<R>>::Bar>
729             138..146 'bar(key)': impl Future<Output = <K as Foo<R>>::Bar>
730             142..145 'key': &K
731             162..165 'key': &K
732             224..227 '{ }': ()
733         "#]],
734     );
735 }
736
737 #[test]
738 fn issue_4800() {
739     check_infer(
740         r#"
741         trait Debug {}
742
743         struct Foo<T>;
744
745         type E1<T> = (T, T, T);
746         type E2<T> = E1<E1<E1<(T, T, T)>>>;
747
748         impl Debug for Foo<E2<()>> {}
749
750         struct Request;
751
752         pub trait Future {
753             type Output;
754         }
755
756         pub struct PeerSet<D>;
757
758         impl<D> Service<Request> for PeerSet<D>
759         where
760             D: Discover,
761             D::Key: Debug,
762         {
763             type Error = ();
764             type Future = dyn Future<Output = Self::Error>;
765
766             fn call(&mut self) -> Self::Future {
767                 loop {}
768             }
769         }
770
771         pub trait Discover {
772             type Key;
773         }
774
775         pub trait Service<Request> {
776             type Error;
777             type Future: Future<Output = Self::Error>;
778             fn call(&mut self) -> Self::Future;
779         }
780         "#,
781         expect![[r#"
782             379..383 'self': &mut PeerSet<D>
783             401..424 '{     ...     }': dyn Future<Output = ()>
784             411..418 'loop {}': !
785             416..418 '{}': ()
786             575..579 'self': &mut Self
787         "#]],
788     );
789 }
790
791 #[test]
792 fn issue_4966() {
793     check_infer(
794         r#"
795         pub trait IntoIterator {
796             type Item;
797         }
798
799         struct Repeat<A> { element: A }
800
801         struct Map<F> { f: F }
802
803         struct Vec<T> {}
804
805         #[lang = "deref"]
806         pub trait Deref {
807             type Target;
808         }
809
810         impl<T> Deref for Vec<T> {
811             type Target = [T];
812         }
813
814         fn from_iter<A, T: IntoIterator<Item = A>>(iter: T) -> Vec<A> {}
815
816         fn main() {
817             let inner = Map { f: |_: &f64| 0.0 };
818
819             let repeat = Repeat { element: inner };
820
821             let vec = from_iter(repeat);
822
823             vec.foo_bar();
824         }
825         "#,
826         expect![[r#"
827             270..274 'iter': T
828             289..291 '{}': ()
829             303..447 '{     ...r(); }': ()
830             313..318 'inner': Map<|&f64| -> f64>
831             321..345 'Map { ... 0.0 }': Map<|&f64| -> f64>
832             330..343 '|_: &f64| 0.0': |&f64| -> f64
833             331..332 '_': &f64
834             340..343 '0.0': f64
835             356..362 'repeat': Repeat<Map<|&f64| -> f64>>
836             365..390 'Repeat...nner }': Repeat<Map<|&f64| -> f64>>
837             383..388 'inner': Map<|&f64| -> f64>
838             401..404 'vec': Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
839             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>>>>
840             407..424 'from_i...epeat)': Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
841             417..423 'repeat': Repeat<Map<|&f64| -> f64>>
842             431..434 'vec': Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
843             431..444 'vec.foo_bar()': {unknown}
844         "#]],
845     );
846 }
847
848 #[test]
849 fn issue_6628() {
850     check_infer(
851         r#"
852 //- minicore: fn
853 struct S<T>();
854 impl<T> S<T> {
855     fn f(&self, _t: T) {}
856     fn g<F: FnOnce(&T)>(&self, _f: F) {}
857 }
858 fn main() {
859     let s = S();
860     s.g(|_x| {});
861     s.f(10);
862 }
863 "#,
864         expect![[r#"
865             40..44 'self': &S<T>
866             46..48 '_t': T
867             53..55 '{}': ()
868             81..85 'self': &S<T>
869             87..89 '_f': F
870             94..96 '{}': ()
871             109..160 '{     ...10); }': ()
872             119..120 's': S<i32>
873             123..124 'S': S<i32>() -> S<i32>
874             123..126 'S()': S<i32>
875             132..133 's': S<i32>
876             132..144 's.g(|_x| {})': ()
877             136..143 '|_x| {}': |&i32| -> ()
878             137..139 '_x': &i32
879             141..143 '{}': ()
880             150..151 's': S<i32>
881             150..157 's.f(10)': ()
882             154..156 '10': i32
883         "#]],
884     );
885 }
886
887 #[test]
888 fn issue_6852() {
889     check_infer(
890         r#"
891 //- minicore: deref
892 use core::ops::Deref;
893
894 struct BufWriter {}
895
896 struct Mutex<T> {}
897 struct MutexGuard<'a, T> {}
898 impl<T> Mutex<T> {
899     fn lock(&self) -> MutexGuard<'_, T> {}
900 }
901 impl<'a, T: 'a> Deref for MutexGuard<'a, T> {
902     type Target = T;
903 }
904 fn flush(&self) {
905     let w: &Mutex<BufWriter>;
906     *(w.lock());
907 }
908 "#,
909         expect![[r#"
910             123..127 'self': &Mutex<T>
911             150..152 '{}': ()
912             234..238 'self': &{unknown}
913             240..290 '{     ...()); }': ()
914             250..251 'w': &Mutex<BufWriter>
915             276..287 '*(w.lock())': BufWriter
916             278..279 'w': &Mutex<BufWriter>
917             278..286 'w.lock()': MutexGuard<BufWriter>
918         "#]],
919     );
920 }
921
922 #[test]
923 fn param_overrides_fn() {
924     check_types(
925         r#"
926         fn example(example: i32) {
927             fn f() {}
928             example;
929           //^^^^^^^ i32
930         }
931         "#,
932     )
933 }
934
935 #[test]
936 fn lifetime_from_chalk_during_deref() {
937     check_types(
938         r#"
939 //- minicore: deref
940 struct Box<T: ?Sized> {}
941 impl<T> core::ops::Deref for Box<T> {
942     type Target = T;
943
944     fn deref(&self) -> &Self::Target {
945         loop {}
946     }
947 }
948
949 trait Iterator {
950     type Item;
951 }
952
953 pub struct Iter<'a, T: 'a> {
954     inner: Box<dyn IterTrait<'a, T, Item = &'a T> + 'a>,
955 }
956
957 trait IterTrait<'a, T: 'a>: Iterator<Item = &'a T> {
958     fn clone_box(&self);
959 }
960
961 fn clone_iter<T>(s: Iter<T>) {
962     s.inner.clone_box();
963     //^^^^^^^^^^^^^^^^^^^ ()
964 }
965 "#,
966     )
967 }
968
969 #[test]
970 fn issue_8686() {
971     check_infer(
972         r#"
973 pub trait Try: FromResidual {
974     type Output;
975     type Residual;
976 }
977 pub trait FromResidual<R = <Self as Try>::Residual> {
978      fn from_residual(residual: R) -> Self;
979 }
980
981 struct ControlFlow<B, C>;
982 impl<B, C> Try for ControlFlow<B, C> {
983     type Output = C;
984     type Residual = ControlFlow<B, !>;
985 }
986 impl<B, C> FromResidual for ControlFlow<B, C> {
987     fn from_residual(r: ControlFlow<B, !>) -> Self { ControlFlow }
988 }
989
990 fn test() {
991     ControlFlow::from_residual(ControlFlow::<u32, !>);
992 }
993         "#,
994         expect![[r#"
995             144..152 'residual': R
996             365..366 'r': ControlFlow<B, !>
997             395..410 '{ ControlFlow }': ControlFlow<B, C>
998             397..408 'ControlFlow': ControlFlow<B, C>
999             424..482 '{     ...!>); }': ()
1000             430..456 'Contro...sidual': fn from_residual<ControlFlow<u32, {unknown}>, ControlFlow<u32, !>>(ControlFlow<u32, !>) -> ControlFlow<u32, {unknown}>
1001             430..479 'Contro...2, !>)': ControlFlow<u32, {unknown}>
1002             457..478 'Contro...32, !>': ControlFlow<u32, !>
1003         "#]],
1004     );
1005 }
1006
1007 #[test]
1008 fn cfg_tail() {
1009     // https://github.com/rust-analyzer/rust-analyzer/issues/8378
1010     check_infer(
1011         r#"
1012         fn fake_tail(){
1013             { "first" }
1014             #[cfg(never)] 9
1015         }
1016         fn multiple_fake(){
1017             { "fake" }
1018             { "fake" }
1019             { "second" }
1020             #[cfg(never)] { 11 }
1021             #[cfg(never)] 12;
1022             #[cfg(never)] 13
1023         }
1024         fn no_normal_tail(){
1025             { "third" }
1026             #[cfg(never)] 14;
1027             #[cfg(never)] 15;
1028         }
1029         fn no_actual_tail(){
1030             { "fourth" };
1031             #[cfg(never)] 14;
1032             #[cfg(never)] 15
1033         }
1034         "#,
1035         expect![[r#"
1036             14..53 '{     ...)] 9 }': &str
1037             20..31 '{ "first" }': &str
1038             22..29 '"first"': &str
1039             72..190 '{     ...] 13 }': &str
1040             78..88 '{ "fake" }': &str
1041             80..86 '"fake"': &str
1042             93..103 '{ "fake" }': &str
1043             95..101 '"fake"': &str
1044             108..120 '{ "second" }': &str
1045             110..118 '"second"': &str
1046             210..273 '{     ... 15; }': &str
1047             216..227 '{ "third" }': &str
1048             218..225 '"third"': &str
1049             293..357 '{     ...] 15 }': ()
1050             299..311 '{ "fourth" }': &str
1051             301..309 '"fourth"': &str
1052         "#]],
1053     )
1054 }