2019-07-26 17:52:37 -05:00
|
|
|
// edition:2018
|
|
|
|
|
2013-04-12 00:09:54 -05:00
|
|
|
// Exercise the unused_mut attribute in some positive and negative cases
|
|
|
|
|
2019-12-28 09:54:27 -06:00
|
|
|
#![warn(unused_mut)]
|
2019-09-18 15:31:25 -05:00
|
|
|
#![feature(async_closure, raw_ref_op)]
|
2019-07-26 17:52:37 -05:00
|
|
|
|
|
|
|
async fn baz_async(
|
|
|
|
mut a: i32,
|
2019-12-28 09:54:27 -06:00
|
|
|
//~^ WARN: variable does not need to be mutable
|
2019-07-26 17:52:37 -05:00
|
|
|
#[allow(unused_mut)] mut b: i32,
|
|
|
|
) {}
|
|
|
|
fn baz(
|
|
|
|
mut a: i32,
|
2019-12-28 09:54:27 -06:00
|
|
|
//~^ WARN: variable does not need to be mutable
|
2019-07-26 17:52:37 -05:00
|
|
|
#[allow(unused_mut)] mut b: i32,
|
|
|
|
#[allow(unused_mut)] (mut c, d): (i32, i32)
|
|
|
|
) {}
|
2013-04-12 00:09:54 -05:00
|
|
|
|
2019-07-26 17:52:37 -05:00
|
|
|
struct RefStruct {}
|
|
|
|
impl RefStruct {
|
|
|
|
async fn baz_async(
|
|
|
|
mut a: i32,
|
2019-12-28 09:54:27 -06:00
|
|
|
//~^ WARN: variable does not need to be mutable
|
2019-07-26 17:52:37 -05:00
|
|
|
#[allow(unused_mut)] mut b: i32,
|
|
|
|
) {}
|
|
|
|
fn baz(
|
|
|
|
&self,
|
|
|
|
mut a: i32,
|
2019-12-28 09:54:27 -06:00
|
|
|
//~^ WARN: variable does not need to be mutable
|
2019-07-26 17:52:37 -05:00
|
|
|
#[allow(unused_mut)] mut b: i32,
|
|
|
|
#[allow(unused_mut)] (mut c, d): (i32, i32)
|
|
|
|
) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
trait RefTrait {
|
|
|
|
fn baz(
|
|
|
|
&self,
|
|
|
|
mut a: i32,
|
2019-12-28 09:54:27 -06:00
|
|
|
//~^ WARN: variable does not need to be mutable
|
2019-07-26 17:52:37 -05:00
|
|
|
#[allow(unused_mut)] mut b: i32,
|
|
|
|
#[allow(unused_mut)] (mut c, d): (i32, i32)
|
|
|
|
) {}
|
|
|
|
}
|
|
|
|
impl RefTrait for () {
|
|
|
|
fn baz(
|
|
|
|
&self,
|
|
|
|
mut a: i32,
|
2019-12-28 09:54:27 -06:00
|
|
|
//~^ WARN: variable does not need to be mutable
|
2019-07-26 17:52:37 -05:00
|
|
|
#[allow(unused_mut)] mut b: i32,
|
|
|
|
#[allow(unused_mut)] (mut c, d): (i32, i32)
|
|
|
|
) {}
|
|
|
|
}
|
2014-03-05 17:28:08 -06:00
|
|
|
|
2013-04-12 00:09:54 -05:00
|
|
|
fn main() {
|
2019-07-26 17:52:37 -05:00
|
|
|
let _ = async move |
|
|
|
|
mut a: i32,
|
2019-12-28 09:54:27 -06:00
|
|
|
//~^ WARN: variable does not need to be mutable
|
2019-07-26 17:52:37 -05:00
|
|
|
#[allow(unused_mut)] mut b: i32,
|
|
|
|
| {};
|
|
|
|
let _ = |
|
|
|
|
mut a: i32,
|
2019-12-28 09:54:27 -06:00
|
|
|
//~^ WARN: variable does not need to be mutable
|
2019-07-26 17:52:37 -05:00
|
|
|
#[allow(unused_mut)] mut b: i32,
|
|
|
|
#[allow(unused_mut)] (mut c, d): (i32, i32)
|
|
|
|
| {};
|
|
|
|
|
2013-04-12 00:09:54 -05:00
|
|
|
// negative cases
|
2019-12-28 09:54:27 -06:00
|
|
|
let mut a = 3; //~ WARN: variable does not need to be mutable
|
2018-11-08 17:03:17 -06:00
|
|
|
|
2019-12-28 09:54:27 -06:00
|
|
|
let mut a = 2; //~ WARN: variable does not need to be mutable
|
2018-11-08 17:03:17 -06:00
|
|
|
|
2019-12-28 09:54:27 -06:00
|
|
|
let mut b = 3; //~ WARN: variable does not need to be mutable
|
2018-11-08 17:03:17 -06:00
|
|
|
|
2019-12-28 09:54:27 -06:00
|
|
|
let mut a = vec![3]; //~ WARN: variable does not need to be mutable
|
2018-11-08 17:03:17 -06:00
|
|
|
|
2019-12-28 09:54:27 -06:00
|
|
|
let (mut a, b) = (1, 2); //~ WARN: variable does not need to be mutable
|
2018-11-08 17:03:17 -06:00
|
|
|
|
2019-12-28 09:54:27 -06:00
|
|
|
let mut a; //~ WARN: variable does not need to be mutable
|
2018-11-08 17:03:17 -06:00
|
|
|
|
2015-06-17 17:02:58 -05:00
|
|
|
a = 3;
|
|
|
|
|
2019-12-28 09:54:27 -06:00
|
|
|
let mut b; //~ WARN: variable does not need to be mutable
|
2018-11-08 17:03:17 -06:00
|
|
|
|
2015-06-17 17:02:58 -05:00
|
|
|
if true {
|
|
|
|
b = 3;
|
|
|
|
} else {
|
|
|
|
b = 4;
|
|
|
|
}
|
2013-10-22 22:51:45 -05:00
|
|
|
|
2015-01-31 10:23:42 -06:00
|
|
|
match 30 {
|
2019-12-28 09:54:27 -06:00
|
|
|
mut x => {} //~ WARN: variable does not need to be mutable
|
2018-11-08 17:03:17 -06:00
|
|
|
|
2013-10-22 22:51:45 -05:00
|
|
|
}
|
2018-11-08 17:03:17 -06:00
|
|
|
|
2020-07-02 00:32:12 -05:00
|
|
|
match (30, 2) {
|
|
|
|
// FIXME: Here's a false positive,
|
|
|
|
// shouldn't be removed `mut` not to be bound with a different way.
|
|
|
|
(mut x, 1) | //~ WARN: variable does not need to be mutable
|
|
|
|
|
|
|
|
(mut x, 2) |
|
|
|
|
(mut x, 3) => {
|
|
|
|
}
|
|
|
|
_ => {}
|
2014-05-08 14:48:45 -05:00
|
|
|
}
|
2013-10-22 22:51:45 -05:00
|
|
|
|
2019-12-28 09:54:27 -06:00
|
|
|
let x = |mut y: isize| 10; //~ WARN: variable does not need to be mutable
|
2018-11-08 17:03:17 -06:00
|
|
|
|
2019-12-28 09:54:27 -06:00
|
|
|
fn what(mut foo: isize) {} //~ WARN: variable does not need to be mutable
|
2018-11-08 17:03:17 -06:00
|
|
|
|
|
|
|
|
2019-12-28 09:54:27 -06:00
|
|
|
let mut a = &mut 5; //~ WARN: variable does not need to be mutable
|
2013-04-12 00:09:54 -05:00
|
|
|
|
2017-08-01 16:06:26 -05:00
|
|
|
*a = 4;
|
|
|
|
|
|
|
|
let mut a = 5;
|
2019-12-28 09:54:27 -06:00
|
|
|
let mut b = (&mut a,); //~ WARN: variable does not need to be mutable
|
2018-11-08 17:03:17 -06:00
|
|
|
*b.0 = 4;
|
|
|
|
|
2019-12-28 09:54:27 -06:00
|
|
|
let mut x = &mut 1; //~ WARN: variable does not need to be mutable
|
2017-08-01 16:06:26 -05:00
|
|
|
|
2017-08-06 12:25:31 -05:00
|
|
|
let mut f = || {
|
|
|
|
*x += 1;
|
|
|
|
};
|
|
|
|
f();
|
|
|
|
|
2017-08-01 16:06:26 -05:00
|
|
|
fn mut_ref_arg(mut arg : &mut [u8]) -> &mut [u8] {
|
2019-12-28 09:54:27 -06:00
|
|
|
&mut arg[..] //~^ WARN: variable does not need to be mutable
|
2018-11-08 17:03:17 -06:00
|
|
|
|
2017-08-01 16:06:26 -05:00
|
|
|
}
|
|
|
|
|
2019-12-28 09:54:27 -06:00
|
|
|
let mut v : &mut Vec<()> = &mut vec![]; //~ WARN: variable does not need to be mutable
|
2018-11-08 17:03:17 -06:00
|
|
|
|
2017-08-01 16:06:26 -05:00
|
|
|
v.push(());
|
|
|
|
|
2013-04-12 00:09:54 -05:00
|
|
|
// positive cases
|
2015-01-31 10:23:42 -06:00
|
|
|
let mut a = 2;
|
|
|
|
a = 3;
|
2014-03-05 16:02:44 -06:00
|
|
|
let mut a = Vec::new();
|
2015-01-31 10:23:42 -06:00
|
|
|
a.push(3);
|
2014-03-05 16:02:44 -06:00
|
|
|
let mut a = Vec::new();
|
2013-11-21 19:23:21 -06:00
|
|
|
callback(|| {
|
2015-01-31 10:23:42 -06:00
|
|
|
a.push(3);
|
2013-11-21 19:23:21 -06:00
|
|
|
});
|
2018-03-02 22:42:37 -06:00
|
|
|
let mut a = Vec::new();
|
|
|
|
callback(|| {
|
|
|
|
callback(|| {
|
|
|
|
a.push(3);
|
|
|
|
});
|
|
|
|
});
|
2015-01-31 10:23:42 -06:00
|
|
|
let (mut a, b) = (1, 2);
|
2013-10-22 22:51:45 -05:00
|
|
|
a = 34;
|
|
|
|
|
2015-01-31 10:23:42 -06:00
|
|
|
match 30 {
|
2013-10-22 22:51:45 -05:00
|
|
|
mut x => {
|
2015-01-31 10:23:42 -06:00
|
|
|
x = 21;
|
2013-10-22 22:51:45 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-31 10:23:42 -06:00
|
|
|
match (30, 2) {
|
2014-05-08 14:48:45 -05:00
|
|
|
(mut x, 1) |
|
|
|
|
(mut x, 2) |
|
|
|
|
(mut x, 3) => {
|
|
|
|
x = 21
|
|
|
|
}
|
|
|
|
_ => {}
|
|
|
|
}
|
|
|
|
|
2019-04-03 13:21:51 -05:00
|
|
|
// Attribute should be respected on match arms
|
|
|
|
match 0 {
|
|
|
|
#[allow(unused_mut)]
|
|
|
|
mut x => {
|
|
|
|
let mut y = 1;
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2015-02-01 11:44:15 -06:00
|
|
|
let x = |mut y: isize| y = 32;
|
2015-01-31 10:23:42 -06:00
|
|
|
fn nothing(mut foo: isize) { foo = 37; }
|
2013-11-15 07:39:48 -06:00
|
|
|
|
|
|
|
// leading underscore should avoid the warning, just like the
|
|
|
|
// unused variable lint.
|
2015-01-31 10:23:42 -06:00
|
|
|
let mut _allowed = 1;
|
2019-09-18 15:31:25 -05:00
|
|
|
|
|
|
|
let mut raw_address_of_mut = 1; // OK
|
|
|
|
let mut_ptr = &raw mut raw_address_of_mut;
|
|
|
|
|
2019-12-28 09:54:27 -06:00
|
|
|
let mut raw_address_of_const = 1; //~ WARN: variable does not need to be mutable
|
2019-09-18 15:31:25 -05:00
|
|
|
let const_ptr = &raw const raw_address_of_const;
|
2013-04-12 00:09:54 -05:00
|
|
|
}
|
|
|
|
|
2015-01-03 09:45:00 -06:00
|
|
|
fn callback<F>(f: F) where F: FnOnce() {}
|
2013-04-12 00:09:54 -05:00
|
|
|
|
|
|
|
// make sure the lint attribute can be turned off
|
|
|
|
#[allow(unused_mut)]
|
2015-01-08 04:54:35 -06:00
|
|
|
fn foo(mut a: isize) {
|
2015-01-31 10:23:42 -06:00
|
|
|
let mut a = 3;
|
2016-10-29 16:54:04 -05:00
|
|
|
let mut b = vec![2];
|
2013-04-12 00:09:54 -05:00
|
|
|
}
|
2017-09-15 03:36:14 -05:00
|
|
|
|
|
|
|
// make sure the lint attribute can be turned off on let statements
|
|
|
|
#[deny(unused_mut)]
|
|
|
|
fn bar() {
|
|
|
|
#[allow(unused_mut)]
|
|
|
|
let mut a = 3;
|
2018-11-08 17:03:17 -06:00
|
|
|
let mut b = vec![2]; //~ ERROR: variable does not need to be mutable
|
|
|
|
|
2017-09-15 03:36:14 -05:00
|
|
|
}
|
2023-04-28 12:35:40 -05:00
|
|
|
|
|
|
|
struct Arg(i32);
|
|
|
|
|
|
|
|
// Regression test for https://github.com/rust-lang/rust/issues/110849
|
|
|
|
fn write_through_reference(mut arg: &mut Arg) {
|
|
|
|
//~^ WARN: variable does not need to be mutable
|
|
|
|
arg.0 = 1
|
|
|
|
}
|