1 use expect_test::expect;
3 use super::{check_infer, check_types};
14 10..37 '{ ... {}; }': ()
16 24..34 'if true {}': ()
24 fn no_panic_on_field_of_enum() {
35 25..46 '{ ...eld; }': ()
37 31..43 'x.some_field': {unknown}
55 10..88 '{ ... } }': ()
56 16..20 'X {}': {unknown}
57 26..86 'match ... }': ()
59 44..51 'A::B {}': {unknown}
61 67..73 'A::Y()': {unknown}
77 10..40 '{ ...+ y; }': ()
97 10..47 '{ ...&y]; }': ()
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}
109 fn recursive_vars_2() {
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}
138 fn infer_std_crash_1() {
139 // caused stack overflow, taken from std
148 match something_unknown {
149 Maybe::Real(ref mut something) => (),
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}
165 fn infer_std_crash_2() {
166 // caused "equating two type variables, ...", taken from std
169 fn test_line_buffer() {
170 &[0, b'\n', 1, b'\n'];
174 22..52 '{ ...n']; }': ()
175 28..49 '&[0, b...b'\n']': &[u8; 4]
176 29..49 '[0, b'...b'\n']': [u8; 4]
186 fn infer_std_crash_3() {
192 SizeSkeleton::Pointer { non_zero: true, tail } => {}
197 17..107 '{ ... } }': ()
198 23..105 'match ... }': ()
199 29..36 'nope!()': {unknown}
200 47..93 'SizeSk...tail }': {unknown}
203 87..91 'tail': {unknown}
210 fn infer_std_crash_4() {
214 pub fn primitive_type() {
216 BorrowedRef { type_: Primitive(p), ..} => {},
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}
234 fn infer_std_crash_5() {
238 fn extra_compiler_flags() {
239 for content in doesnt_matter {
240 let name = if doesnt_matter {
246 let content = if ICE_REPORT_COMPILER_FLAGS_STRIP_VALUE.contains(&name) {
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}
283 fn infer_nested_generics_crash() {
284 // another crash found typechecking rustc
287 struct Canonical<V> {
290 struct QueryResponse<V> {
293 fn test<R>(query_response: Canonical<QueryResponse<R>>) {
294 &query_response.value;
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>
308 fn infer_paren_macro_call() {
311 macro_rules! bar { () => {0u32} }
318 44..69 '{ ...()); }': ()
325 fn infer_array_macro_call() {
328 macro_rules! bar { () => {0u32} }
335 44..69 '{ ...()]; }': ()
337 58..66 '[bar!()]': [u32; 1]
346 struct HashSet<T, H>;
348 type FxHashSet<T> = HashSet<T, FxHasher>;
350 impl<T, H> HashSet<T, H> {
351 fn default() -> HashSet<T, H> {}
355 FxHashSet::default();
360 168..197 '{ ...t(); }': ()
361 174..192 'FxHash...efault': fn default<{unknown}, FxHasher>() -> HashSet<{unknown}, FxHasher>
362 174..194 'FxHash...ault()': HashSet<{unknown}, FxHasher>
373 struct Response<T> {}
379 impl<T:A> D for Response<T> {
389 119..214 '{ ... }': ()
390 129..132 'end': fn end<{unknown}>()
392 163..208 '{ ... }': ()
394 190..197 'loop {}': !
410 25..52 '{ ...oo() }': ()
411 31..48 '<Trait...>::foo': {unknown}
412 31..50 '<Trait...:foo()': ()
418 fn issue_2683_chars_impl() {
421 //- /main.rs crate:main deps:std
423 let chars: std::str::Chars<'_>;
424 (chars.next(), chars.nth(1));
425 } //^ (Option<char>, Option<char>)
427 //- /std.rs crate:std
432 pub use crate::iter::Iterator;
433 pub use crate::option::Option;
437 pub use self::traits::Iterator;
439 pub use self::iterator::Iterator;
444 fn next(&mut self) -> Option<Self::Item>;
445 fn nth(&mut self, n: usize) -> Option<Self::Item> {}
452 pub enum Option<T> {}
456 pub struct Chars<'a> {}
457 impl<'a> Iterator for Chars<'a> {
459 fn next(&mut self) -> Option<char> {}
467 fn issue_3642_bad_macro_stackover() {
471 macro_rules! match_ast {
472 (match $node:ident { $($tt:tt)* }) => { match_ast!(match ($node) { $($tt)* }) };
474 (match ($node:expr) {
475 $( ast::$ast:ident($it:ident) => $res:expr, )*
476 _ => $catch_all:expr $(,)?
478 $( if let Some($it) = ast::$ast::cast($node.clone()) { $res } else )*
484 let anchor = match_ast! {
496 fn issue_3999_slice() {
499 fn foo(params: &[usize]) {
506 7..13 'params': &[usize]
507 25..80 '{ ... } }': ()
508 31..78 'match ... }': ()
509 37..43 'params': &[usize]
510 54..66 '[ps @ .., _]': [usize]
511 55..62 'ps @ ..': &[usize]
520 fn issue_3999_struct() {
521 // rust-analyzer should not panic on seeing this malformed
536 43..95 '{ ... } }': ()
537 49..93 'match ... }': ()
539 67..80 'Bar { a: .. }': Bar
547 fn issue_4235_name_conflicts() {
551 static FOO:FOO = FOO {};
566 85..119 '{ ...o(); }': ()
571 109..116 'a.foo()': ()
577 fn issue_4465_dollar_crate_at_type() {
581 pub fn anything<T>() -> T {
586 let r: $crate::Foo = anything();
595 44..59 '{ loop {} }': T
598 !0..31 '{letr:...g();r}': Foo
600 !18..26 'anything': fn anything<Foo>() -> Foo
601 !18..28 'anything()': Foo
603 163..187 '{ ...!(); }': ()
613 macro_rules! profile_function {
628 103..131 '{ ...!(); }': ()
634 fn issue_4053_diesel_where_clauses() {
639 fn internal_into_boxed(self) -> Self::Output;
642 struct SelectStatement<From, Select, Distinct, Where, Order, LimitOffset, GroupBy, Locking> {
646 trait QueryFragment<DB: Backend> {}
648 trait Into<T> { fn into(self) -> T; }
650 impl<F, S, D, W, O, LOf, DB> BoxedDsl<DB>
651 for SelectStatement<F, S, D, W, O, LOf, G>
653 O: Into<dyn QueryFragment<DB>>,
657 fn internal_into_boxed(self) -> Self::Output {
664 267..271 'self': Self
665 466..470 'self': SelectStatement<F, S, D, W, O, LOf, {unknown}, {unknown}>
666 488..522 '{ ... }': ()
667 498..502 'self': SelectStatement<F, S, D, W, O, LOf, {unknown}, {unknown}>
668 498..508 'self.order': O
669 498..515 'self.o...into()': dyn QueryFragment<DB>
678 pub struct Foo(pub i64);
680 fn test() -> Self { Self(0i64) }
684 58..72 '{ Self(0i64) }': Foo
685 60..64 'Self': Foo(i64) -> Foo
686 60..70 'Self(0i64)': Foo
692 pub struct Foo<T>(pub T);
694 fn test() -> Self { Self(0i64) }
698 64..78 '{ Self(0i64) }': Foo<i64>
699 66..70 'Self': Foo<i64>(i64) -> Foo<i64>
700 66..76 'Self(0i64)': Foo<i64>
714 trait CheckedDiv: Div<()> {}
716 trait PrimInt: CheckedDiv<Output = ()> {
720 fn check<T: PrimInt>(i: T) {
725 117..121 'self': Self
727 154..170 '{ ...w(); }': ()
729 160..167 'i.pow()': ()
738 #[lang = "coerce_unsized"]
739 pub trait CoerceUnsized<T> {}
747 fn foo<R, K>(key: &K) -> impl Future<Output = K::Bar>
753 fn bar<R, K>(key: &K) -> impl Future<Output = K::Bar>
761 198..214 '{ ...key) }': {unknown}
762 204..207 'bar': fn bar<R, K>(&K) -> impl Future<Output = <K as Foo<R>>::Bar>
763 204..212 'bar(key)': impl Future<Output = <K as Foo<R>>::Bar>
779 type E1<T> = (T, T, T);
780 type E2<T> = E1<E1<E1<(T, T, T)>>>;
782 impl Debug for Foo<E2<()>> {}
790 pub struct PeerSet<D>;
792 impl<D> Service<Request> for PeerSet<D>
798 type Future = dyn Future<Output = Self::Error>;
800 fn call(&mut self) -> Self::Future {
809 pub trait Service<Request> {
811 type Future: Future<Output = Self::Error>;
812 fn call(&mut self) -> Self::Future;
816 379..383 'self': &mut PeerSet<D>
817 401..424 '{ ... }': dyn Future<Output = ()>
818 411..418 'loop {}': !
820 575..579 'self': &mut Self
829 pub trait IntoIterator {
833 struct Repeat<A> { element: A }
835 struct Map<F> { f: F }
844 impl<T> Deref for Vec<T> {
848 fn from_iter<A, T: IntoIterator<Item = A>>(iter: T) -> Vec<A> {}
851 let inner = Map { f: |_: &f64| 0.0 };
853 let repeat = Repeat { element: inner };
855 let vec = from_iter(repeat);
863 303..447 '{ ...r(); }': ()
864 313..318 'inner': Map<|&f64| -> f64>
865 321..345 'Map { ... 0.0 }': Map<|&f64| -> f64>
866 330..343 '|_: &f64| 0.0': |&f64| -> f64
869 356..362 'repeat': Repeat<Map<|&f64| -> f64>>
870 365..390 'Repeat...nner }': Repeat<Map<|&f64| -> f64>>
871 383..388 'inner': Map<|&f64| -> f64>
872 401..404 'vec': Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
873 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>>>>
874 407..424 'from_i...epeat)': Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
875 417..423 'repeat': Repeat<Map<|&f64| -> f64>>
876 431..434 'vec': Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
877 431..444 'vec.foo_bar()': {unknown}
887 pub trait FnOnce<Args> {
893 fn f(&self, _t: T) {}
894 fn g<F: FnOnce(&T)>(&self, _f: F) {}
903 105..109 'self': &S<T>
906 146..150 'self': &S<T>
909 174..225 '{ ...10); }': ()
911 188..189 'S': S<i32>() -> S<i32>
912 188..191 'S()': S<i32>
914 197..209 's.g(|_x| {})': ()
915 201..208 '|_x| {}': |&i32| -> ()
919 215..222 's.f(10)': ()
937 struct MutexGuard<'a, T> {}
939 fn lock(&self) -> MutexGuard<'_, T> {}
941 impl<'a, T: 'a> Deref for MutexGuard<'a, T> {
945 let w: &Mutex<BufWriter>;
950 156..160 'self': &Mutex<T>
952 267..271 'self': &{unknown}
953 273..323 '{ ...()); }': ()
954 283..284 'w': &Mutex<BufWriter>
955 309..320 '*(w.lock())': BufWriter
956 311..312 'w': &Mutex<BufWriter>
957 311..319 'w.lock()': MutexGuard<BufWriter>
963 fn param_overrides_fn() {
966 fn example(example: i32) {
976 fn lifetime_from_chalk_during_deref() {
984 struct Box<T: ?Sized> {}
985 impl<T> Deref for Box<T> {
988 fn deref(&self) -> &Self::Target {
997 pub struct Iter<'a, T: 'a> {
998 inner: Box<dyn IterTrait<'a, T, Item = &'a T> + 'a>,
1001 trait IterTrait<'a, T: 'a>: Iterator<Item = &'a T> {
1002 fn clone_box(&self);
1005 fn clone_iter<T>(s: Iter<T>) {
1006 s.inner.clone_box();
1007 //^^^^^^^^^^^^^^^^^^^ ()
1017 pub trait Try: FromResidual {
1021 pub trait FromResidual<R = <Self as Try>::Residual> {
1022 fn from_residual(residual: R) -> Self;
1025 struct ControlFlow<B, C>;
1026 impl<B, C> Try for ControlFlow<B, C> {
1028 type Residual = ControlFlow<B, !>;
1030 impl<B, C> FromResidual for ControlFlow<B, C> {
1031 fn from_residual(r: ControlFlow<B, !>) -> Self { ControlFlow }
1035 ControlFlow::from_residual(ControlFlow::<u32, !>);
1039 144..152 'residual': R
1040 365..366 'r': ControlFlow<B, !>
1041 395..410 '{ ControlFlow }': ControlFlow<B, C>
1042 397..408 'ControlFlow': ControlFlow<B, C>
1043 424..482 '{ ...!>); }': ()
1044 430..456 'Contro...sidual': fn from_residual<ControlFlow<u32, {unknown}>, ControlFlow<u32, !>>(ControlFlow<u32, !>) -> ControlFlow<u32, {unknown}>
1045 430..479 'Contro...2, !>)': ControlFlow<u32, {unknown}>
1046 457..478 'Contro...32, !>': ControlFlow<u32, !>
1053 // https://github.com/rust-analyzer/rust-analyzer/issues/8378
1064 #[cfg(never)] { 11 }
1068 fn no_normal_tail(){
1073 fn no_actual_tail(){
1080 14..53 '{ ...)] 9 }': &str
1081 20..31 '{ "first" }': &str
1082 22..29 '"first"': &str
1083 72..190 '{ ...] 13 }': &str
1084 78..88 '{ "fake" }': &str
1085 80..86 '"fake"': &str
1086 93..103 '{ "fake" }': &str
1087 95..101 '"fake"': &str
1088 108..120 '{ "second" }': &str
1089 110..118 '"second"': &str
1090 210..273 '{ ... 15; }': &str
1091 216..227 '{ "third" }': &str
1092 218..225 '"third"': &str
1093 293..357 '{ ...] 15 }': ()
1094 299..311 '{ "fourth" }': &str
1095 301..309 '"fourth"': &str