diff options
Diffstat (limited to 'crates/ra_hir_ty')
-rw-r--r-- | crates/ra_hir_ty/src/tests.rs | 16 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/tests/coercion.rs | 76 |
2 files changed, 65 insertions, 27 deletions
diff --git a/crates/ra_hir_ty/src/tests.rs b/crates/ra_hir_ty/src/tests.rs index 5eaf25a77..59a21092e 100644 --- a/crates/ra_hir_ty/src/tests.rs +++ b/crates/ra_hir_ty/src/tests.rs | |||
@@ -346,22 +346,8 @@ fn typing_whitespace_inside_a_function_should_not_invalidate_types() { | |||
346 | } | 346 | } |
347 | } | 347 | } |
348 | 348 | ||
349 | // Infer with some common definitions and impls. | ||
350 | fn check_infer(ra_fixture: &str, expect: Expect) { | 349 | fn check_infer(ra_fixture: &str, expect: Expect) { |
351 | let defs = r#" | 350 | let mut actual = infer(ra_fixture); |
352 | #[lang = "sized"] | ||
353 | pub trait Sized {} | ||
354 | #[lang = "unsize"] | ||
355 | pub trait Unsize<T: ?Sized> {} | ||
356 | #[lang = "coerce_unsized"] | ||
357 | pub trait CoerceUnsized<T> {} | ||
358 | |||
359 | impl<'a, 'b: 'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a U> for &'b T {} | ||
360 | impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*mut U> for *mut T {} | ||
361 | "#; | ||
362 | |||
363 | // Append to the end to keep positions unchanged. | ||
364 | let mut actual = infer(&format!("{}{}", ra_fixture, defs)); | ||
365 | actual.push('\n'); | 351 | actual.push('\n'); |
366 | expect.assert_eq(&actual); | 352 | expect.assert_eq(&actual); |
367 | } | 353 | } |
diff --git a/crates/ra_hir_ty/src/tests/coercion.rs b/crates/ra_hir_ty/src/tests/coercion.rs index 823abddc6..17efd75cb 100644 --- a/crates/ra_hir_ty/src/tests/coercion.rs +++ b/crates/ra_hir_ty/src/tests/coercion.rs | |||
@@ -23,7 +23,7 @@ fn infer_block_expr_type_mismatch() { | |||
23 | #[test] | 23 | #[test] |
24 | fn coerce_places() { | 24 | fn coerce_places() { |
25 | check_infer( | 25 | check_infer( |
26 | r" | 26 | r#" |
27 | struct S<T> { a: T } | 27 | struct S<T> { a: T } |
28 | 28 | ||
29 | fn f<T>(_: &[T]) -> T { loop {} } | 29 | fn f<T>(_: &[T]) -> T { loop {} } |
@@ -45,7 +45,17 @@ fn coerce_places() { | |||
45 | let f: [&[_]; 2] = [arr; 2]; | 45 | let f: [&[_]; 2] = [arr; 2]; |
46 | let g: (&[_], &[_]) = (arr, arr); | 46 | let g: (&[_], &[_]) = (arr, arr); |
47 | } | 47 | } |
48 | ", | 48 | |
49 | #[lang = "sized"] | ||
50 | pub trait Sized {} | ||
51 | #[lang = "unsize"] | ||
52 | pub trait Unsize<T: ?Sized> {} | ||
53 | #[lang = "coerce_unsized"] | ||
54 | pub trait CoerceUnsized<T> {} | ||
55 | |||
56 | impl<'a, 'b: 'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a U> for &'b T {} | ||
57 | impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*mut U> for *mut T {} | ||
58 | "#, | ||
49 | expect![[r" | 59 | expect![[r" |
50 | 30..31 '_': &[T] | 60 | 30..31 '_': &[T] |
51 | 44..55 '{ loop {} }': T | 61 | 44..55 '{ loop {} }': T |
@@ -121,7 +131,7 @@ fn infer_let_stmt_coerce() { | |||
121 | #[test] | 131 | #[test] |
122 | fn infer_custom_coerce_unsized() { | 132 | fn infer_custom_coerce_unsized() { |
123 | check_infer( | 133 | check_infer( |
124 | r" | 134 | r#" |
125 | struct A<T: ?Sized>(*const T); | 135 | struct A<T: ?Sized>(*const T); |
126 | struct B<T: ?Sized>(*const T); | 136 | struct B<T: ?Sized>(*const T); |
127 | struct C<T: ?Sized> { inner: *const T } | 137 | struct C<T: ?Sized> { inner: *const T } |
@@ -138,7 +148,18 @@ fn infer_custom_coerce_unsized() { | |||
138 | let e = foo2(b); | 148 | let e = foo2(b); |
139 | let f = foo3(c); | 149 | let f = foo3(c); |
140 | } | 150 | } |
141 | ", | 151 | |
152 | |||
153 | #[lang = "sized"] | ||
154 | pub trait Sized {} | ||
155 | #[lang = "unsize"] | ||
156 | pub trait Unsize<T: ?Sized> {} | ||
157 | #[lang = "coerce_unsized"] | ||
158 | pub trait CoerceUnsized<T> {} | ||
159 | |||
160 | impl<'a, 'b: 'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a U> for &'b T {} | ||
161 | impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*mut U> for *mut T {} | ||
162 | "#, | ||
142 | expect![[r" | 163 | expect![[r" |
143 | 257..258 'x': A<[T]> | 164 | 257..258 'x': A<[T]> |
144 | 278..283 '{ x }': A<[T]> | 165 | 278..283 '{ x }': A<[T]> |
@@ -172,7 +193,7 @@ fn infer_custom_coerce_unsized() { | |||
172 | #[test] | 193 | #[test] |
173 | fn infer_if_coerce() { | 194 | fn infer_if_coerce() { |
174 | check_infer( | 195 | check_infer( |
175 | r" | 196 | r#" |
176 | fn foo<T>(x: &[T]) -> &[T] { loop {} } | 197 | fn foo<T>(x: &[T]) -> &[T] { loop {} } |
177 | fn test() { | 198 | fn test() { |
178 | let x = if true { | 199 | let x = if true { |
@@ -181,7 +202,13 @@ fn infer_if_coerce() { | |||
181 | &[1] | 202 | &[1] |
182 | }; | 203 | }; |
183 | } | 204 | } |
184 | ", | 205 | |
206 | |||
207 | #[lang = "sized"] | ||
208 | pub trait Sized {} | ||
209 | #[lang = "unsize"] | ||
210 | pub trait Unsize<T: ?Sized> {} | ||
211 | "#, | ||
185 | expect![[r" | 212 | expect![[r" |
186 | 10..11 'x': &[T] | 213 | 10..11 'x': &[T] |
187 | 27..38 '{ loop {} }': &[T] | 214 | 27..38 '{ loop {} }': &[T] |
@@ -208,7 +235,7 @@ fn infer_if_coerce() { | |||
208 | #[test] | 235 | #[test] |
209 | fn infer_if_else_coerce() { | 236 | fn infer_if_else_coerce() { |
210 | check_infer( | 237 | check_infer( |
211 | r" | 238 | r#" |
212 | fn foo<T>(x: &[T]) -> &[T] { loop {} } | 239 | fn foo<T>(x: &[T]) -> &[T] { loop {} } |
213 | fn test() { | 240 | fn test() { |
214 | let x = if true { | 241 | let x = if true { |
@@ -217,7 +244,17 @@ fn infer_if_else_coerce() { | |||
217 | foo(&[1]) | 244 | foo(&[1]) |
218 | }; | 245 | }; |
219 | } | 246 | } |
220 | ", | 247 | |
248 | #[lang = "sized"] | ||
249 | pub trait Sized {} | ||
250 | #[lang = "unsize"] | ||
251 | pub trait Unsize<T: ?Sized> {} | ||
252 | #[lang = "coerce_unsized"] | ||
253 | pub trait CoerceUnsized<T> {} | ||
254 | |||
255 | impl<'a, 'b: 'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a U> for &'b T {} | ||
256 | impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*mut U> for *mut T {} | ||
257 | "#, | ||
221 | expect![[r" | 258 | expect![[r" |
222 | 10..11 'x': &[T] | 259 | 10..11 'x': &[T] |
223 | 27..38 '{ loop {} }': &[T] | 260 | 27..38 '{ loop {} }': &[T] |
@@ -244,7 +281,7 @@ fn infer_if_else_coerce() { | |||
244 | #[test] | 281 | #[test] |
245 | fn infer_match_first_coerce() { | 282 | fn infer_match_first_coerce() { |
246 | check_infer( | 283 | check_infer( |
247 | r" | 284 | r#" |
248 | fn foo<T>(x: &[T]) -> &[T] { loop {} } | 285 | fn foo<T>(x: &[T]) -> &[T] { loop {} } |
249 | fn test(i: i32) { | 286 | fn test(i: i32) { |
250 | let x = match i { | 287 | let x = match i { |
@@ -253,7 +290,12 @@ fn infer_match_first_coerce() { | |||
253 | _ => &[3], | 290 | _ => &[3], |
254 | }; | 291 | }; |
255 | } | 292 | } |
256 | ", | 293 | |
294 | #[lang = "sized"] | ||
295 | pub trait Sized {} | ||
296 | #[lang = "unsize"] | ||
297 | pub trait Unsize<T: ?Sized> {} | ||
298 | "#, | ||
257 | expect![[r" | 299 | expect![[r" |
258 | 10..11 'x': &[T] | 300 | 10..11 'x': &[T] |
259 | 27..38 '{ loop {} }': &[T] | 301 | 27..38 '{ loop {} }': &[T] |
@@ -287,7 +329,7 @@ fn infer_match_first_coerce() { | |||
287 | #[test] | 329 | #[test] |
288 | fn infer_match_second_coerce() { | 330 | fn infer_match_second_coerce() { |
289 | check_infer( | 331 | check_infer( |
290 | r" | 332 | r#" |
291 | fn foo<T>(x: &[T]) -> &[T] { loop {} } | 333 | fn foo<T>(x: &[T]) -> &[T] { loop {} } |
292 | fn test(i: i32) { | 334 | fn test(i: i32) { |
293 | let x = match i { | 335 | let x = match i { |
@@ -296,7 +338,17 @@ fn infer_match_second_coerce() { | |||
296 | _ => &[3], | 338 | _ => &[3], |
297 | }; | 339 | }; |
298 | } | 340 | } |
299 | ", | 341 | |
342 | #[lang = "sized"] | ||
343 | pub trait Sized {} | ||
344 | #[lang = "unsize"] | ||
345 | pub trait Unsize<T: ?Sized> {} | ||
346 | #[lang = "coerce_unsized"] | ||
347 | pub trait CoerceUnsized<T> {} | ||
348 | |||
349 | impl<'a, 'b: 'a, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<&'a U> for &'b T {} | ||
350 | impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<*mut U> for *mut T {} | ||
351 | "#, | ||
300 | expect![[r" | 352 | expect![[r" |
301 | 10..11 'x': &[T] | 353 | 10..11 'x': &[T] |
302 | 27..38 '{ loop {} }': &[T] | 354 | 27..38 '{ loop {} }': &[T] |