]> git.lizzy.rs Git - rust.git/blob - tests/ui/swap.rs
add xor-swap lint
[rust.git] / tests / ui / swap.rs
1 // run-rustfix
2
3 #![warn(clippy::all)]
4 #![allow(
5     clippy::blacklisted_name,
6     clippy::no_effect,
7     clippy::redundant_clone,
8     redundant_semicolons,
9     unused_assignments
10 )]
11
12 struct Foo(u32);
13
14 #[derive(Clone)]
15 struct Bar {
16     a: u32,
17     b: u32,
18 }
19
20 fn field() {
21     let mut bar = Bar { a: 1, b: 2 };
22
23     let temp = bar.a;
24     bar.a = bar.b;
25     bar.b = temp;
26
27     let mut baz = vec![bar.clone(), bar.clone()];
28     let temp = baz[0].a;
29     baz[0].a = baz[1].a;
30     baz[1].a = temp;
31 }
32
33 fn array() {
34     let mut foo = [1, 2];
35     let temp = foo[0];
36     foo[0] = foo[1];
37     foo[1] = temp;
38
39     foo.swap(0, 1);
40 }
41
42 fn slice() {
43     let foo = &mut [1, 2];
44     let temp = foo[0];
45     foo[0] = foo[1];
46     foo[1] = temp;
47
48     foo.swap(0, 1);
49 }
50
51 fn unswappable_slice() {
52     let foo = &mut [vec![1, 2], vec![3, 4]];
53     let temp = foo[0][1];
54     foo[0][1] = foo[1][0];
55     foo[1][0] = temp;
56
57     // swap(foo[0][1], foo[1][0]) would fail
58 }
59
60 fn vec() {
61     let mut foo = vec![1, 2];
62     let temp = foo[0];
63     foo[0] = foo[1];
64     foo[1] = temp;
65
66     foo.swap(0, 1);
67 }
68
69 fn xor_swap_locals() {
70     // This is an xor-based swap of local variables.
71     let mut a = 0;
72     let mut b = 1;
73     a ^= b;
74     b ^= a;
75     a ^= b;
76 }
77
78 fn xor_field_swap() {
79     // This is an xor-based swap of fields in a struct.
80     let mut bar = Bar { a: 0, b: 1 };
81     bar.a ^= bar.b;
82     bar.b ^= bar.a;
83     bar.a ^= bar.b;
84 }
85
86 fn xor_slice_swap() {
87     // This is an xor-based swap of a slice
88     let foo = &mut [1, 2];
89     foo[0] ^= foo[1];
90     foo[1] ^= foo[0];
91     foo[0] ^= foo[1];
92 }
93
94 fn xor_no_swap() {
95     // This is a sequence of xor-assignment statements that doesn't result in a swap.
96     let mut a = 0;
97     let mut b = 1;
98     let mut c = 2;
99     a ^= b;
100     b ^= c;
101     a ^= c;
102     c ^= a;
103 }
104
105 fn xor_unswappable_slice() {
106     let foo = &mut [vec![1, 2], vec![3, 4]];
107     foo[0][1] ^= foo[1][0];
108     foo[1][0] ^= foo[0][0];
109     foo[0][1] ^= foo[1][0];
110 }
111
112 #[rustfmt::skip]
113 fn main() {
114     field();
115     array();
116     slice();
117     unswappable_slice();
118     vec();
119     xor_swap_locals();
120     xor_field_swap();
121     xor_slice_swap();
122     xor_no_swap();
123     xor_unswappable_slice();
124
125     let mut a = 42;
126     let mut b = 1337;
127
128     a = b;
129     b = a;
130
131     ; let t = a;
132     a = b;
133     b = t;
134
135     let mut c = Foo(42);
136
137     c.0 = a;
138     a = c.0;
139
140     ; let t = c.0;
141     c.0 = a;
142     a = t;
143 }