From 574e8d895810d5ee1417983a13aa06c360eea0cb Mon Sep 17 00:00:00 2001 From: Yann Bolliger Date: Tue, 1 Jun 2021 01:14:08 +0200 Subject: [PATCH] Add is mut ref function. --- stainless_extraction/src/bindings.rs | 2 +- stainless_extraction/src/expr/mod.rs | 3 +-- stainless_extraction/src/lib.rs | 13 ++++++------- stainless_extraction/src/ty.rs | 4 ++++ 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/stainless_extraction/src/bindings.rs b/stainless_extraction/src/bindings.rs index 38041adb..edeecfcb 100644 --- a/stainless_extraction/src/bindings.rs +++ b/stainless_extraction/src/bindings.rs @@ -209,7 +209,7 @@ impl<'bxtor, 'a, 'l, 'tcx> BindingsCollector<'bxtor, 'a, 'l, 'tcx> { } } -impl<'bxtor, 'a, 'l, 'tcx> Visitor<'tcx> for BindingsCollector<'bxtor, 'a, 'l, 'tcx> { +impl<'tcx> Visitor<'tcx> for BindingsCollector<'_, '_, '_, 'tcx> { type Map = rustc_middle::hir::map::Map<'tcx>; fn nested_visit_map(&mut self) -> NestedVisitorMap { diff --git a/stainless_extraction/src/expr/mod.rs b/stainless_extraction/src/expr/mod.rs index f88d9415..059d4e47 100644 --- a/stainless_extraction/src/expr/mod.rs +++ b/stainless_extraction/src/expr/mod.rs @@ -1,7 +1,6 @@ use std::convert::TryFrom; use literal::Literal; -use rustc_middle::mir::Mutability; use rustc_middle::ty::{subst::SubstsRef, Ty, TyKind}; use rustc_mir_build::thir::{BlockSafety, Expr, ExprKind, FruInfo, Stmt, StmtKind}; @@ -362,7 +361,7 @@ impl<'a, 'l, 'tcx> BodyExtractor<'a, 'l, 'tcx> { let e = self.extract_expr(expr); // If this is a mutable reference, we DON'T freshCopy - if let Some(Mutability::Mut) = expr.ty.ref_mutability() { + if is_mut_ref(expr.ty) { e } else { let tpe = self.base.extract_ty(expr.ty, &self.txtcx, expr.span); diff --git a/stainless_extraction/src/lib.rs b/stainless_extraction/src/lib.rs index 73f176b8..aaec9f09 100644 --- a/stainless_extraction/src/lib.rs +++ b/stainless_extraction/src/lib.rs @@ -34,7 +34,7 @@ use bindings::DefContext; use fns::TypeClassKey; use stainless_data::ast::Type; use std_items::{CrateItem, StdItem, StdItems}; -use ty::{Generics, TyExtractionCtxt}; +use ty::{is_mut_ref, Generics, TyExtractionCtxt}; use utils::UniqueCounter; mod bindings; @@ -432,12 +432,11 @@ impl<'a, 'l, 'tcx> BodyExtractor<'a, 'l, 'tcx> { /// Checks whether the function has any parameters passed by mutable /// reference. fn has_mut_ref(&self) -> bool { - self.body.params.iter().any(|p| { - matches!( - self.tables.node_type(p.hir_id).ref_mutability(), - Some(Mutability::Mut) - ) - }) + self + .body + .params + .iter() + .any(|p| is_mut_ref(self.tables.node_type(p.hir_id))) } fn extract_body_expr(&mut self, ldi: LocalDefId) -> st::Expr<'l> { diff --git a/stainless_extraction/src/ty.rs b/stainless_extraction/src/ty.rs index 7e1a75a0..521a5793 100644 --- a/stainless_extraction/src/ty.rs +++ b/stainless_extraction/src/ty.rs @@ -67,6 +67,10 @@ pub fn uint_bit_width(int_ty: &UintTy, tcx: TyCtxt<'_>) -> u64 { int_ty.bit_width().unwrap_or_else(|| pointer_bit_width(tcx)) } +pub fn is_mut_ref<'tcx>(ty: Ty<'tcx>) -> bool { + matches!(ty.ref_mutability(), Some(Mutability::Mut)) +} + impl<'l, 'tcx> BaseExtractor<'l, 'tcx> { pub(super) fn extract_ty( &mut self,