Skip to content

Commit de0d2b1

Browse files
committed
Add testcases
1 parent b1aa306 commit de0d2b1

File tree

3 files changed

+66
-16
lines changed

3 files changed

+66
-16
lines changed

clippy_utils/src/higher.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -658,18 +658,18 @@ pub fn get_vec_init_kind<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) -
658658
{
659659
if name.ident.name == sym::new {
660660
return Some(VecInitKind::New);
661+
} else if name.ident.name.as_str() == "default" {
662+
return Some(VecInitKind::Default);
661663
} else if name.ident.name.as_str() == "with_capacity" {
662-
return args.get(0).and_then(|arg| {
663-
if_chain! {
664-
if let ExprKind::Lit(lit) = &arg.kind;
665-
if let LitKind::Int(num, _) = lit.node;
666-
then {
667-
Some(VecInitKind::WithLiteralCapacity(num.try_into().ok()?))
668-
} else {
669-
Some(VecInitKind::WithExprCapacity(arg.hir_id))
670-
}
664+
let arg = args.get(0)?;
665+
if_chain! {
666+
if let ExprKind::Lit(lit) = &arg.kind;
667+
if let LitKind::Int(num, _) = lit.node;
668+
then {
669+
return Some(VecInitKind::WithLiteralCapacity(num.try_into().ok()?))
671670
}
672-
});
671+
}
672+
return Some(VecInitKind::WithExprCapacity(arg.hir_id));
673673
}
674674
}
675675
ExprKind::Path(QPath::Resolved(_, path))

tests/ui/uninit_vec.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,23 @@ fn main() {
2020
vec.set_len(200);
2121
}
2222

23+
// new() -> set_len() should be detected
24+
let mut vec: Vec<u8> = Vec::new();
25+
unsafe {
26+
vec.set_len(200);
27+
}
28+
29+
// default() -> set_len() should be detected
30+
let mut vec: Vec<u8> = Default::default();
31+
unsafe {
32+
vec.set_len(200);
33+
}
34+
35+
let mut vec: Vec<u8> = Vec::default();
36+
unsafe {
37+
vec.set_len(200);
38+
}
39+
2340
// test when both calls are enclosed in the same unsafe block
2441
unsafe {
2542
let mut vec: Vec<u8> = Vec::with_capacity(1000);

tests/ui/uninit_vec.stderr

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,40 @@ LL | vec.set_len(200);
2222
= help: initialize the buffer or wrap the content in `MaybeUninit`
2323

2424
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
25-
--> $DIR/uninit_vec.rs:32:5
25+
--> $DIR/uninit_vec.rs:24:5
26+
|
27+
LL | let mut vec: Vec<u8> = Vec::new();
28+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
29+
LL | unsafe {
30+
LL | vec.set_len(200);
31+
| ^^^^^^^^^^^^^^^^
32+
|
33+
= help: initialize the buffer or wrap the content in `MaybeUninit`
34+
35+
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
36+
--> $DIR/uninit_vec.rs:30:5
37+
|
38+
LL | let mut vec: Vec<u8> = Default::default();
39+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
40+
LL | unsafe {
41+
LL | vec.set_len(200);
42+
| ^^^^^^^^^^^^^^^^
43+
|
44+
= help: initialize the buffer or wrap the content in `MaybeUninit`
45+
46+
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
47+
--> $DIR/uninit_vec.rs:35:5
48+
|
49+
LL | let mut vec: Vec<u8> = Vec::default();
50+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
51+
LL | unsafe {
52+
LL | vec.set_len(200);
53+
| ^^^^^^^^^^^^^^^^
54+
|
55+
= help: initialize the buffer or wrap the content in `MaybeUninit`
56+
57+
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
58+
--> $DIR/uninit_vec.rs:49:5
2659
|
2760
LL | let mut vec: Vec<u8> = Vec::with_capacity(1000);
2861
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -33,7 +66,7 @@ LL | vec.set_len(200);
3366
= help: initialize the buffer or wrap the content in `MaybeUninit`
3467

3568
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
36-
--> $DIR/uninit_vec.rs:41:5
69+
--> $DIR/uninit_vec.rs:58:5
3770
|
3871
LL | my_vec.vec.reserve(1000);
3972
| ^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -44,7 +77,7 @@ LL | my_vec.vec.set_len(200);
4477
= help: initialize the buffer or wrap the content in `MaybeUninit`
4578

4679
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
47-
--> $DIR/uninit_vec.rs:46:5
80+
--> $DIR/uninit_vec.rs:63:5
4881
|
4982
LL | my_vec.vec = Vec::with_capacity(1000);
5083
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -55,7 +88,7 @@ LL | my_vec.vec.set_len(200);
5588
= help: initialize the buffer or wrap the content in `MaybeUninit`
5689

5790
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
58-
--> $DIR/uninit_vec.rs:25:9
91+
--> $DIR/uninit_vec.rs:42:9
5992
|
6093
LL | let mut vec: Vec<u8> = Vec::with_capacity(1000);
6194
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -65,7 +98,7 @@ LL | vec.set_len(200);
6598
= help: initialize the buffer or wrap the content in `MaybeUninit`
6699

67100
error: calling `set_len()` immediately after reserving a buffer creates uninitialized values
68-
--> $DIR/uninit_vec.rs:28:9
101+
--> $DIR/uninit_vec.rs:45:9
69102
|
70103
LL | vec.reserve(1000);
71104
| ^^^^^^^^^^^^^^^^^^
@@ -74,5 +107,5 @@ LL | vec.set_len(200);
74107
|
75108
= help: initialize the buffer or wrap the content in `MaybeUninit`
76109

77-
error: aborting due to 7 previous errors
110+
error: aborting due to 10 previous errors
78111

0 commit comments

Comments
 (0)