diff options
author | uHOOCCOOHu <[email protected]> | 2019-09-17 20:59:51 +0100 |
---|---|---|
committer | uHOOCCOOHu <[email protected]> | 2019-09-25 23:04:43 +0100 |
commit | bf161fa3e58d57d9b15bd965405036d834f18595 (patch) | |
tree | 62f7103143462ed75544985b7c3ad0cb2ddda96b /crates/ra_hir/src/ty/tests | |
parent | 4bb66df6de6a832f53f09128ea038fc1c0068515 (diff) |
Better handle never type and branch merging
Split out tests for never type to another file
Diffstat (limited to 'crates/ra_hir/src/ty/tests')
-rw-r--r-- | crates/ra_hir/src/ty/tests/never_type.rs | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/crates/ra_hir/src/ty/tests/never_type.rs b/crates/ra_hir/src/ty/tests/never_type.rs new file mode 100644 index 000000000..b9af918e9 --- /dev/null +++ b/crates/ra_hir/src/ty/tests/never_type.rs | |||
@@ -0,0 +1,258 @@ | |||
1 | use super::type_at; | ||
2 | |||
3 | #[test] | ||
4 | fn infer_never1() { | ||
5 | let t = type_at( | ||
6 | r#" | ||
7 | //- /main.rs | ||
8 | fn test() { | ||
9 | let t = return; | ||
10 | t<|>; | ||
11 | } | ||
12 | "#, | ||
13 | ); | ||
14 | assert_eq!(t, "!"); | ||
15 | } | ||
16 | |||
17 | #[test] | ||
18 | fn infer_never2() { | ||
19 | let t = type_at( | ||
20 | r#" | ||
21 | //- /main.rs | ||
22 | trait Foo { fn gen() -> Self; } | ||
23 | impl Foo for ! { fn gen() -> Self { loop {} } } | ||
24 | impl Foo for () { fn gen() -> Self { loop {} } } | ||
25 | |||
26 | fn test() { | ||
27 | let a = Foo::gen(); | ||
28 | if false { a } else { loop {} }; | ||
29 | a<|>; | ||
30 | } | ||
31 | "#, | ||
32 | ); | ||
33 | assert_eq!(t, "!"); | ||
34 | } | ||
35 | |||
36 | #[test] | ||
37 | fn infer_never3() { | ||
38 | let t = type_at( | ||
39 | r#" | ||
40 | //- /main.rs | ||
41 | trait Foo { fn gen() -> Self; } | ||
42 | impl Foo for ! { fn gen() -> Self { loop {} } } | ||
43 | impl Foo for () { fn gen() -> Self { loop {} } } | ||
44 | |||
45 | fn test() { | ||
46 | let a = Foo::gen(); | ||
47 | if false { loop {} } else { a }; | ||
48 | a<|>; | ||
49 | } | ||
50 | "#, | ||
51 | ); | ||
52 | assert_eq!(t, "!"); | ||
53 | } | ||
54 | |||
55 | #[test] | ||
56 | fn never_type_in_generic_args() { | ||
57 | let t = type_at( | ||
58 | r#" | ||
59 | //- /main.rs | ||
60 | enum Option<T> { None, Some(T) } | ||
61 | |||
62 | fn test() { | ||
63 | let a = if true { Option::None } else { Option::Some(return) }; | ||
64 | a<|>; | ||
65 | } | ||
66 | "#, | ||
67 | ); | ||
68 | assert_eq!(t, "Option<!>"); | ||
69 | } | ||
70 | |||
71 | #[test] | ||
72 | fn never_type_can_be_reinferred1() { | ||
73 | let t = type_at( | ||
74 | r#" | ||
75 | //- /main.rs | ||
76 | trait Foo { fn gen() -> Self; } | ||
77 | impl Foo for ! { fn gen() -> Self { loop {} } } | ||
78 | impl Foo for () { fn gen() -> Self { loop {} } } | ||
79 | |||
80 | fn test() { | ||
81 | let a = Foo::gen(); | ||
82 | if false { loop {} } else { a }; | ||
83 | a<|>; | ||
84 | if false { a }; | ||
85 | } | ||
86 | "#, | ||
87 | ); | ||
88 | assert_eq!(t, "()"); | ||
89 | } | ||
90 | |||
91 | #[test] | ||
92 | fn never_type_can_be_reinferred2() { | ||
93 | let t = type_at( | ||
94 | r#" | ||
95 | //- /main.rs | ||
96 | enum Option<T> { None, Some(T) } | ||
97 | |||
98 | fn test() { | ||
99 | let a = if true { Option::None } else { Option::Some(return) }; | ||
100 | a<|>; | ||
101 | match 42 { | ||
102 | 42 => a, | ||
103 | _ => Option::Some(42), | ||
104 | }; | ||
105 | } | ||
106 | "#, | ||
107 | ); | ||
108 | assert_eq!(t, "Option<i32>"); | ||
109 | } | ||
110 | #[test] | ||
111 | fn never_type_can_be_reinferred3() { | ||
112 | let t = type_at( | ||
113 | r#" | ||
114 | //- /main.rs | ||
115 | enum Option<T> { None, Some(T) } | ||
116 | |||
117 | fn test() { | ||
118 | let a = if true { Option::None } else { Option::Some(return) }; | ||
119 | a<|>; | ||
120 | match 42 { | ||
121 | 42 => a, | ||
122 | _ => Option::Some("str"), | ||
123 | }; | ||
124 | } | ||
125 | "#, | ||
126 | ); | ||
127 | assert_eq!(t, "Option<&str>"); | ||
128 | } | ||
129 | |||
130 | #[test] | ||
131 | fn match_no_arm() { | ||
132 | let t = type_at( | ||
133 | r#" | ||
134 | //- /main.rs | ||
135 | enum Void {} | ||
136 | |||
137 | fn test(a: Void) { | ||
138 | let t = match a {}; | ||
139 | t<|>; | ||
140 | } | ||
141 | "#, | ||
142 | ); | ||
143 | assert_eq!(t, "!"); | ||
144 | } | ||
145 | |||
146 | #[test] | ||
147 | fn if_never() { | ||
148 | let t = type_at( | ||
149 | r#" | ||
150 | //- /main.rs | ||
151 | fn test() { | ||
152 | let i = if true { | ||
153 | loop {} | ||
154 | } else { | ||
155 | 3.0 | ||
156 | }; | ||
157 | i<|> | ||
158 | () | ||
159 | } | ||
160 | "#, | ||
161 | ); | ||
162 | assert_eq!(t, "f64"); | ||
163 | } | ||
164 | |||
165 | #[test] | ||
166 | fn if_else_never() { | ||
167 | let t = type_at( | ||
168 | r#" | ||
169 | //- /main.rs | ||
170 | fn test(input: bool) { | ||
171 | let i = if input { | ||
172 | 2.0 | ||
173 | } else { | ||
174 | return | ||
175 | }; | ||
176 | i<|> | ||
177 | () | ||
178 | } | ||
179 | "#, | ||
180 | ); | ||
181 | assert_eq!(t, "f64"); | ||
182 | } | ||
183 | |||
184 | #[test] | ||
185 | fn match_first_arm_never() { | ||
186 | let t = type_at( | ||
187 | r#" | ||
188 | //- /main.rs | ||
189 | fn test(a: i32) { | ||
190 | let i = match a { | ||
191 | 1 => return, | ||
192 | 2 => 2.0, | ||
193 | 3 => loop {}, | ||
194 | _ => 3.0, | ||
195 | }; | ||
196 | i<|> | ||
197 | () | ||
198 | } | ||
199 | "#, | ||
200 | ); | ||
201 | assert_eq!(t, "f64"); | ||
202 | } | ||
203 | |||
204 | #[test] | ||
205 | fn match_second_arm_never() { | ||
206 | let t = type_at( | ||
207 | r#" | ||
208 | //- /main.rs | ||
209 | fn test(a: i32) { | ||
210 | let i = match a { | ||
211 | 1 => 3.0, | ||
212 | 2 => loop {}, | ||
213 | 3 => 3.0, | ||
214 | _ => return, | ||
215 | }; | ||
216 | i<|> | ||
217 | () | ||
218 | } | ||
219 | "#, | ||
220 | ); | ||
221 | assert_eq!(t, "f64"); | ||
222 | } | ||
223 | |||
224 | #[test] | ||
225 | fn match_all_arms_never() { | ||
226 | let t = type_at( | ||
227 | r#" | ||
228 | //- /main.rs | ||
229 | fn test(a: i32) { | ||
230 | let i = match a { | ||
231 | 2 => return, | ||
232 | _ => loop {}, | ||
233 | }; | ||
234 | i<|> | ||
235 | () | ||
236 | } | ||
237 | "#, | ||
238 | ); | ||
239 | assert_eq!(t, "!"); | ||
240 | } | ||
241 | |||
242 | #[test] | ||
243 | fn match_no_never_arms() { | ||
244 | let t = type_at( | ||
245 | r#" | ||
246 | //- /main.rs | ||
247 | fn test(a: i32) { | ||
248 | let i = match a { | ||
249 | 2 => 2.0, | ||
250 | _ => 3.0, | ||
251 | }; | ||
252 | i<|> | ||
253 | () | ||
254 | } | ||
255 | "#, | ||
256 | ); | ||
257 | assert_eq!(t, "f64"); | ||
258 | } | ||