Skip to content

Commit fbfdd57

Browse files
committed
Rust: Additional test cases for rust/dead-code.
1 parent a8b1cb3 commit fbfdd57

File tree

4 files changed

+159
-23
lines changed

4 files changed

+159
-23
lines changed

rust/ql/test/query-tests/unusedentities/UnreachableCode.expected

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,19 @@
55
| unreachable.rs:67:5:67:19 | ExprStmt | This code is never reached. |
66
| unreachable.rs:134:13:134:20 | MacroExpr | This code is never reached. |
77
| unreachable.rs:143:13:143:20 | MacroExpr | This code is never reached. |
8-
| unreachable.rs:169:5:169:19 | ExprStmt | This code is never reached. |
9-
| unreachable.rs:177:13:177:27 | ExprStmt | This code is never reached. |
10-
| unreachable.rs:187:13:187:27 | ExprStmt | This code is never reached. |
11-
| unreachable.rs:193:9:193:23 | ExprStmt | This code is never reached. |
12-
| unreachable.rs:200:17:200:31 | ExprStmt | This code is never reached. |
13-
| unreachable.rs:210:17:210:31 | ExprStmt | This code is never reached. |
14-
| unreachable.rs:213:9:213:23 | ExprStmt | This code is never reached. |
15-
| unreachable.rs:238:9:238:23 | ExprStmt | This code is never reached. |
16-
| unreachable.rs:254:9:254:23 | ExprStmt | This code is never reached. |
8+
| unreachable.rs:166:9:166:23 | ExprStmt | This code is never reached. |
9+
| unreachable.rs:171:9:171:17 | MacroExpr | This code is never reached. |
10+
| unreachable.rs:177:9:177:26 | MacroExpr | This code is never reached. |
11+
| unreachable.rs:206:9:206:23 | ExprStmt | This code is never reached. |
12+
| unreachable.rs:231:13:231:27 | ExprStmt | This code is never reached. |
13+
| unreachable.rs:241:13:241:27 | ExprStmt | This code is never reached. |
14+
| unreachable.rs:247:9:247:23 | ExprStmt | This code is never reached. |
15+
| unreachable.rs:254:17:254:31 | ExprStmt | This code is never reached. |
16+
| unreachable.rs:264:17:264:31 | ExprStmt | This code is never reached. |
17+
| unreachable.rs:267:9:267:23 | ExprStmt | This code is never reached. |
18+
| unreachable.rs:303:9:303:23 | ExprStmt | This code is never reached. |
19+
| unreachable.rs:332:9:332:23 | ExprStmt | This code is never reached. |
20+
| unreachable.rs:348:9:348:23 | ExprStmt | This code is never reached. |
21+
| unreachable.rs:370:9:370:23 | ExprStmt | This code is never reached. |
22+
| unreachable.rs:375:5:375:10 | ExprStmt | This code is never reached. |
23+
| unreachable.rs:382:5:382:10 | ExprStmt | This code is never reached. |

rust/ql/test/query-tests/unusedentities/UnusedValue.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,5 @@
1818
| more.rs:44:9:44:14 | a_ptr4 | Variable $@ is assigned a value that is never used. | more.rs:44:9:44:14 | a_ptr4 | a_ptr4 |
1919
| more.rs:59:9:59:13 | d_ptr | Variable $@ is assigned a value that is never used. | more.rs:59:9:59:13 | d_ptr | d_ptr |
2020
| more.rs:65:9:65:17 | f_ptr | Variable $@ is assigned a value that is never used. | more.rs:65:13:65:17 | f_ptr | f_ptr |
21+
| unreachable.rs:292:9:292:15 | for_ten | Variable $@ is assigned a value that is never used. | unreachable.rs:292:9:292:15 | for_ten | for_ten |
22+
| unreachable.rs:299:9:299:16 | for_ever | Variable $@ is assigned a value that is never used. | unreachable.rs:299:9:299:16 | for_ever | for_ever |

rust/ql/test/query-tests/unusedentities/main.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,11 +484,14 @@ fn main() {
484484
unreachable_if_2();
485485
unreachable_if_3();
486486
unreachable_panic();
487+
_ = unreachable_bail();
487488
unreachable_match();
488489
unreachable_loop();
490+
unreachable_loop_async();
489491
unreachable_paren();
490492
unreachable_let_1();
491493
unreachable_let_2();
494+
unreachable_attributes();
492495

493496
macros();
494497
}

rust/ql/test/query-tests/unusedentities/unreachable.rs

Lines changed: 138 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -147,26 +147,80 @@ pub fn unreachable_panic() {
147147
}
148148
}
149149

