| #[warn(clippy::mixed_read_write_in_expression)] | |
| #[allow( | |
| unused_assignments, | |
| unused_variables, | |
| clippy::no_effect, | |
| dead_code, | |
| clippy::disallowed_names | |
| )] | |
| fn main() { | |
| let mut x = 0; | |
| let a = { | |
| x = 1; | |
| 1 | |
| } + x; | |
| //~^ mixed_read_write_in_expression | |
| // Example from iss#277 | |
| x += { | |
| //~^ mixed_read_write_in_expression | |
| x = 20; | |
| 2 | |
| }; | |
| // Does it work in weird places? | |
| // ...in the base for a struct expression? | |
| struct Foo { | |
| a: i32, | |
| b: i32, | |
| }; | |
| let base = Foo { a: 4, b: 5 }; | |
| let foo = Foo { | |
| a: x, | |
| //~^ mixed_read_write_in_expression | |
| ..{ | |
| x = 6; | |
| base | |
| } | |
| }; | |
| // ...inside a closure? | |
| let closure = || { | |
| let mut x = 0; | |
| x += { | |
| //~^ mixed_read_write_in_expression | |
| x = 20; | |
| 2 | |
| }; | |
| }; | |
| // ...not across a closure? | |
| let mut y = 0; | |
| let b = (y, || y = 1); | |
| // && and || evaluate left-to-right. | |
| let a = { | |
| x = 1; | |
| true | |
| } && (x == 3); | |
| let a = { | |
| x = 1; | |
| true | |
| } || (x == 3); | |
| // Make sure we don't get confused by alpha conversion. | |
| let a = { | |
| let mut x = 1; | |
| x = 2; | |
| 1 | |
| } + x; | |
| // No warning if we don't read the variable... | |
| x = { | |
| x = 20; | |
| 2 | |
| }; | |
| // ...if the assignment is in a closure... | |
| let b = { | |
| || { | |
| x = 1; | |
| }; | |
| 1 | |
| } + x; | |
| // ... or the access is under an address. | |
| let b = ( | |
| { | |
| let p = &x; | |
| 1 | |
| }, | |
| { | |
| x = 1; | |
| x | |
| }, | |
| ); | |
| // Limitation: l-values other than simple variables don't trigger | |
| // the warning. | |
| let mut tup = (0, 0); | |
| let c = { | |
| tup.0 = 1; | |
| 1 | |
| } + tup.0; | |
| // Limitation: you can get away with a read under address-of. | |
| let mut z = 0; | |
| let b = ( | |
| &{ | |
| z = x; | |
| x | |
| }, | |
| { | |
| x = 3; | |
| x | |
| }, | |
| ); | |
| } | |
| async fn issue_6925() { | |
| let _ = vec![async { true }.await, async { false }.await]; | |
| } |