Skip to content

Commit 51b833a

Browse files
committed
Use HybridBitSets in possible_borrower
1 parent a85e480 commit 51b833a

File tree

2 files changed

+54
-4
lines changed

2 files changed

+54
-4
lines changed

clippy_utils/src/mir/possible_borrower.rs

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,47 @@ struct PossibleBorrowerAnalysis<'b, 'tcx> {
2424
possible_origin: FxHashMap<mir::Local, HybridBitSet<mir::Local>>,
2525
}
2626

27-
#[derive(Clone, Debug, Eq, PartialEq)]
27+
#[derive(Clone, Debug)]
2828
struct PossibleBorrowerState {
29-
map: FxIndexMap<Local, BitSet<Local>>,
29+
map: FxIndexMap<Local, HybridBitSet<Local>>,
3030
domain_size: usize,
3131
}
3232

33+
// `PossibleBorrowerState`'s `PartialEq` implementation doesn't appear to be used currently.
34+
impl PartialEq for PossibleBorrowerState {
35+
fn eq(&self, other: &Self) -> bool {
36+
if self.domain_size != other.domain_size {
37+
return false;
38+
}
39+
for (borrowed, our_borrowers) in self.map.iter() {
40+
if !other
41+
.map
42+
.get(borrowed)
43+
.map_or(our_borrowers.is_empty(), |their_borrowers| {
44+
our_borrowers.iter().eq(their_borrowers.iter())
45+
})
46+
{
47+
return false;
48+
}
49+
}
50+
for (borrowed, their_borrowers) in other.map.iter() {
51+
assert!(!their_borrowers.is_empty());
52+
if !self
53+
.map
54+
.get(borrowed)
55+
.map_or(their_borrowers.is_empty(), |our_borrowers| {
56+
their_borrowers.iter().eq(our_borrowers.iter())
57+
})
58+
{
59+
return false;
60+
}
61+
}
62+
true
63+
}
64+
}
65+
66+
impl Eq for PossibleBorrowerState {}
67+
3368
impl PossibleBorrowerState {
3469
fn new(domain_size: usize) -> Self {
3570
Self {
@@ -42,7 +77,7 @@ impl PossibleBorrowerState {
4277
fn add(&mut self, borrowed: Local, borrower: Local) {
4378
self.map
4479
.entry(borrowed)
45-
.or_insert(BitSet::new_empty(self.domain_size))
80+
.or_insert_with(|| HybridBitSet::new_empty(self.domain_size))
4681
.insert(borrower);
4782
}
4883
}
@@ -64,7 +99,7 @@ impl JoinSemiLattice for PossibleBorrowerState {
6499
changed |= self
65100
.map
66101
.entry(borrowed)
67-
.or_insert(BitSet::new_empty(self.domain_size))
102+
.or_insert_with(|| HybridBitSet::new_empty(self.domain_size))
68103
.union(borrowers);
69104
}
70105
}

tests/ui/possible_borrower.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
fn meow(_s: impl AsRef<str>) {}
2+
3+
macro_rules! quad {
4+
($x:stmt) => {
5+
$x
6+
$x
7+
$x
8+
$x
9+
};
10+
}
11+
12+
fn main() {
13+
let i = 0;
14+
quad!(quad!(quad!(quad!(quad!(meow(format!("abc{i}")))))));
15+
}

0 commit comments

Comments
 (0)