|
1 | 1 | use std::fmt::{self, Display};
|
2 | 2 | use std::iter;
|
3 | 3 |
|
| 4 | +use rustc_data_structures::fx::IndexEntry; |
4 | 5 | use rustc_errors::Diagnostic;
|
5 | 6 | use rustc_hir as hir;
|
6 | 7 | use rustc_hir::def::{DefKind, Res};
|
@@ -247,25 +248,28 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
|
247 | 248 |
|
248 | 249 | assert!(self.regioncx.universal_regions().is_universal_region(fr));
|
249 | 250 |
|
250 |
| - if let Some(value) = self.region_names.try_borrow_mut().unwrap().get(&fr) { |
251 |
| - return Some(value.clone()); |
252 |
| - } |
| 251 | + match self.region_names.borrow_mut().entry(fr) { |
| 252 | + IndexEntry::Occupied(precomputed_name) => Some(precomputed_name.get().clone()), |
| 253 | + IndexEntry::Vacant(slot) => { |
| 254 | + let new_name = self |
| 255 | + .give_name_from_error_region(fr) |
| 256 | + .or_else(|| self.give_name_if_anonymous_region_appears_in_arguments(fr)) |
| 257 | + .or_else(|| self.give_name_if_anonymous_region_appears_in_upvars(fr)) |
| 258 | + .or_else(|| self.give_name_if_anonymous_region_appears_in_output(fr)) |
| 259 | + .or_else(|| self.give_name_if_anonymous_region_appears_in_yield_ty(fr)) |
| 260 | + .or_else(|| self.give_name_if_anonymous_region_appears_in_impl_signature(fr)) |
| 261 | + .or_else(|| { |
| 262 | + self.give_name_if_anonymous_region_appears_in_arg_position_impl_trait(fr) |
| 263 | + }); |
| 264 | + |
| 265 | + if let Some(new_name) = &new_name { |
| 266 | + slot.insert(new_name.clone()); |
| 267 | + } |
| 268 | + debug!("give_region_a_name: gave name {:?}", new_name); |
253 | 269 |
|
254 |
| - let value = self |
255 |
| - .give_name_from_error_region(fr) |
256 |
| - .or_else(|| self.give_name_if_anonymous_region_appears_in_arguments(fr)) |
257 |
| - .or_else(|| self.give_name_if_anonymous_region_appears_in_upvars(fr)) |
258 |
| - .or_else(|| self.give_name_if_anonymous_region_appears_in_output(fr)) |
259 |
| - .or_else(|| self.give_name_if_anonymous_region_appears_in_yield_ty(fr)) |
260 |
| - .or_else(|| self.give_name_if_anonymous_region_appears_in_impl_signature(fr)) |
261 |
| - .or_else(|| self.give_name_if_anonymous_region_appears_in_arg_position_impl_trait(fr)); |
262 |
| - |
263 |
| - if let Some(value) = &value { |
264 |
| - self.region_names.try_borrow_mut().unwrap().insert(fr, value.clone()); |
| 270 | + new_name |
| 271 | + } |
265 | 272 | }
|
266 |
| - |
267 |
| - debug!("give_region_a_name: gave name {:?}", value); |
268 |
| - value |
269 | 273 | }
|
270 | 274 |
|
271 | 275 | /// Checks for the case where `fr` maps to something that the
|
|
0 commit comments