From 09d02c93a4e87ea0ecd719ef7bd02a9099d916d1 Mon Sep 17 00:00:00 2001 From: Vincent Lafeychine <vincent.lafeychine@proton.me> Date: Wed, 1 May 2024 00:58:41 +0200 Subject: [PATCH] clippy: Fix manual_let_else --- rr_frontend/.cargo/config.toml | 1 - .../mir_utils/split_aggregate_assignment.rs | 5 +- .../src/environment/polonius_info.rs | 103 +++++++++--------- rr_frontend/translation/src/utils.rs | 55 +++++----- 4 files changed, 77 insertions(+), 87 deletions(-) diff --git a/rr_frontend/.cargo/config.toml b/rr_frontend/.cargo/config.toml index 7f94cef4..6a261528 100644 --- a/rr_frontend/.cargo/config.toml +++ b/rr_frontend/.cargo/config.toml @@ -32,7 +32,6 @@ rustflags = [ "-Aclippy::string_lit_as_bytes", # clippy::pedantic - "-Aclippy::manual_let_else", "-Aclippy::manual_string_new", "-Aclippy::map_unwrap_or", "-Aclippy::match_same_arms", diff --git a/rr_frontend/translation/src/environment/mir_utils/split_aggregate_assignment.rs b/rr_frontend/translation/src/environment/mir_utils/split_aggregate_assignment.rs index 5f54a0db..3a3a3465 100644 --- a/rr_frontend/translation/src/environment/mir_utils/split_aggregate_assignment.rs +++ b/rr_frontend/translation/src/environment/mir_utils/split_aggregate_assignment.rs @@ -30,9 +30,8 @@ pub trait SplitAggregateAssignment<'tcx> { impl<'tcx> SplitAggregateAssignment<'tcx> for mir::Statement<'tcx> { fn split_assignment(self, tcx: ty::TyCtxt<'tcx>, mir: &mir::Body<'tcx>) -> Vec<mir::Statement<'tcx>> { - let (lhs, rhs) = match self.kind { - mir::StatementKind::Assign(box (lhs, rhs)) => (lhs, rhs), - _ => return vec![self], + let mir::StatementKind::Assign(box (lhs, rhs)) = self.kind else { + return vec![self]; }; let atomic_assignments = match rhs { diff --git a/rr_frontend/translation/src/environment/polonius_info.rs b/rr_frontend/translation/src/environment/polonius_info.rs index c7f5734c..46d15838 100644 --- a/rr_frontend/translation/src/environment/polonius_info.rs +++ b/rr_frontend/translation/src/environment/polonius_info.rs @@ -350,59 +350,58 @@ fn get_borrowed_places<'a, 'tcx: 'a>( loan_position: &HashMap<facts::Loan, mir::Location>, loan: facts::Loan, ) -> Result<Vec<&'a mir::Place<'tcx>>, PoloniusInfoError> { - let location = if let Some(location) = loan_position.get(&loan) { - location - } else { + let Some(location) = loan_position.get(&loan) else { // FIXME (Vytautas): This is likely to be wrong. debug!("Not found: {:?}", loan); return Ok(Vec::new()); }; + let mir::BasicBlockData { ref statements, .. } = mir[location.block]; if statements.len() == location.statement_index { - Ok(Vec::new()) - } else { - let statement = &statements[location.statement_index]; - match statement.kind { - mir::StatementKind::Assign(box (ref _lhs, ref rhs)) => match *rhs { - mir::Rvalue::Use(mir::Operand::Copy(ref place) | mir::Operand::Move(ref place)) - | mir::Rvalue::Ref(_, _, ref place) - | mir::Rvalue::Discriminant(ref place) => Ok(vec![place]), - - mir::Rvalue::Use(mir::Operand::Constant(_)) => Ok(Vec::new()), - - mir::Rvalue::Aggregate(_, ref operands) => Ok(operands - .iter() - .filter_map(|operand| match *operand { - mir::Operand::Copy(ref place) | mir::Operand::Move(ref place) => Some(place), - mir::Operand::Constant(_) => None, - }) - .collect()), - - // slice creation involves an unsize pointer cast like [i32; 3] -> &[i32] - mir::Rvalue::Cast( - mir::CastKind::PointerCoercion(ty::adjustment::PointerCoercion::Unsize), - ref operand, - ref ty, - ) if ty.is_slice() && !ty.is_unsafe_ptr() => { - trace!("slice: operand={:?}, ty={:?}", operand, ty); - Ok(match *operand { - mir::Operand::Copy(ref place) | mir::Operand::Move(ref place) => vec![place], - mir::Operand::Constant(_) => vec![], - }) - }, + return Ok(Vec::new()); + } - mir::Rvalue::Cast(..) => { - // all other loan-casts are unsupported - Err(PoloniusInfoError::LoanInUnsupportedStatement( - "cast statements that create loans are not supported".to_string(), - *location, - )) - }, + let statement = &statements[location.statement_index]; + match statement.kind { + mir::StatementKind::Assign(box (ref _lhs, ref rhs)) => match *rhs { + mir::Rvalue::Use(mir::Operand::Copy(ref place) | mir::Operand::Move(ref place)) + | mir::Rvalue::Ref(_, _, ref place) + | mir::Rvalue::Discriminant(ref place) => Ok(vec![place]), + + mir::Rvalue::Use(mir::Operand::Constant(_)) => Ok(Vec::new()), + + mir::Rvalue::Aggregate(_, ref operands) => Ok(operands + .iter() + .filter_map(|operand| match *operand { + mir::Operand::Copy(ref place) | mir::Operand::Move(ref place) => Some(place), + mir::Operand::Constant(_) => None, + }) + .collect()), + + // slice creation involves an unsize pointer cast like [i32; 3] -> &[i32] + mir::Rvalue::Cast( + mir::CastKind::PointerCoercion(ty::adjustment::PointerCoercion::Unsize), + ref operand, + ref ty, + ) if ty.is_slice() && !ty.is_unsafe_ptr() => { + trace!("slice: operand={:?}, ty={:?}", operand, ty); + Ok(match *operand { + mir::Operand::Copy(ref place) | mir::Operand::Move(ref place) => vec![place], + mir::Operand::Constant(_) => vec![], + }) + }, - ref x => unreachable!("{:?}", x), + mir::Rvalue::Cast(..) => { + // all other loan-casts are unsupported + Err(PoloniusInfoError::LoanInUnsupportedStatement( + "cast statements that create loans are not supported".to_string(), + *location, + )) }, + ref x => unreachable!("{:?}", x), - } + }, + ref x => unreachable!("{:?}", x), } } @@ -1105,14 +1104,14 @@ impl<'a, 'tcx: 'a> PoloniusInfo<'a, 'tcx> { // get_assignment_for_loan(L1) would be _3.1 = move _5. Using these atomic assignments, we // can simply read off the loan places as before. - let assignment = if let Some(loan_assignment) = self.get_assignment_for_loan(*loan)? { - loan_assignment - } else { + let Some(assignment) = self.get_assignment_for_loan(*loan)? else { return Ok(None); }; + let (dest, source) = assignment.as_assign().unwrap(); let source = source.clone(); let location = self.loan_position[loan]; + Ok(Some(LoanPlaces { dest, source, @@ -1126,17 +1125,15 @@ impl<'a, 'tcx: 'a> PoloniusInfo<'a, 'tcx> { &self, loan: facts::Loan, ) -> Result<Option<mir::Statement<'tcx>>, PlaceRegionsError> { - let &location = if let Some(loc) = self.loan_position.get(&loan) { - loc - } else { + let Some(&location) = self.loan_position.get(&loan) else { return Ok(None); }; - let stmt = if let Some(s) = self.mir.statement_at(location) { - s.clone() - } else { + + let Some(stmt) = self.mir.statement_at(location) else { return Ok(None); }; - let mut assignments: Vec<_> = stmt.split_assignment(self.tcx, self.mir); + + let mut assignments: Vec<_> = stmt.clone().split_assignment(self.tcx, self.mir); // TODO: This is a workaround. It seems like some local variables don't have a local // variable declaration in the MIR. One example of this can be observed in the diff --git a/rr_frontend/translation/src/utils.rs b/rr_frontend/translation/src/utils.rs index a6fc3378..70559df2 100644 --- a/rr_frontend/translation/src/utils.rs +++ b/rr_frontend/translation/src/utils.rs @@ -95,40 +95,35 @@ pub enum FlatType { impl FlatType { /// Try to convert a flat type to a type. pub fn to_type<'tcx>(&self, tcx: ty::TyCtxt<'tcx>) -> Option<ty::Ty<'tcx>> { - match self { - Self::Adt(path_with_args) => { - let (did, flat_args) = path_with_args.to_item(tcx)?; - let ty: ty::EarlyBinder<ty::Ty<'tcx>> = tcx.type_of(did); + let Self::Adt(path_with_args) = self; + let (did, flat_args) = path_with_args.to_item(tcx)?; - let args = if let ty::TyKind::Adt(_, adt_args) = ty.skip_binder().kind() { - adt_args - } else { - return None; - }; - - // build substitution - let mut substs = Vec::new(); - for (ty_arg, flat_arg) in args.iter().zip(flat_args.into_iter()) { - match ty_arg.unpack() { - ty::GenericArgKind::Type(_ty) => { - if let Some(flat_arg) = flat_arg { - substs.push(flat_arg); - } - }, - _ => { - substs.push(ty_arg); - }, + let ty: ty::EarlyBinder<ty::Ty<'tcx>> = tcx.type_of(did); + let ty::TyKind::Adt(_, args) = ty.skip_binder().kind() else { + return None; + }; + + // build substitution + let mut substs = Vec::new(); + for (ty_arg, flat_arg) in args.iter().zip(flat_args.into_iter()) { + match ty_arg.unpack() { + ty::GenericArgKind::Type(_) => { + if let Some(flat_arg) = flat_arg { + substs.push(flat_arg); } - } + }, + _ => { + substs.push(ty_arg); + }, + } + } - // substitute - info!("substituting {:?} with {:?}", ty, substs); - let subst_ty = - if substs.is_empty() { ty.instantiate_identity() } else { ty.instantiate(tcx, &substs) }; + // substitute + info!("substituting {:?} with {:?}", ty, substs); + let subst_ty = + if substs.is_empty() { ty.instantiate_identity() } else { ty.instantiate(tcx, &substs) }; - Some(subst_ty) - }, - } + Some(subst_ty) } } -- GitLab