[map_entry]: call the visitor on the local's else block

This commit is contained in:
y21 2024-03-16 14:15:45 +01:00
parent 660b058ba2
commit 4e72ca31b5
4 changed files with 46 additions and 2 deletions

View File

@ -358,7 +358,7 @@ struct InsertSearcher<'cx, 'tcx> {
can_use_entry: bool, can_use_entry: bool,
/// Whether this expression is the final expression in this code path. This may be a statement. /// Whether this expression is the final expression in this code path. This may be a statement.
in_tail_pos: bool, in_tail_pos: bool,
// Is this expression a single insert. A slightly better suggestion can be made in this case. /// Is this expression a single insert. A slightly better suggestion can be made in this case.
is_single_insert: bool, is_single_insert: bool,
/// If the visitor has seen the map being used. /// If the visitor has seen the map being used.
is_map_used: bool, is_map_used: bool,
@ -431,6 +431,9 @@ fn visit_stmt(&mut self, stmt: &'tcx Stmt<'_>) {
self.is_single_insert = false; self.is_single_insert = false;
self.visit_expr(e); self.visit_expr(e);
} }
if let Some(els) = &l.els {
self.visit_block(els);
}
}, },
StmtKind::Item(_) => { StmtKind::Item(_) => {
self.allow_insert_closure &= !self.in_tail_pos; self.allow_insert_closure &= !self.in_tail_pos;

View File

@ -176,4 +176,14 @@ pub fn issue_11935() {
} }
} }
fn issue12489(map: &mut HashMap<u64, u64>) -> Option<()> {
if let std::collections::hash_map::Entry::Vacant(e) = map.entry(1) {
let Some(1) = Some(2) else {
return None;
};
e.insert(42);
}
Some(())
}
fn main() {} fn main() {}

View File

@ -180,4 +180,14 @@ pub fn issue_11935() {
} }
} }
fn issue12489(map: &mut HashMap<u64, u64>) -> Option<()> {
if !map.contains_key(&1) {
let Some(1) = Some(2) else {
return None;
};
map.insert(1, 42);
}
Some(())
}
fn main() {} fn main() {}

View File

@ -214,5 +214,26 @@ LL + v
LL + }); LL + });
| |
error: aborting due to 10 previous errors error: usage of `contains_key` followed by `insert` on a `HashMap`
--> tests/ui/entry.rs:184:5
|
LL | / if !map.contains_key(&1) {
LL | | let Some(1) = Some(2) else {
LL | | return None;
LL | | };
LL | | map.insert(1, 42);
LL | | }
| |_____^
|
help: try
|
LL ~ if let std::collections::hash_map::Entry::Vacant(e) = map.entry(1) {
LL + let Some(1) = Some(2) else {
LL + return None;
LL + };
LL + e.insert(42);
LL + }
|
error: aborting due to 11 previous errors