From 5205c84ec7d6284b258e66a06c3e330c3f9fdd88 Mon Sep 17 00:00:00 2001 From: uHOOCCOOHu Date: Wed, 18 Sep 2019 04:15:31 +0800 Subject: Support auto-deref in argument position --- crates/ra_hir/src/ty/tests.rs | 118 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) (limited to 'crates/ra_hir/src/ty/tests.rs') diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index f4f63ca93..6076e4025 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs @@ -800,6 +800,124 @@ fn test2(a1: *const A, a2: *mut A) { ); } +#[test] +fn infer_argument_autoderef() { + assert_snapshot!( + infer(r#" +#[lang = "deref"] +pub trait Deref { + type Target: ?Sized; + fn deref(&self) -> &Self::Target; +} + +struct A(T); + +impl A { + fn foo(&self) -> T { + self.0 + } +} + +struct B(T); + +impl Deref for B { + type Target = T; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +fn test() { + A::foo(&&B(B(A(42)))); +} +"#), + @r###" + [76; 80) 'self': &Self + [153; 157) 'self': &A + [164; 186) '{ ... }': T + [174; 178) 'self': &A + [174; 180) 'self.0': T + [267; 271) 'self': &B + [290; 313) '{ ... }': &T + [300; 307) '&self.0': &T + [301; 305) 'self': &B + [301; 307) 'self.0': T + [327; 357) '{ ...))); }': () + [333; 339) 'A::foo': fn foo(&A) -> T + [333; 354) 'A::foo...42))))': i32 + [340; 353) '&&B(B(A(42)))': &&B>> + [341; 353) '&B(B(A(42)))': &B>> + [342; 343) 'B': B>>(T) -> B + [342; 353) 'B(B(A(42)))': B>> + [344; 345) 'B': B>(T) -> B + [344; 352) 'B(A(42))': B> + [346; 347) 'A': A(T) -> A + [346; 351) 'A(42)': A + [348; 350) '42': i32 +"### + ); +} + +#[test] +fn infer_method_argument_autoderef() { + assert_snapshot!( + infer(r#" +#[lang = "deref"] +pub trait Deref { + type Target: ?Sized; + fn deref(&self) -> &Self::Target; +} + +struct A(*mut T); + +impl A { + fn foo(&self, x: &A) -> T { + x + } +} + +struct B(T); + +impl Deref for B { + type Target = T; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +fn test(a: A) { + A(0 as *mut _).foo(&&B(B(a))); +} +"#), + @r###" + [76; 80) 'self': &Self + [158; 162) 'self': &A + [164; 165) 'x': &A + [179; 196) '{ ... }': &A + [189; 190) 'x': &A + [277; 281) 'self': &B + [300; 323) '{ ... }': &T + [310; 317) '&self.0': &T + [311; 315) 'self': &B + [311; 317) 'self.0': T + [335; 336) 'a': A + [346; 384) '{ ...))); }': () + [352; 353) 'A': A(*mut T) -> A + [352; 366) 'A(0 as *mut _)': A + [352; 381) 'A(0 as...B(a)))': i32 + [354; 355) '0': i32 + [354; 365) '0 as *mut _': *mut i32 + [371; 380) '&&B(B(a))': &&B>> + [372; 380) '&B(B(a))': &B>> + [373; 374) 'B': B>>(T) -> B + [373; 380) 'B(B(a))': B>> + [375; 376) 'B': B>(T) -> B + [375; 379) 'B(a)': B> + [377; 378) 'a': A +"### + ); +} + #[test] fn bug_484() { assert_snapshot!( -- cgit v1.2.3 From 4bb66df6de6a832f53f09128ea038fc1c0068515 Mon Sep 17 00:00:00 2001 From: uHOOCCOOHu Date: Fri, 13 Sep 2019 02:59:21 +0800 Subject: Support basic implicit type coerce --- crates/ra_hir/src/ty/tests.rs | 271 +++++++++++++++++++++++++++++++++--------- 1 file changed, 215 insertions(+), 56 deletions(-) (limited to 'crates/ra_hir/src/ty/tests.rs') diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index 6076e4025..2ce0039b1 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs @@ -806,14 +806,14 @@ fn infer_argument_autoderef() { infer(r#" #[lang = "deref"] pub trait Deref { - type Target: ?Sized; + type Target; fn deref(&self) -> &Self::Target; } struct A(T); -impl A { - fn foo(&self) -> T { +impl A { + fn foo(&self) -> &T { self.0 } } @@ -828,32 +828,33 @@ impl Deref for B { } fn test() { - A::foo(&&B(B(A(42)))); + let t = A::foo(&&B(B(A(42)))); } "#), @r###" - [76; 80) 'self': &Self - [153; 157) 'self': &A - [164; 186) '{ ... }': T - [174; 178) 'self': &A - [174; 180) 'self.0': T - [267; 271) 'self': &B - [290; 313) '{ ... }': &T - [300; 307) '&self.0': &T - [301; 305) 'self': &B - [301; 307) 'self.0': T - [327; 357) '{ ...))); }': () - [333; 339) 'A::foo': fn foo(&A) -> T - [333; 354) 'A::foo...42))))': i32 - [340; 353) '&&B(B(A(42)))': &&B>> - [341; 353) '&B(B(A(42)))': &B>> - [342; 343) 'B': B>>(T) -> B - [342; 353) 'B(B(A(42)))': B>> - [344; 345) 'B': B>(T) -> B - [344; 352) 'B(A(42))': B> - [346; 347) 'A': A(T) -> A - [346; 351) 'A(42)': A - [348; 350) '42': i32 + [68; 72) 'self': &Self + [139; 143) 'self': &A + [151; 173) '{ ... }': T + [161; 165) 'self': &A + [161; 167) 'self.0': T + [254; 258) 'self': &B + [277; 300) '{ ... }': &T + [287; 294) '&self.0': &T + [288; 292) 'self': &B + [288; 294) 'self.0': T + [314; 352) '{ ...))); }': () + [324; 325) 't': &i32 + [328; 334) 'A::foo': fn foo(&A) -> &T + [328; 349) 'A::foo...42))))': &i32 + [335; 348) '&&B(B(A(42)))': &&B>> + [336; 348) '&B(B(A(42)))': &B>> + [337; 338) 'B': B>>(T) -> B + [337; 348) 'B(B(A(42)))': B>> + [339; 340) 'B': B>(T) -> B + [339; 347) 'B(A(42))': B> + [341; 342) 'A': A(T) -> A + [341; 346) 'A(42)': A + [343; 345) '42': i32 "### ); } @@ -864,15 +865,15 @@ fn infer_method_argument_autoderef() { infer(r#" #[lang = "deref"] pub trait Deref { - type Target: ?Sized; + type Target; fn deref(&self) -> &Self::Target; } struct A(*mut T); -impl A { - fn foo(&self, x: &A) -> T { - x +impl A { + fn foo(&self, x: &A) -> &T { + &*x.0 } } @@ -886,38 +887,196 @@ impl Deref for B { } fn test(a: A) { - A(0 as *mut _).foo(&&B(B(a))); + let t = A(0 as *mut _).foo(&&B(B(a))); +} +"#), + @r###" + [68; 72) 'self': &Self + [144; 148) 'self': &A + [150; 151) 'x': &A + [166; 187) '{ ... }': &T + [176; 181) '&*x.0': &T + [177; 181) '*x.0': T + [178; 179) 'x': &A + [178; 181) 'x.0': *mut T + [268; 272) 'self': &B + [291; 314) '{ ... }': &T + [301; 308) '&self.0': &T + [302; 306) 'self': &B + [302; 308) 'self.0': T + [326; 327) 'a': A + [337; 383) '{ ...))); }': () + [347; 348) 't': &i32 + [351; 352) 'A': A(*mut T) -> A + [351; 365) 'A(0 as *mut _)': A + [351; 380) 'A(0 as...B(a)))': &i32 + [353; 354) '0': i32 + [353; 364) '0 as *mut _': *mut i32 + [370; 379) '&&B(B(a))': &&B>> + [371; 379) '&B(B(a))': &B>> + [372; 373) 'B': B>>(T) -> B + [372; 379) 'B(B(a))': B>> + [374; 375) 'B': B>(T) -> B + [374; 378) 'B(a)': B> + [376; 377) 'a': A +"### + ); +} + +#[test] +fn infer_if_coerce() { + assert_snapshot!( + infer(r#" +fn foo(x: &[T]) -> &[T] { loop {} } +fn test() { + let x = if true { + foo(&[1]) + } else { + &[1] + }; } "#), @r###" - [76; 80) 'self': &Self - [158; 162) 'self': &A - [164; 165) 'x': &A - [179; 196) '{ ... }': &A - [189; 190) 'x': &A - [277; 281) 'self': &B - [300; 323) '{ ... }': &T - [310; 317) '&self.0': &T - [311; 315) 'self': &B - [311; 317) 'self.0': T - [335; 336) 'a': A - [346; 384) '{ ...))); }': () - [352; 353) 'A': A(*mut T) -> A - [352; 366) 'A(0 as *mut _)': A - [352; 381) 'A(0 as...B(a)))': i32 - [354; 355) '0': i32 - [354; 365) '0 as *mut _': *mut i32 - [371; 380) '&&B(B(a))': &&B>> - [372; 380) '&B(B(a))': &B>> - [373; 374) 'B': B>>(T) -> B - [373; 380) 'B(B(a))': B>> - [375; 376) 'B': B>(T) -> B - [375; 379) 'B(a)': B> - [377; 378) 'a': A + [11; 12) 'x': &[T] + [28; 39) '{ loop {} }': ! + [30; 37) 'loop {}': ! + [35; 37) '{}': () + [50; 126) '{ ... }; }': () + [60; 61) 'x': &[i32] + [64; 123) 'if tru... }': &[i32] + [67; 71) 'true': bool + [72; 97) '{ ... }': &[i32] + [82; 85) 'foo': fn foo(&[T]) -> &[T] + [82; 91) 'foo(&[1])': &[i32] + [86; 90) '&[1]': &[i32;_] + [87; 90) '[1]': [i32;_] + [88; 89) '1': i32 + [103; 123) '{ ... }': &[i32;_] + [113; 117) '&[1]': &[i32;_] + [114; 117) '[1]': [i32;_] + [115; 116) '1': i32 "### ); } +#[test] +fn infer_if_else_coerce() { + assert_snapshot!( + infer(r#" +fn foo(x: &[T]) -> &[T] { loop {} } +fn test() { + let x = if true { + &[1] + } else { + foo(&[1]) + }; +} +"#), + @r###" + [11; 12) 'x': &[T] + [28; 39) '{ loop {} }': ! + [30; 37) 'loop {}': ! + [35; 37) '{}': () + [50; 126) '{ ... }; }': () + [60; 61) 'x': &[i32] + [64; 123) 'if tru... }': &[i32] + [67; 71) 'true': bool + [72; 92) '{ ... }': &[i32;_] + [82; 86) '&[1]': &[i32;_] + [83; 86) '[1]': [i32;_] + [84; 85) '1': i32 + [98; 123) '{ ... }': &[i32] + [108; 111) 'foo': fn foo(&[T]) -> &[T] + [108; 117) 'foo(&[1])': &[i32] + [112; 116) '&[1]': &[i32;_] + [113; 116) '[1]': [i32;_] + [114; 115) '1': i32 +"### + ); +} + +#[test] +fn infer_match_first_coerce() { + assert_snapshot!( + infer(r#" +fn foo(x: &[T]) -> &[T] { loop {} } +fn test(i: i32) { + let x = match i { + 2 => foo(&[2]), + 1 => &[1], + _ => &[3], + }; +} +"#), + @r###" + [11; 12) 'x': &[T] + [28; 39) '{ loop {} }': ! + [30; 37) 'loop {}': ! + [35; 37) '{}': () + [48; 49) 'i': i32 + [56; 150) '{ ... }; }': () + [66; 67) 'x': &[i32] + [70; 147) 'match ... }': &[i32] + [76; 77) 'i': i32 + [88; 89) '2': i32 + [93; 96) 'foo': fn foo(&[T]) -> &[T] + [93; 102) 'foo(&[2])': &[i32] + [97; 101) '&[2]': &[i32;_] + [98; 101) '[2]': [i32;_] + [99; 100) '2': i32 + [112; 113) '1': i32 + [117; 121) '&[1]': &[i32;_] + [118; 121) '[1]': [i32;_] + [119; 120) '1': i32 + [131; 132) '_': i32 + [136; 140) '&[3]': &[i32;_] + [137; 140) '[3]': [i32;_] + [138; 139) '3': i32 + "### + ); +} + +#[test] +fn infer_match_second_coerce() { + assert_snapshot!( + infer(r#" +fn foo(x: &[T]) -> &[T] { loop {} } +fn test(i: i32) { + let x = match i { + 1 => &[1], + 2 => foo(&[2]), + _ => &[3], + }; +} +"#), + @r###" + [11; 12) 'x': &[T] + [28; 39) '{ loop {} }': ! + [30; 37) 'loop {}': ! + [35; 37) '{}': () + [48; 49) 'i': i32 + [56; 150) '{ ... }; }': () + [66; 67) 'x': &[i32] + [70; 147) 'match ... }': &[i32] + [76; 77) 'i': i32 + [88; 89) '1': i32 + [93; 97) '&[1]': &[i32;_] + [94; 97) '[1]': [i32;_] + [95; 96) '1': i32 + [107; 108) '2': i32 + [112; 115) 'foo': fn foo(&[T]) -> &[T] + [112; 121) 'foo(&[2])': &[i32] + [116; 120) '&[2]': &[i32;_] + [117; 120) '[2]': [i32;_] + [118; 119) '2': i32 + [131; 132) '_': i32 + [136; 140) '&[3]': &[i32;_] + [137; 140) '[3]': [i32;_] + [138; 139) '3': i32 + "### + ); +} + #[test] fn bug_484() { assert_snapshot!( @@ -3474,7 +3633,7 @@ trait Deref { } struct Arc; -impl Deref for Arc { +impl Deref for Arc { type Target = T; } -- cgit v1.2.3 From bf161fa3e58d57d9b15bd965405036d834f18595 Mon Sep 17 00:00:00 2001 From: uHOOCCOOHu Date: Wed, 18 Sep 2019 03:59:51 +0800 Subject: Better handle never type and branch merging Split out tests for never type to another file --- crates/ra_hir/src/ty/tests.rs | 161 +++++++++++------------------------------- 1 file changed, 40 insertions(+), 121 deletions(-) (limited to 'crates/ra_hir/src/ty/tests.rs') diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index 2ce0039b1..081bfe37c 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs @@ -20,6 +20,8 @@ use crate::{ // against snapshots of the expected results using insta. Use cargo-insta to // update the snapshots. +mod never_type; + #[test] fn infer_await() { let (mut db, pos) = MockDatabase::with_position( @@ -1077,6 +1079,42 @@ fn test(i: i32) { ); } +#[test] +fn coerce_merge_one_by_one1() { + covers!(coerce_merge_fail_fallback); + + assert_snapshot!( + infer(r#" +fn test() { + let t = &mut 1; + let x = match 1 { + 1 => t as *mut i32, + 2 => t as &i32, + _ => t as *const i32, + }; +} +"#), + @r###" + [11; 145) '{ ... }; }': () + [21; 22) 't': &mut i32 + [25; 31) '&mut 1': &mut i32 + [30; 31) '1': i32 + [41; 42) 'x': *const i32 + [45; 142) 'match ... }': *const i32 + [51; 52) '1': i32 + [63; 64) '1': i32 + [68; 69) 't': &mut i32 + [68; 81) 't as *mut i32': *mut i32 + [91; 92) '2': i32 + [96; 97) 't': &mut i32 + [96; 105) 't as &i32': &i32 + [115; 116) '_': i32 + [120; 121) 't': &mut i32 + [120; 135) 't as *const i32': *const i32 + "### + ); +} + #[test] fn bug_484() { assert_snapshot!( @@ -2458,7 +2496,6 @@ fn extra_compiler_flags() { } "#), @r###" - [27; 323) '{ ... } }': () [33; 321) 'for co... }': () [37; 44) 'content': &{unknown} @@ -2472,8 +2509,8 @@ fn extra_compiler_flags() { [135; 167) '{ ... }': &&{unknown} [149; 157) '&content': &&{unknown} [150; 157) 'content': &{unknown} - [182; 189) 'content': &&{unknown} - [192; 314) 'if ICE... }': &&{unknown} + [182; 189) 'content': &{unknown} + [192; 314) 'if ICE... }': &{unknown} [195; 232) 'ICE_RE..._VALUE': {unknown} [195; 248) 'ICE_RE...&name)': bool [242; 247) '&name': &&&{unknown} @@ -4683,121 +4720,3 @@ fn no_such_field_diagnostics() { "### ); } - -mod branching_with_never_tests { - use super::type_at; - - #[test] - fn if_never() { - let t = type_at( - r#" -//- /main.rs -fn test() { - let i = if true { - loop {} - } else { - 3.0 - }; - i<|> - () -} -"#, - ); - assert_eq!(t, "f64"); - } - - #[test] - fn if_else_never() { - let t = type_at( - r#" -//- /main.rs -fn test(input: bool) { - let i = if input { - 2.0 - } else { - return - }; - i<|> - () -} -"#, - ); - assert_eq!(t, "f64"); - } - - #[test] - fn match_first_arm_never() { - let t = type_at( - r#" -//- /main.rs -fn test(a: i32) { - let i = match a { - 1 => return, - 2 => 2.0, - 3 => loop {}, - _ => 3.0, - }; - i<|> - () -} -"#, - ); - assert_eq!(t, "f64"); - } - - #[test] - fn match_second_arm_never() { - let t = type_at( - r#" -//- /main.rs -fn test(a: i32) { - let i = match a { - 1 => 3.0, - 2 => loop {}, - 3 => 3.0, - _ => return, - }; - i<|> - () -} -"#, - ); - assert_eq!(t, "f64"); - } - - #[test] - fn match_all_arms_never() { - let t = type_at( - r#" -//- /main.rs -fn test(a: i32) { - let i = match a { - 2 => return, - _ => loop {}, - }; - i<|> - () -} -"#, - ); - assert_eq!(t, "!"); - } - - #[test] - fn match_no_never_arms() { - let t = type_at( - r#" -//- /main.rs -fn test(a: i32) { - let i = match a { - 2 => 2.0, - _ => 3.0, - }; - i<|> - () -} -"#, - ); - assert_eq!(t, "f64"); - } -} -- cgit v1.2.3 From 5807e261c27e4964fc6a8d2b8cf02e548292b940 Mon Sep 17 00:00:00 2001 From: uHOOCCOOHu Date: Thu, 19 Sep 2019 00:36:12 +0800 Subject: Support custom `CoerceUnsized` Split out tests about coercion --- crates/ra_hir/src/ty/tests.rs | 202 ++---------------------------------------- 1 file changed, 5 insertions(+), 197 deletions(-) (limited to 'crates/ra_hir/src/ty/tests.rs') diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index 081bfe37c..cd5a05092 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs @@ -21,6 +21,7 @@ use crate::{ // update the snapshots. mod never_type; +mod coercion; #[test] fn infer_await() { @@ -925,196 +926,6 @@ fn test(a: A) { ); } -#[test] -fn infer_if_coerce() { - assert_snapshot!( - infer(r#" -fn foo(x: &[T]) -> &[T] { loop {} } -fn test() { - let x = if true { - foo(&[1]) - } else { - &[1] - }; -} -"#), - @r###" - [11; 12) 'x': &[T] - [28; 39) '{ loop {} }': ! - [30; 37) 'loop {}': ! - [35; 37) '{}': () - [50; 126) '{ ... }; }': () - [60; 61) 'x': &[i32] - [64; 123) 'if tru... }': &[i32] - [67; 71) 'true': bool - [72; 97) '{ ... }': &[i32] - [82; 85) 'foo': fn foo(&[T]) -> &[T] - [82; 91) 'foo(&[1])': &[i32] - [86; 90) '&[1]': &[i32;_] - [87; 90) '[1]': [i32;_] - [88; 89) '1': i32 - [103; 123) '{ ... }': &[i32;_] - [113; 117) '&[1]': &[i32;_] - [114; 117) '[1]': [i32;_] - [115; 116) '1': i32 -"### - ); -} - -#[test] -fn infer_if_else_coerce() { - assert_snapshot!( - infer(r#" -fn foo(x: &[T]) -> &[T] { loop {} } -fn test() { - let x = if true { - &[1] - } else { - foo(&[1]) - }; -} -"#), - @r###" - [11; 12) 'x': &[T] - [28; 39) '{ loop {} }': ! - [30; 37) 'loop {}': ! - [35; 37) '{}': () - [50; 126) '{ ... }; }': () - [60; 61) 'x': &[i32] - [64; 123) 'if tru... }': &[i32] - [67; 71) 'true': bool - [72; 92) '{ ... }': &[i32;_] - [82; 86) '&[1]': &[i32;_] - [83; 86) '[1]': [i32;_] - [84; 85) '1': i32 - [98; 123) '{ ... }': &[i32] - [108; 111) 'foo': fn foo(&[T]) -> &[T] - [108; 117) 'foo(&[1])': &[i32] - [112; 116) '&[1]': &[i32;_] - [113; 116) '[1]': [i32;_] - [114; 115) '1': i32 -"### - ); -} - -#[test] -fn infer_match_first_coerce() { - assert_snapshot!( - infer(r#" -fn foo(x: &[T]) -> &[T] { loop {} } -fn test(i: i32) { - let x = match i { - 2 => foo(&[2]), - 1 => &[1], - _ => &[3], - }; -} -"#), - @r###" - [11; 12) 'x': &[T] - [28; 39) '{ loop {} }': ! - [30; 37) 'loop {}': ! - [35; 37) '{}': () - [48; 49) 'i': i32 - [56; 150) '{ ... }; }': () - [66; 67) 'x': &[i32] - [70; 147) 'match ... }': &[i32] - [76; 77) 'i': i32 - [88; 89) '2': i32 - [93; 96) 'foo': fn foo(&[T]) -> &[T] - [93; 102) 'foo(&[2])': &[i32] - [97; 101) '&[2]': &[i32;_] - [98; 101) '[2]': [i32;_] - [99; 100) '2': i32 - [112; 113) '1': i32 - [117; 121) '&[1]': &[i32;_] - [118; 121) '[1]': [i32;_] - [119; 120) '1': i32 - [131; 132) '_': i32 - [136; 140) '&[3]': &[i32;_] - [137; 140) '[3]': [i32;_] - [138; 139) '3': i32 - "### - ); -} - -#[test] -fn infer_match_second_coerce() { - assert_snapshot!( - infer(r#" -fn foo(x: &[T]) -> &[T] { loop {} } -fn test(i: i32) { - let x = match i { - 1 => &[1], - 2 => foo(&[2]), - _ => &[3], - }; -} -"#), - @r###" - [11; 12) 'x': &[T] - [28; 39) '{ loop {} }': ! - [30; 37) 'loop {}': ! - [35; 37) '{}': () - [48; 49) 'i': i32 - [56; 150) '{ ... }; }': () - [66; 67) 'x': &[i32] - [70; 147) 'match ... }': &[i32] - [76; 77) 'i': i32 - [88; 89) '1': i32 - [93; 97) '&[1]': &[i32;_] - [94; 97) '[1]': [i32;_] - [95; 96) '1': i32 - [107; 108) '2': i32 - [112; 115) 'foo': fn foo(&[T]) -> &[T] - [112; 121) 'foo(&[2])': &[i32] - [116; 120) '&[2]': &[i32;_] - [117; 120) '[2]': [i32;_] - [118; 119) '2': i32 - [131; 132) '_': i32 - [136; 140) '&[3]': &[i32;_] - [137; 140) '[3]': [i32;_] - [138; 139) '3': i32 - "### - ); -} - -#[test] -fn coerce_merge_one_by_one1() { - covers!(coerce_merge_fail_fallback); - - assert_snapshot!( - infer(r#" -fn test() { - let t = &mut 1; - let x = match 1 { - 1 => t as *mut i32, - 2 => t as &i32, - _ => t as *const i32, - }; -} -"#), - @r###" - [11; 145) '{ ... }; }': () - [21; 22) 't': &mut i32 - [25; 31) '&mut 1': &mut i32 - [30; 31) '1': i32 - [41; 42) 'x': *const i32 - [45; 142) 'match ... }': *const i32 - [51; 52) '1': i32 - [63; 64) '1': i32 - [68; 69) 't': &mut i32 - [68; 81) 't as *mut i32': *mut i32 - [91; 92) '2': i32 - [96; 97) 't': &mut i32 - [96; 105) 't as &i32': &i32 - [115; 116) '_': i32 - [120; 121) 't': &mut i32 - [120; 135) 't as *const i32': *const i32 - "### - ); -} - #[test] fn bug_484() { assert_snapshot!( @@ -1302,7 +1113,6 @@ fn test(x: &str, y: isize) { } "#), @r###" - [9; 10) 'x': &str [18; 19) 'y': isize [28; 324) '{ ... 3]; }': () @@ -1355,7 +1165,7 @@ fn test(x: &str, y: isize) { [260; 263) '"b"': &str [275; 276) 'x': [u8;_] [288; 290) '[]': [u8;_] - [300; 301) 'z': &[u8;_] + [300; 301) 'z': &[u8] [311; 321) '&[1, 2, 3]': &[u8;_] [312; 321) '[1, 2, 3]': [u8;_] [313; 314) '1': u8 @@ -2288,10 +2098,9 @@ fn test() { } "#), @r###" - [11; 48) '{ ...&y]; }': () [21; 22) 'y': &{unknown} - [25; 32) 'unknown': &{unknown} + [25; 32) 'unknown': &&{unknown} [38; 45) '[y, &y]': [&&{unknown};_] [39; 40) 'y': &{unknown} [42; 44) '&y': &&{unknown} @@ -2313,12 +2122,11 @@ fn test() { } "#), @r###" - [11; 80) '{ ...x)]; }': () [21; 22) 'x': &&{unknown} - [25; 32) 'unknown': &&{unknown} + [25; 32) 'unknown': &&&{unknown} [42; 43) 'y': &&{unknown} - [46; 53) 'unknown': &&{unknown} + [46; 53) 'unknown': &&&{unknown} [59; 77) '[(x, y..., &x)]': [(&&{unknown}, &&{unknown});_] [60; 66) '(x, y)': (&&{unknown}, &&{unknown}) [61; 62) 'x': &&{unknown} -- cgit v1.2.3 From 29e56b8ee480828b81011cfa16c055fa0c9c89fe Mon Sep 17 00:00:00 2001 From: uHOOCCOOHu Date: Thu, 26 Sep 2019 05:56:55 +0800 Subject: Support all coercion places --- crates/ra_hir/src/ty/tests.rs | 127 +++++++++++++++++++++--------------------- 1 file changed, 62 insertions(+), 65 deletions(-) (limited to 'crates/ra_hir/src/ty/tests.rs') diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index cd5a05092..4362bb27a 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs @@ -239,17 +239,23 @@ fn test() { let a = 1isize; let b: usize = 1; let c = b; + let d: u32; + let e; + let f: i32 = e; } "#), @r###" - - [11; 71) '{ ...= b; }': () + [11; 118) '{ ...= e; }': () [21; 22) 'a': isize [25; 31) '1isize': isize [41; 42) 'b': usize [52; 53) '1': usize [63; 64) 'c': usize [67; 68) 'b': usize + [78; 79) 'd': u32 + [94; 95) 'e': i32 + [105; 106) 'f': i32 + [114; 115) 'e': i32 "### ); } @@ -331,14 +337,14 @@ fn test() { "#), @r###" [45; 49) 'self': &[T] - [56; 79) '{ ... }': ! + [56; 79) '{ ... }': T [66; 73) 'loop {}': ! [71; 73) '{}': () [133; 160) '{ ...o"); }': () [139; 149) '<[_]>::foo': fn foo(&[T]) -> T [139; 157) '<[_]>:..."foo")': u8 [150; 156) 'b"foo"': &[u8] -"### + "### ); } @@ -817,7 +823,7 @@ struct A(T); impl A { fn foo(&self) -> &T { - self.0 + &self.0 } } @@ -837,28 +843,29 @@ fn test() { @r###" [68; 72) 'self': &Self [139; 143) 'self': &A - [151; 173) '{ ... }': T - [161; 165) 'self': &A - [161; 167) 'self.0': T - [254; 258) 'self': &B - [277; 300) '{ ... }': &T - [287; 294) '&self.0': &T - [288; 292) 'self': &B - [288; 294) 'self.0': T - [314; 352) '{ ...))); }': () - [324; 325) 't': &i32 - [328; 334) 'A::foo': fn foo(&A) -> &T - [328; 349) 'A::foo...42))))': &i32 - [335; 348) '&&B(B(A(42)))': &&B>> - [336; 348) '&B(B(A(42)))': &B>> - [337; 338) 'B': B>>(T) -> B - [337; 348) 'B(B(A(42)))': B>> - [339; 340) 'B': B>(T) -> B - [339; 347) 'B(A(42))': B> - [341; 342) 'A': A(T) -> A - [341; 346) 'A(42)': A - [343; 345) '42': i32 -"### + [151; 174) '{ ... }': &T + [161; 168) '&self.0': &T + [162; 166) 'self': &A + [162; 168) 'self.0': T + [255; 259) 'self': &B + [278; 301) '{ ... }': &T + [288; 295) '&self.0': &T + [289; 293) 'self': &B + [289; 295) 'self.0': T + [315; 353) '{ ...))); }': () + [325; 326) 't': &i32 + [329; 335) 'A::foo': fn foo(&A) -> &T + [329; 350) 'A::foo...42))))': &i32 + [336; 349) '&&B(B(A(42)))': &&B>> + [337; 349) '&B(B(A(42)))': &B>> + [338; 339) 'B': B>>(T) -> B + [338; 349) 'B(B(A(42)))': B>> + [340; 341) 'B': B>(T) -> B + [340; 348) 'B(A(42))': B> + [342; 343) 'A': A(T) -> A + [342; 347) 'A(42)': A + [344; 346) '42': i32 + "### ); } @@ -1109,13 +1116,12 @@ fn test(x: &str, y: isize) { let b = [a, ["b"]]; let x: [u8; 0] = []; - let z: &[u8] = &[1, 2, 3]; } "#), @r###" [9; 10) 'x': &str [18; 19) 'y': isize - [28; 324) '{ ... 3]; }': () + [28; 293) '{ ... []; }': () [38; 39) 'a': [&str;_] [42; 45) '[x]': [&str;_] [43; 44) 'x': &str @@ -1165,12 +1171,6 @@ fn test(x: &str, y: isize) { [260; 263) '"b"': &str [275; 276) 'x': [u8;_] [288; 290) '[]': [u8;_] - [300; 301) 'z': &[u8] - [311; 321) '&[1, 2, 3]': &[u8;_] - [312; 321) '[1, 2, 3]': [u8;_] - [313; 314) '1': u8 - [316; 317) '2': u8 - [319; 320) '3': u8 "### ); } @@ -1892,8 +1892,7 @@ fn test() { } "#), @r###" - - [80; 104) '{ ... }': ! + [80; 104) '{ ... }': Gen [90; 98) 'loop { }': ! [95; 98) '{ }': () [118; 146) '{ ...e(); }': () @@ -1923,8 +1922,7 @@ fn test() { } "#), @r###" - - [76; 100) '{ ... }': ! + [76; 100) '{ ... }': Gen [86; 94) 'loop { }': ! [91; 94) '{ }': () [114; 149) '{ ...e(); }': () @@ -1955,8 +1953,7 @@ fn test() { } "#), @r###" - - [102; 126) '{ ... }': ! + [102; 126) '{ ... }': Gen [112; 120) 'loop { }': ! [117; 120) '{ }': () [140; 180) '{ ...e(); }': () @@ -2100,7 +2097,7 @@ fn test() { @r###" [11; 48) '{ ...&y]; }': () [21; 22) 'y': &{unknown} - [25; 32) 'unknown': &&{unknown} + [25; 32) 'unknown': &{unknown} [38; 45) '[y, &y]': [&&{unknown};_] [39; 40) 'y': &{unknown} [42; 44) '&y': &&{unknown} @@ -2124,11 +2121,11 @@ fn test() { @r###" [11; 80) '{ ...x)]; }': () [21; 22) 'x': &&{unknown} - [25; 32) 'unknown': &&&{unknown} + [25; 32) 'unknown': &&{unknown} [42; 43) 'y': &&{unknown} - [46; 53) 'unknown': &&&{unknown} - [59; 77) '[(x, y..., &x)]': [(&&{unknown}, &&{unknown});_] - [60; 66) '(x, y)': (&&{unknown}, &&{unknown}) + [46; 53) 'unknown': &&{unknown} + [59; 77) '[(x, y..., &x)]': [(&&&{unknown}, &&&{unknown});_] + [60; 66) '(x, y)': (&&&{unknown}, &&&{unknown}) [61; 62) 'x': &&{unknown} [64; 65) 'y': &&{unknown} [68; 76) '(&y, &x)': (&&&{unknown}, &&&{unknown}) @@ -2149,7 +2146,7 @@ fn id(x: T) -> T { } fn clone(x: &T) -> T { - x + *x } fn test() { @@ -2160,26 +2157,26 @@ fn test() { } "#), @r###" - [10; 11) 'x': T [21; 30) '{ x }': T [27; 28) 'x': T [44; 45) 'x': &T - [56; 65) '{ x }': &T - [62; 63) 'x': &T - [77; 157) '{ ...(1); }': () - [87; 88) 'y': u32 - [91; 96) '10u32': u32 - [102; 104) 'id': fn id(T) -> T - [102; 107) 'id(y)': u32 - [105; 106) 'y': u32 - [117; 118) 'x': bool - [127; 132) 'clone': fn clone(&T) -> T - [127; 135) 'clone(z)': bool - [133; 134) 'z': &bool - [141; 151) 'id::': fn id(T) -> T - [141; 154) 'id::(1)': i128 - [152; 153) '1': i128 + [56; 66) '{ *x }': T + [62; 64) '*x': T + [63; 64) 'x': &T + [78; 158) '{ ...(1); }': () + [88; 89) 'y': u32 + [92; 97) '10u32': u32 + [103; 105) 'id': fn id(T) -> T + [103; 108) 'id(y)': u32 + [106; 107) 'y': u32 + [118; 119) 'x': bool + [128; 133) 'clone': fn clone(&T) -> T + [128; 136) 'clone(z)': bool + [134; 135) 'z': &bool + [142; 152) 'id::': fn id(T) -> T + [142; 155) 'id::(1)': i128 + [153; 154) '1': i128 "### ); } @@ -3404,7 +3401,7 @@ impl S { } fn test(s: Arc) { - (*s, s.foo())<|> + (*s, s.foo())<|>; } "#, ); @@ -3488,7 +3485,7 @@ impl S { } fn test(s: Arc) { - (*s, s.foo())<|> + (*s, s.foo())<|>; } "#, ); -- cgit v1.2.3