Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/tests/traits.rs')
-rw-r--r--crates/hir-ty/src/tests/traits.rs286
1 files changed, 173 insertions, 113 deletions
diff --git a/crates/hir-ty/src/tests/traits.rs b/crates/hir-ty/src/tests/traits.rs
index dfcd322a39..18fc8afd18 100644
--- a/crates/hir-ty/src/tests/traits.rs
+++ b/crates/hir-ty/src/tests/traits.rs
@@ -238,6 +238,7 @@ fn infer_for_loop() {
//- minicore: iterator
//- /main.rs crate:main deps:alloc
#![no_std]
+extern crate alloc;
use alloc::collections::Vec;
fn test() {
@@ -245,7 +246,7 @@ fn test() {
v.push("foo");
for x in v {
x;
- } //^ &str
+ } //^ &'static str
}
//- /alloc.rs crate:alloc
@@ -575,7 +576,7 @@ fn indexing_arrays() {
"fn main() { &mut [9][2]; }",
expect![[r#"
10..26 '{ &mut...[2]; }': ()
- 12..23 '&mut [9][2]': &mut {unknown}
+ 12..23 '&mut [9][2]': &'? mut {unknown}
17..20 '[9]': [i32; 1]
17..23 '[9][2]': {unknown}
18..19 '9': i32
@@ -873,7 +874,7 @@ impl<U, T: Trait<U>> O<T> {
fn test(o: O<S>) {
o.foo();
-} //^^^^^^^ &str
+} //^^^^^^^ &'? str
"#,
);
}
@@ -1016,15 +1017,15 @@ fn test(x: impl Trait<u64>, y: &impl Trait<u32>) {
z.foo2();
}"#,
expect![[r#"
- 29..33 'self': &Self
- 54..58 'self': &Self
+ 29..33 'self': &'? Self
+ 54..58 'self': &'? Self
77..78 'x': impl Trait<u16>
97..99 '{}': ()
154..155 'x': impl Trait<u64>
- 174..175 'y': &impl Trait<u32>
+ 174..175 'y': &'? impl Trait<u32>
195..323 '{ ...2(); }': ()
201..202 'x': impl Trait<u64>
- 208..209 'y': &impl Trait<u32>
+ 208..209 'y': &'? impl Trait<u32>
219..220 'z': S<u16>
223..224 'S': extern "rust-call" S<u16>(u16) -> S<u16>
223..227 'S(1)': S<u16>
@@ -1034,13 +1035,13 @@ fn test(x: impl Trait<u64>, y: &impl Trait<u32>) {
237..238 'z': S<u16>
245..246 'x': impl Trait<u64>
245..252 'x.foo()': u64
- 258..259 'y': &impl Trait<u32>
+ 258..259 'y': &'? impl Trait<u32>
258..265 'y.foo()': u32
271..272 'z': S<u16>
271..278 'z.foo()': u16
284..285 'x': impl Trait<u64>
284..292 'x.foo2()': i64
- 298..299 'y': &impl Trait<u32>
+ 298..299 'y': &'? impl Trait<u32>
298..306 'y.foo2()': i64
312..313 'z': S<u16>
312..320 'z.foo2()': i64
@@ -1204,26 +1205,26 @@ fn test(x: impl Trait<u64>, y: &impl Trait<u64>) {
z.foo2();
}"#,
expect![[r#"
- 29..33 'self': &Self
- 54..58 'self': &Self
+ 29..33 'self': &'? Self
+ 54..58 'self': &'? Self
98..100 '{}': ()
110..111 'x': impl Trait<u64>
- 130..131 'y': &impl Trait<u64>
+ 130..131 'y': &'? impl Trait<u64>
151..268 '{ ...2(); }': ()
157..158 'x': impl Trait<u64>
- 164..165 'y': &impl Trait<u64>
+ 164..165 'y': &'? impl Trait<u64>
175..176 'z': impl Trait<u64>
179..182 'bar': fn bar() -> impl Trait<u64>
179..184 'bar()': impl Trait<u64>
190..191 'x': impl Trait<u64>
190..197 'x.foo()': u64
- 203..204 'y': &impl Trait<u64>
+ 203..204 'y': &'? impl Trait<u64>
203..210 'y.foo()': u64
216..217 'z': impl Trait<u64>
216..223 'z.foo()': u64
229..230 'x': impl Trait<u64>
229..237 'x.foo2()': i64
- 243..244 'y': &impl Trait<u64>
+ 243..244 'y': &'? impl Trait<u64>
243..251 'y.foo2()': i64
257..258 'z': impl Trait<u64>
257..265 'z.foo2()': i64
@@ -1328,7 +1329,7 @@ fn test() {
a.foo();
}"#,
expect![[r#"
- 29..33 'self': &Self
+ 29..33 'self': &'? Self
71..82 '{ loop {} }': !
73..80 'loop {}': !
78..80 '{}': ()
@@ -1366,8 +1367,8 @@ fn test() {
d.foo();
}"#,
expect![[r#"
- 49..53 'self': &mut Self
- 101..105 'self': &Self
+ 49..53 'self': &'? mut Self
+ 101..105 'self': &'? Self
184..195 '{ loop {} }': ({unknown}, {unknown})
186..193 'loop {}': !
191..193 '{}': ()
@@ -1414,10 +1415,10 @@ fn foo<const C: u8, T>() -> (impl FnOnce(&str, T), impl Trait<u8>) {
}
"#,
expect![[r#"
- 134..165 '{ ...(C)) }': (impl FnOnce(&str, T), Bar<u8>)
- 140..163 '(|inpu...ar(C))': (impl FnOnce(&str, T), Bar<u8>)
- 141..154 '|input, t| {}': impl FnOnce(&str, T)
- 142..147 'input': &str
+ 134..165 '{ ...(C)) }': (impl FnOnce(&'? str, T), Bar<u8>)
+ 140..163 '(|inpu...ar(C))': (impl FnOnce(&'? str, T), Bar<u8>)
+ 141..154 '|input, t| {}': impl FnOnce(&'? str, T)
+ 142..147 'input': &'? str
149..150 't': T
152..154 '{}': ()
156..159 'Bar': extern "rust-call" Bar<u8>(u8) -> Bar<u8>
@@ -1466,26 +1467,26 @@ fn test(x: dyn Trait<u64>, y: &dyn Trait<u64>) {
z.foo2();
}"#,
expect![[r#"
- 29..33 'self': &Self
- 54..58 'self': &Self
+ 29..33 'self': &'? Self
+ 54..58 'self': &'? Self
97..99 '{}': dyn Trait<u64>
109..110 'x': dyn Trait<u64>
- 128..129 'y': &dyn Trait<u64>
+ 128..129 'y': &'? dyn Trait<u64>
148..265 '{ ...2(); }': ()
154..155 'x': dyn Trait<u64>
- 161..162 'y': &dyn Trait<u64>
+ 161..162 'y': &'? dyn Trait<u64>
172..173 'z': dyn Trait<u64>
176..179 'bar': fn bar() -> dyn Trait<u64>
176..181 'bar()': dyn Trait<u64>
187..188 'x': dyn Trait<u64>
187..194 'x.foo()': u64
- 200..201 'y': &dyn Trait<u64>
+ 200..201 'y': &'? dyn Trait<u64>
200..207 'y.foo()': u64
213..214 'z': dyn Trait<u64>
213..220 'z.foo()': u64
226..227 'x': dyn Trait<u64>
226..234 'x.foo2()': i64
- 240..241 'y': &dyn Trait<u64>
+ 240..241 'y': &'? dyn Trait<u64>
240..248 'y.foo2()': i64
254..255 'z': dyn Trait<u64>
254..262 'z.foo2()': i64
@@ -1514,16 +1515,16 @@ fn test(s: S<u32, i32>) {
s.bar().baz();
}"#,
expect![[r#"
- 32..36 'self': &Self
- 102..106 'self': &S<T, U>
- 128..139 '{ loop {} }': &dyn Trait<T, U>
+ 32..36 'self': &'? Self
+ 102..106 'self': &'? S<T, U>
+ 128..139 '{ loop {} }': &'? dyn Trait<T, U>
130..137 'loop {}': !
135..137 '{}': ()
- 175..179 'self': &Self
+ 175..179 'self': &'? Self
251..252 's': S<u32, i32>
267..289 '{ ...z(); }': ()
273..274 's': S<u32, i32>
- 273..280 's.bar()': &dyn Trait<u32, i32>
+ 273..280 's.bar()': &'? dyn Trait<u32, i32>
273..286 's.bar().baz()': (u32, i32)
"#]],
);
@@ -1548,19 +1549,19 @@ fn test(x: Trait, y: &Trait) -> u64 {
z.foo();
}"#,
expect![[r#"
- 26..30 'self': &Self
+ 26..30 'self': &'? Self
60..62 '{}': dyn Trait
72..73 'x': dyn Trait
- 82..83 'y': &dyn Trait
+ 82..83 'y': &'? dyn Trait
100..175 '{ ...o(); }': u64
106..107 'x': dyn Trait
- 113..114 'y': &dyn Trait
+ 113..114 'y': &'? dyn Trait
124..125 'z': dyn Trait
128..131 'bar': fn bar() -> dyn Trait
128..133 'bar()': dyn Trait
139..140 'x': dyn Trait
139..146 'x.foo()': u64
- 152..153 'y': &dyn Trait
+ 152..153 'y': &'? dyn Trait
152..159 'y.foo()': u64
165..166 'z': dyn Trait
165..172 'z.foo()': u64
@@ -1580,14 +1581,14 @@ fn main() {
}
"#,
expect![[r#"
- 31..35 'self': &S
+ 31..35 'self': &'? S
37..39 '{}': ()
- 47..48 '_': &dyn Fn(S)
+ 47..48 '_': &'? dyn Fn(S)
58..60 '{}': ()
71..105 '{ ...()); }': ()
- 77..78 'f': fn f(&dyn Fn(S))
+ 77..78 'f': fn f(&'? dyn Fn(S))
77..102 'f(&|nu...foo())': ()
- 79..101 '&|numb....foo()': &impl Fn(S)
+ 79..101 '&|numb....foo()': &'? impl Fn(S)
80..101 '|numbe....foo()': impl Fn(S)
81..87 'number': S
89..95 'number': S
@@ -1790,7 +1791,7 @@ fn test<T: Trait1, U: Trait2>(x: T, y: U) {
y.foo();
}"#,
expect![[r#"
- 53..57 'self': &Self
+ 53..57 'self': &'? Self
66..68 '{}': u32
185..186 'x': T
191..192 'y': U
@@ -1819,11 +1820,11 @@ fn test(x: &impl Trait1) {
x.foo();
}"#,
expect![[r#"
- 53..57 'self': &Self
+ 53..57 'self': &'? Self
66..68 '{}': u32
- 119..120 'x': &impl Trait1
+ 119..120 'x': &'? impl Trait1
136..152 '{ ...o(); }': ()
- 142..143 'x': &impl Trait1
+ 142..143 'x': &'? impl Trait1
142..149 'x.foo()': u32
"#]],
);
@@ -1934,8 +1935,8 @@ fn test() {
opt.map(f);
}"#,
expect![[r#"
- 28..32 'self': &Self
- 132..136 'self': &Bar<F>
+ 28..32 'self': &'? Self
+ 132..136 'self': &'? Bar<F>
149..160 '{ loop {} }': (A1, R)
151..158 'loop {}': !
156..158 '{}': ()
@@ -1988,7 +1989,7 @@ fn test() {
let r2 = lazy2.foo();
}"#,
expect![[r#"
- 36..40 'self': &Foo
+ 36..40 'self': &'? Foo
51..53 '{}': usize
131..132 'f': F
151..153 '{}': Lazy<T, F>
@@ -2262,14 +2263,14 @@ impl Trait for S2 {
fn f(&self, x: <Self>::Item) { let y = x; }
}"#,
expect![[r#"
- 40..44 'self': &Self
+ 40..44 'self': &'? Self
46..47 'x': Trait::Item<Self>
- 126..130 'self': &S
+ 126..130 'self': &'? S
132..133 'x': u32
147..161 '{ let y = x; }': ()
153..154 'y': u32
157..158 'x': u32
- 228..232 'self': &S2
+ 228..232 'self': &'? S2
234..235 'x': i32
251..265 '{ let y = x; }': ()
257..258 'y': i32
@@ -2643,12 +2644,12 @@ fn main() {
72..74 '_v': F
117..120 '{ }': ()
132..163 '{ ... }); }': ()
- 138..148 'f::<(), _>': fn f<(), impl FnOnce(&())>(impl FnOnce(&()))
+ 138..148 'f::<(), _>': fn f<(), impl FnOnce(&'? ())>(impl FnOnce(&'? ()))
138..160 'f::<()... z; })': ()
- 149..159 '|z| { z; }': impl FnOnce(&())
- 150..151 'z': &()
+ 149..159 '|z| { z; }': impl FnOnce(&'? ())
+ 150..151 'z': &'? ()
153..159 '{ z; }': ()
- 155..156 'z': &()
+ 155..156 'z': &'? ()
"#]],
);
}
@@ -2897,13 +2898,13 @@ fn test(x: &dyn Foo) {
foo(x);
}"#,
expect![[r#"
- 21..22 'x': &dyn Foo
+ 21..22 'x': &'? dyn Foo
34..36 '{}': ()
- 46..47 'x': &dyn Foo
+ 46..47 'x': &'? dyn Foo
59..74 '{ foo(x); }': ()
- 65..68 'foo': fn foo(&dyn Foo)
+ 65..68 'foo': fn foo(&'? dyn Foo)
65..71 'foo(x)': ()
- 69..70 'x': &dyn Foo
+ 69..70 'x': &'? dyn Foo
"#]],
);
}
@@ -2927,7 +2928,7 @@ fn test() {
(IsCopy, NotCopy).test();
}"#,
expect![[r#"
- 78..82 'self': &Self
+ 78..82 'self': &'? Self
134..235 '{ ...t(); }': ()
140..146 'IsCopy': IsCopy
140..153 'IsCopy.test()': bool
@@ -2969,7 +2970,7 @@ fn test() {
28..29 'T': {unknown}
36..38 '{}': T
36..38: expected T, got ()
- 113..117 'self': &Self
+ 113..117 'self': &'? Self
169..249 '{ ...t(); }': ()
175..178 'foo': fn foo()
175..185 'foo.test()': bool
@@ -2997,16 +2998,16 @@ fn test(f1: fn(), f2: fn(usize) -> u8, f3: fn(u8, u8) -> &u8) {
f3.test();
}"#,
expect![[r#"
- 22..26 'self': &Self
+ 22..26 'self': &'? Self
76..78 'f1': fn()
86..88 'f2': fn(usize) -> u8
- 107..109 'f3': fn(u8, u8) -> &u8
+ 107..109 'f3': fn(u8, u8) -> &'? u8
130..178 '{ ...t(); }': ()
136..138 'f1': fn()
136..145 'f1.test()': bool
151..153 'f2': fn(usize) -> u8
151..160 'f2.test()': bool
- 166..168 'f3': fn(u8, u8) -> &u8
+ 166..168 'f3': fn(u8, u8) -> &'? u8
166..175 'f3.test()': bool
"#]],
);
@@ -3027,13 +3028,13 @@ fn test() {
(1u8, *"foo").test(); // not Sized
}"#,
expect![[r#"
- 22..26 'self': &Self
+ 22..26 'self': &'? Self
79..194 '{ ...ized }': ()
85..88 '1u8': u8
85..95 '1u8.test()': bool
101..116 '(*"foo").test()': {unknown}
102..108 '*"foo"': str
- 103..108 '"foo"': &str
+ 103..108 '"foo"': &'static str
135..145 '(1u8, 1u8)': (u8, u8)
135..152 '(1u8, ...test()': bool
136..139 '1u8': u8
@@ -3042,7 +3043,7 @@ fn test() {
158..178 '(1u8, ...test()': {unknown}
159..162 '1u8': u8
164..170 '*"foo"': str
- 165..170 '"foo"': &str
+ 165..170 '"foo"': &'static str
"#]],
);
}
@@ -3093,7 +3094,7 @@ fn foo() {
93..94 'x': Option<i32>
109..111 '{}': ()
117..124 '(&f)(s)': ()
- 118..120 '&f': &impl Fn(Option<i32>)
+ 118..120 '&f': &'? impl Fn(Option<i32>)
119..120 'f': impl Fn(Option<i32>)
122..123 's': Option<i32>
"#]],
@@ -3170,25 +3171,25 @@ fn foo() {
f(&s);
}"#,
expect![[r#"
- 154..158 'self': &Box<T>
- 166..205 '{ ... }': &T
- 176..199 'unsafe...nner }': &T
- 185..197 '&*self.inner': &T
+ 154..158 'self': &'? Box<T>
+ 166..205 '{ ... }': &'? T
+ 176..199 'unsafe...nner }': &'? T
+ 185..197 '&*self.inner': &'? T
186..197 '*self.inner': T
- 187..191 'self': &Box<T>
+ 187..191 'self': &'? Box<T>
187..197 'self.inner': *mut T
218..324 '{ ...&s); }': ()
228..229 's': Option<i32>
232..236 'None': Option<i32>
- 246..247 'f': Box<dyn FnOnce(&Option<i32>)>
- 281..310 'Box { ... {}) }': Box<dyn FnOnce(&Option<i32>)>
- 294..308 '&mut (|ps| {})': &mut impl FnOnce(&Option<i32>)
- 300..307 '|ps| {}': impl FnOnce(&Option<i32>)
- 301..303 'ps': &Option<i32>
+ 246..247 'f': Box<dyn FnOnce(&'? Option<i32>)>
+ 281..310 'Box { ... {}) }': Box<dyn FnOnce(&'? Option<i32>)>
+ 294..308 '&mut (|ps| {})': &'? mut impl FnOnce(&'? Option<i32>)
+ 300..307 '|ps| {}': impl FnOnce(&'? Option<i32>)
+ 301..303 'ps': &'? Option<i32>
305..307 '{}': ()
- 316..317 'f': Box<dyn FnOnce(&Option<i32>)>
+ 316..317 'f': Box<dyn FnOnce(&'? Option<i32>)>
316..321 'f(&s)': ()
- 318..320 '&s': &Option<i32>
+ 318..320 '&s': &'? Option<i32>
319..320 's': Option<i32>
"#]],
);
@@ -3320,7 +3321,7 @@ fn f() {
}
}"#,
expect![[r#"
- 46..50 'self': &Self
+ 46..50 'self': &'? Self
58..63 '{ 0 }': u8
60..61 '0': u8
115..185 '{ ... } }': ()
@@ -3595,7 +3596,7 @@ fn take_u32(_: u32) {}
fn minimized() {
let v = V::default();
let p = v.get(&0);
- //^ &u32
+ //^ &'? u32
take_u32(42 + p);
}
"#,
@@ -3625,7 +3626,7 @@ fn take_u32(_: u32) {}
fn minimized() {
let v = V::default();
let p = v.get();
- //^ &{unknown}
+ //^ &'? {unknown}
take_u32(42 + p);
}
"#,
@@ -3684,11 +3685,11 @@ fn main() {
}
"#,
expect![[r#"
- 44..48 'self': &Self
- 133..137 'self': &[u8; 4]
+ 44..48 'self': &'? Self
+ 133..137 'self': &'? [u8; 4]
155..172 '{ ... }': usize
165..166 '2': usize
- 236..240 'self': &[u8; 2]
+ 236..240 'self': &'? [u8; 2]
258..275 '{ ... }': u8
268..269 '2': u8
289..392 '{ ...g(); }': ()
@@ -3732,11 +3733,11 @@ fn main() {
}
"#,
expect![[r#"
- 44..48 'self': &Self
- 151..155 'self': &[u8; L]
+ 44..48 'self': &'? Self
+ 151..155 'self': &'? [u8; L]
173..194 '{ ... }': [u8; L]
183..188 '*self': [u8; L]
- 184..188 'self': &[u8; L]
+ 184..188 'self': &'? [u8; L]
208..260 '{ ...g(); }': ()
218..219 'v': [u8; 2]
222..230 '[0u8; 2]': [u8; 2]
@@ -4056,13 +4057,13 @@ fn g(t: &(dyn Sync + T2 + T1 + Send)) {
}
"#,
expect![[r#"
- 68..69 't': &{unknown}
+ 68..69 't': &'? {unknown}
101..103 '{}': ()
- 109..110 't': &{unknown}
+ 109..110 't': &'? {unknown}
142..155 '{ f(t); }': ()
- 148..149 'f': fn f(&{unknown})
+ 148..149 'f': fn f(&'? {unknown})
148..152 'f(t)': ()
- 150..151 't': &{unknown}
+ 150..151 't': &'? {unknown}
"#]],
);
@@ -4105,7 +4106,7 @@ trait Trait {
}
fn f(t: &dyn Trait<T = (), T = ()>) {}
- //^&{unknown}
+ //^&'? {unknown}
"#,
);
}
@@ -4175,27 +4176,27 @@ trait Trait {
fn f<T>(v: impl Trait) {
let a = v.get::<i32>().deref();
- //^ &i32
+ //^ &'? i32
let a = v.get::<T>().deref();
- //^ &T
+ //^ &'? T
}
fn g<'a, T: 'a>(v: impl Trait<Assoc<T> = &'a T>) {
let a = v.get::<T>();
- //^ &T
+ //^ &'a T
let a = v.get::<()>();
- //^ Trait::Assoc<(), impl Trait<Assoc<T> = &T>>
+ //^ Trait::Assoc<(), impl Trait<Assoc<T> = &'a T>>
}
fn h<'a>(v: impl Trait<Assoc<i32> = &'a i32> + Trait<Assoc<i64> = &'a i64>) {
let a = v.get::<i32>();
- //^ &i32
+ //^ &'a i32
let a = v.get::<i64>();
- //^ &i64
+ //^ &'a i64
}
fn i<'a>(v: impl Trait<Assoc<i32> = &'a i32, Assoc<i64> = &'a i64>) {
let a = v.get::<i32>();
- //^ &i32
+ //^ &'a i32
let a = v.get::<i64>();
- //^ &i64
+ //^ &'a i64
}
"#,
);
@@ -4221,12 +4222,12 @@ fn f<'a>(v: &dyn Trait<Assoc<i32> = &'a i32>) {
}
"#,
expect![[r#"
- 90..94 'self': &Self
- 127..128 'v': &(dyn Trait<Assoc<i32> = &i32>)
+ 90..94 'self': &'? Self
+ 127..128 'v': &'? (dyn Trait<Assoc<i32> = &'a i32>)
164..195 '{ ...f(); }': ()
- 170..171 'v': &(dyn Trait<Assoc<i32> = &i32>)
- 170..184 'v.get::<i32>()': &i32
- 170..192 'v.get:...eref()': &i32
+ 170..171 'v': &'? (dyn Trait<Assoc<i32> = &'a i32>)
+ 170..184 'v.get::<i32>()': &'? i32
+ 170..192 'v.get:...eref()': &'? i32
"#]],
);
}
@@ -4487,19 +4488,19 @@ fn derive_macro_bounds() {
let x = (&Copy).clone();
//^ Copy
let x = (&NotCopy).clone();
- //^ &NotCopy
+ //^ &'? NotCopy
let x = (&Generic(Copy)).clone();
//^ Generic<Copy>
let x = (&Generic(NotCopy)).clone();
- //^ &Generic<NotCopy>
+ //^ &'? Generic<NotCopy>
let x: &AssocGeneric<Copy> = &AssocGeneric(NotCopy);
let x = x.clone();
- //^ &AssocGeneric<Copy>
+ //^ &'? AssocGeneric<Copy>
// let x: &AssocGeneric2<Copy> = &AssocGeneric2(NotCopy);
// let x = x.clone();
let x: &AssocGeneric3<Copy> = &AssocGeneric3(Generic(NotCopy));
let x = x.clone();
- //^ &AssocGeneric3<Copy>
+ //^ &'? AssocGeneric3<Copy>
let x = (&R1(Vec())).clone();
//^ R1
let x = (&R2(R1(Vec()))).clone();
@@ -4582,7 +4583,7 @@ impl B for u16 {
fn ttt() {
let inp = Y;
x::<u16>(&inp);
- //^^^^ expected &X, got &Y
+ //^^^^ expected &'? X, got &'? Y
}
"#,
);
@@ -4629,7 +4630,7 @@ fn foo() {
let mut map = SomeMap;
map["a"] = ();
map;
- //^^^ SomeMap<&str>
+ //^^^ SomeMap<&'static str>
}
"#,
);
@@ -4764,3 +4765,62 @@ fn test() {
"#,
);
}
+
+#[test]
+fn associated_type_with_impl_trait_in_tuple() {
+ check_no_mismatches(
+ r#"
+pub trait Iterator {
+ type Item;
+}
+
+pub trait Value {}
+
+fn bar<I: Iterator<Item = (usize, impl Value)>>() {}
+
+fn foo() {
+ bar();
+}
+"#,
+ );
+}
+
+#[test]
+fn associated_type_with_impl_trait_in_nested_tuple() {
+ check_no_mismatches(
+ r#"
+pub trait Iterator {
+ type Item;
+}
+
+pub trait Value {}
+
+fn bar<I: Iterator<Item = ((impl Value, usize), u32)>>() {}
+
+fn foo() {
+ bar();
+}
+"#,
+ );
+}
+
+#[test]
+fn dyn_trait_with_lifetime_in_rpit() {
+ check_types(
+ r#"
+//- minicore: future
+pub struct Box<T> {}
+
+trait Trait {}
+
+pub async fn foo_async<'a>() -> Box<dyn Trait + 'a> {
+ Box {}
+}
+
+fn foo() {
+ foo_async();
+ //^^^^^^^^^^^impl Future<Output = Box<dyn Trait>> + ?Sized
+}
+"#,
+ )
+}