diff options
Diffstat (limited to 'crates/ra_hir/src/ty/tests.rs')
-rw-r--r-- | crates/ra_hir/src/ty/tests.rs | 202 |
1 files changed, 5 insertions, 197 deletions
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::{ | |||
21 | // update the snapshots. | 21 | // update the snapshots. |
22 | 22 | ||
23 | mod never_type; | 23 | mod never_type; |
24 | mod coercion; | ||
24 | 25 | ||
25 | #[test] | 26 | #[test] |
26 | fn infer_await() { | 27 | fn infer_await() { |
@@ -926,196 +927,6 @@ fn test(a: A<i32>) { | |||
926 | } | 927 | } |
927 | 928 | ||
928 | #[test] | 929 | #[test] |
929 | fn infer_if_coerce() { | ||
930 | assert_snapshot!( | ||
931 | infer(r#" | ||
932 | fn foo<T>(x: &[T]) -> &[T] { loop {} } | ||
933 | fn test() { | ||
934 | let x = if true { | ||
935 | foo(&[1]) | ||
936 | } else { | ||
937 | &[1] | ||
938 | }; | ||
939 | } | ||
940 | "#), | ||
941 | @r###" | ||
942 | [11; 12) 'x': &[T] | ||
943 | [28; 39) '{ loop {} }': ! | ||
944 | [30; 37) 'loop {}': ! | ||
945 | [35; 37) '{}': () | ||
946 | [50; 126) '{ ... }; }': () | ||
947 | [60; 61) 'x': &[i32] | ||
948 | [64; 123) 'if tru... }': &[i32] | ||
949 | [67; 71) 'true': bool | ||
950 | [72; 97) '{ ... }': &[i32] | ||
951 | [82; 85) 'foo': fn foo<i32>(&[T]) -> &[T] | ||
952 | [82; 91) 'foo(&[1])': &[i32] | ||
953 | [86; 90) '&[1]': &[i32;_] | ||
954 | [87; 90) '[1]': [i32;_] | ||
955 | [88; 89) '1': i32 | ||
956 | [103; 123) '{ ... }': &[i32;_] | ||
957 | [113; 117) '&[1]': &[i32;_] | ||
958 | [114; 117) '[1]': [i32;_] | ||
959 | [115; 116) '1': i32 | ||
960 | "### | ||
961 | ); | ||
962 | } | ||
963 | |||
964 | #[test] | ||
965 | fn infer_if_else_coerce() { | ||
966 | assert_snapshot!( | ||
967 | infer(r#" | ||
968 | fn foo<T>(x: &[T]) -> &[T] { loop {} } | ||
969 | fn test() { | ||
970 | let x = if true { | ||
971 | &[1] | ||
972 | } else { | ||
973 | foo(&[1]) | ||
974 | }; | ||
975 | } | ||
976 | "#), | ||
977 | @r###" | ||
978 | [11; 12) 'x': &[T] | ||
979 | [28; 39) '{ loop {} }': ! | ||
980 | [30; 37) 'loop {}': ! | ||
981 | [35; 37) '{}': () | ||
982 | [50; 126) '{ ... }; }': () | ||
983 | [60; 61) 'x': &[i32] | ||
984 | [64; 123) 'if tru... }': &[i32] | ||
985 | [67; 71) 'true': bool | ||
986 | [72; 92) '{ ... }': &[i32;_] | ||
987 | [82; 86) '&[1]': &[i32;_] | ||
988 | [83; 86) '[1]': [i32;_] | ||
989 | [84; 85) '1': i32 | ||
990 | [98; 123) '{ ... }': &[i32] | ||
991 | [108; 111) 'foo': fn foo<i32>(&[T]) -> &[T] | ||
992 | [108; 117) 'foo(&[1])': &[i32] | ||
993 | [112; 116) '&[1]': &[i32;_] | ||
994 | [113; 116) '[1]': [i32;_] | ||
995 | [114; 115) '1': i32 | ||
996 | "### | ||
997 | ); | ||
998 | } | ||
999 | |||
1000 | #[test] | ||
1001 | fn infer_match_first_coerce() { | ||
1002 | assert_snapshot!( | ||
1003 | infer(r#" | ||
1004 | fn foo<T>(x: &[T]) -> &[T] { loop {} } | ||
1005 | fn test(i: i32) { | ||
1006 | let x = match i { | ||
1007 | 2 => foo(&[2]), | ||
1008 | 1 => &[1], | ||
1009 | _ => &[3], | ||
1010 | }; | ||
1011 | } | ||
1012 | "#), | ||
1013 | @r###" | ||
1014 | [11; 12) 'x': &[T] | ||
1015 | [28; 39) '{ loop {} }': ! | ||
1016 | [30; 37) 'loop {}': ! | ||
1017 | [35; 37) '{}': () | ||
1018 | [48; 49) 'i': i32 | ||
1019 | [56; 150) '{ ... }; }': () | ||
1020 | [66; 67) 'x': &[i32] | ||
1021 | [70; 147) 'match ... }': &[i32] | ||
1022 | [76; 77) 'i': i32 | ||
1023 | [88; 89) '2': i32 | ||
1024 | [93; 96) 'foo': fn foo<i32>(&[T]) -> &[T] | ||
1025 | [93; 102) 'foo(&[2])': &[i32] | ||
1026 | [97; 101) '&[2]': &[i32;_] | ||
1027 | [98; 101) '[2]': [i32;_] | ||
1028 | [99; 100) '2': i32 | ||
1029 | [112; 113) '1': i32 | ||
1030 | [117; 121) '&[1]': &[i32;_] | ||
1031 | [118; 121) '[1]': [i32;_] | ||
1032 | [119; 120) '1': i32 | ||
1033 | [131; 132) '_': i32 | ||
1034 | [136; 140) '&[3]': &[i32;_] | ||
1035 | [137; 140) '[3]': [i32;_] | ||
1036 | [138; 139) '3': i32 | ||
1037 | "### | ||
1038 | ); | ||
1039 | } | ||
1040 | |||
1041 | #[test] | ||
1042 | fn infer_match_second_coerce() { | ||
1043 | assert_snapshot!( | ||
1044 | infer(r#" | ||
1045 | fn foo<T>(x: &[T]) -> &[T] { loop {} } | ||
1046 | fn test(i: i32) { | ||
1047 | let x = match i { | ||
1048 | 1 => &[1], | ||
1049 | 2 => foo(&[2]), | ||
1050 | _ => &[3], | ||
1051 | }; | ||
1052 | } | ||
1053 | "#), | ||
1054 | @r###" | ||
1055 | [11; 12) 'x': &[T] | ||
1056 | [28; 39) '{ loop {} }': ! | ||
1057 | [30; 37) 'loop {}': ! | ||
1058 | [35; 37) '{}': () | ||
1059 | [48; 49) 'i': i32 | ||
1060 | [56; 150) '{ ... }; }': () | ||
1061 | [66; 67) 'x': &[i32] | ||
1062 | [70; 147) 'match ... }': &[i32] | ||
1063 | [76; 77) 'i': i32 | ||
1064 | [88; 89) '1': i32 | ||
1065 | [93; 97) '&[1]': &[i32;_] | ||
1066 | [94; 97) '[1]': [i32;_] | ||
1067 | [95; 96) '1': i32 | ||
1068 | [107; 108) '2': i32 | ||
1069 | [112; 115) 'foo': fn foo<i32>(&[T]) -> &[T] | ||
1070 | [112; 121) 'foo(&[2])': &[i32] | ||
1071 | [116; 120) '&[2]': &[i32;_] | ||
1072 | [117; 120) '[2]': [i32;_] | ||
1073 | [118; 119) '2': i32 | ||
1074 | [131; 132) '_': i32 | ||
1075 | [136; 140) '&[3]': &[i32;_] | ||
1076 | [137; 140) '[3]': [i32;_] | ||
1077 | [138; 139) '3': i32 | ||
1078 | "### | ||
1079 | ); | ||
1080 | } | ||
1081 | |||
1082 | #[test] | ||
1083 | fn coerce_merge_one_by_one1() { | ||
1084 | covers!(coerce_merge_fail_fallback); | ||
1085 | |||
1086 | assert_snapshot!( | ||
1087 | infer(r#" | ||
1088 | fn test() { | ||
1089 | let t = &mut 1; | ||
1090 | let x = match 1 { | ||
1091 | 1 => t as *mut i32, | ||
1092 | 2 => t as &i32, | ||
1093 | _ => t as *const i32, | ||
1094 | }; | ||
1095 | } | ||
1096 | "#), | ||
1097 | @r###" | ||
1098 | [11; 145) '{ ... }; }': () | ||
1099 | [21; 22) 't': &mut i32 | ||
1100 | [25; 31) '&mut 1': &mut i32 | ||
1101 | [30; 31) '1': i32 | ||
1102 | [41; 42) 'x': *const i32 | ||
1103 | [45; 142) 'match ... }': *const i32 | ||
1104 | [51; 52) '1': i32 | ||
1105 | [63; 64) '1': i32 | ||
1106 | [68; 69) 't': &mut i32 | ||
1107 | [68; 81) 't as *mut i32': *mut i32 | ||
1108 | [91; 92) '2': i32 | ||
1109 | [96; 97) 't': &mut i32 | ||
1110 | [96; 105) 't as &i32': &i32 | ||
1111 | [115; 116) '_': i32 | ||
1112 | [120; 121) 't': &mut i32 | ||
1113 | [120; 135) 't as *const i32': *const i32 | ||
1114 | "### | ||
1115 | ); | ||
1116 | } | ||
1117 | |||
1118 | #[test] | ||
1119 | fn bug_484() { | 930 | fn bug_484() { |
1120 | assert_snapshot!( | 931 | assert_snapshot!( |
1121 | infer(r#" | 932 | infer(r#" |
@@ -1302,7 +1113,6 @@ fn test(x: &str, y: isize) { | |||
1302 | } | 1113 | } |
1303 | "#), | 1114 | "#), |
1304 | @r###" | 1115 | @r###" |
1305 | |||
1306 | [9; 10) 'x': &str | 1116 | [9; 10) 'x': &str |
1307 | [18; 19) 'y': isize | 1117 | [18; 19) 'y': isize |
1308 | [28; 324) '{ ... 3]; }': () | 1118 | [28; 324) '{ ... 3]; }': () |
@@ -1355,7 +1165,7 @@ fn test(x: &str, y: isize) { | |||
1355 | [260; 263) '"b"': &str | 1165 | [260; 263) '"b"': &str |
1356 | [275; 276) 'x': [u8;_] | 1166 | [275; 276) 'x': [u8;_] |
1357 | [288; 290) '[]': [u8;_] | 1167 | [288; 290) '[]': [u8;_] |
1358 | [300; 301) 'z': &[u8;_] | 1168 | [300; 301) 'z': &[u8] |
1359 | [311; 321) '&[1, 2, 3]': &[u8;_] | 1169 | [311; 321) '&[1, 2, 3]': &[u8;_] |
1360 | [312; 321) '[1, 2, 3]': [u8;_] | 1170 | [312; 321) '[1, 2, 3]': [u8;_] |
1361 | [313; 314) '1': u8 | 1171 | [313; 314) '1': u8 |
@@ -2288,10 +2098,9 @@ fn test() { | |||
2288 | } | 2098 | } |
2289 | "#), | 2099 | "#), |
2290 | @r###" | 2100 | @r###" |
2291 | |||
2292 | [11; 48) '{ ...&y]; }': () | 2101 | [11; 48) '{ ...&y]; }': () |
2293 | [21; 22) 'y': &{unknown} | 2102 | [21; 22) 'y': &{unknown} |
2294 | [25; 32) 'unknown': &{unknown} | 2103 | [25; 32) 'unknown': &&{unknown} |
2295 | [38; 45) '[y, &y]': [&&{unknown};_] | 2104 | [38; 45) '[y, &y]': [&&{unknown};_] |
2296 | [39; 40) 'y': &{unknown} | 2105 | [39; 40) 'y': &{unknown} |
2297 | [42; 44) '&y': &&{unknown} | 2106 | [42; 44) '&y': &&{unknown} |
@@ -2313,12 +2122,11 @@ fn test() { | |||
2313 | } | 2122 | } |
2314 | "#), | 2123 | "#), |
2315 | @r###" | 2124 | @r###" |
2316 | |||
2317 | [11; 80) '{ ...x)]; }': () | 2125 | [11; 80) '{ ...x)]; }': () |
2318 | [21; 22) 'x': &&{unknown} | 2126 | [21; 22) 'x': &&{unknown} |
2319 | [25; 32) 'unknown': &&{unknown} | 2127 | [25; 32) 'unknown': &&&{unknown} |
2320 | [42; 43) 'y': &&{unknown} | 2128 | [42; 43) 'y': &&{unknown} |
2321 | [46; 53) 'unknown': &&{unknown} | 2129 | [46; 53) 'unknown': &&&{unknown} |
2322 | [59; 77) '[(x, y..., &x)]': [(&&{unknown}, &&{unknown});_] | 2130 | [59; 77) '[(x, y..., &x)]': [(&&{unknown}, &&{unknown});_] |
2323 | [60; 66) '(x, y)': (&&{unknown}, &&{unknown}) | 2131 | [60; 66) '(x, y)': (&&{unknown}, &&{unknown}) |
2324 | [61; 62) 'x': &&{unknown} | 2132 | [61; 62) 'x': &&{unknown} |