150-
pub fn unreachable_match() {
151-
match get_a_number() {
152-
1 => {
153-
return;
154-
}
155-
_ => {
156-
do_something();
157-
}
150+
macro_rules! bail_1 {
151+
() => {
152+
return Err(String::from("message"))
153+
};
154+
}
155+
156+
macro_rules! bail_2 {
157+
($message:literal) => {
158+
return Err(String::from($message))
159+
};
160+
}
161+
162+
pub fn unreachable_bail() -> Result<i32, String> {
163+
if cond() {
164+
do_something();
165+
return Err(String::from("message"));
166+
do_something(); // $ Alert[rust/dead-code]
167+
}
168+
169+
if cond() {
170+
do_something();
171+
bail_1!(); // $ SPURIOUS: Alert[rust/dead-code]
172+
do_something(); // $ MISSING: Alert[rust/dead-code]
173+
}
174+
175+
if cond() {
176+
do_something();
177+
bail_2!("message"); // $ SPURIOUS: Alert[rust/dead-code]
158178
}
159179
do_something();
160180

161-
match get_a_number() {
162-
1 => {
163-
return;
181+
Ok(1)
182+
}
183+
184+
pub fn unreachable_match() {
185+
if cond() {
186+
match get_a_number() {
187+
1 => {
188+
return;
189+
}
190+
_ => {
191+
do_something();
192+
}
164193
}
165-
_ => {
166-
return;
194+
do_something();
195+
}
196+
197+
if cond() {
198+
match get_a_number() {
199+
1 => {
200+
return;
201+
}
202+
_ => {
203+
return;
204+
}
167205
}
206+
do_something(); // $ Alert[rust/dead-code]
207+
}
208+
209+
if cond() {
210+
_ = match get_a_number() {
211+
1 => "One",
212+
_ => "Some"
213+
};
214+
do_something();
215+
}
216+
217+
if cond() {
218+
_ = Some(match get_a_number() {
219+
1 => "One",
220+
_ => "Some"
221+
});
222+
do_something();
168223
}
169-
do_something(); // $ Alert[rust/dead-code]
170224
}
171225

172226
pub fn unreachable_loop() {
@@ -214,6 +268,46 @@ pub fn unreachable_loop() {
214268
do_something();
215269
do_something();
216270
}
271+
272+
if cond() {
273+
fn do_nothing() { };
274+
fn loop_forever() { loop {} };
275+
fn take_a_fn(_: fn() -> ()) {
276+
};
277+
fn call_a_fn(f: fn() -> ()) {
278+
f();
279+
};
280+
281+
take_a_fn( do_nothing );
282+
call_a_fn( do_nothing );
283+
take_a_fn( loop_forever );
284+
call_a_fn( loop_forever );
285+
do_something(); // $ MISSING: Alert[rust/dead-code]
286+
}
287+
}
288+
289+
async fn do_something_async() {}
290+
291+
pub async fn unreachable_loop_async() {
292+
let for_ten = async { // $ SPURIOUS: Alert[rust/unused-value]
293+
for _ in 1..10 {
294+
do_something_async().await;
295+
}
296+
do_something();
297+
};
298+
299+
let for_ever = async { // $ SPURIOUS: Alert[rust/unused-value]
300+
loop {
301+
do_something_async().await;
302+
}
303+
do_something(); // $ Alert[rust/dead-code]
304+
};
305+
306+
do_something();
307+
for_ten.await;
308+
do_something();
309+
for_ever.await;
310+
do_something(); // $ MISSING: Alert[rust/dead-code]
217311
}
218312

219313
pub fn unreachable_paren() {
@@ -257,3 +351,33 @@ pub fn unreachable_let_2() {
257351

258352
do_something();
259353
}
354+
355+
#[cfg(not(foo))]
356+
pub fn unreachable_attributes() {
357+
// `#[cfg` and `cfg!` checks can go either way, we should not assume this
358+
// function or either branch below is unreachable.
359+
if cfg!(bar) {
360+
do_something();
361+
} else {
362+
do_something();
363+
}
364+
365+
#[doc="This is a doc comment declared through an attribute."]
366+
367+
if (true) {
368+
do_something();
369+
} else {
370+
do_something(); // $ Alert[rust/dead-code]
371+
}
372+
}
373+
374+
const _: () = {
375+
_ = 1; // $ SPURIOUS: Alert[rust/dead-code]
376+
};
377+
378+
const _: () = {
379+
const fn foo() {
380+
_ = 1;
381+
};
382+
foo(); // $ SPURIOUS: Alert[rust/dead-code]
383+
};

0 commit comments

Comments
 (0)