@@ -70,7 +70,7 @@ use prusti_rustc_interface::{
70
70
middle:: {
71
71
mir,
72
72
mir:: { Mutability , TerminatorKind } ,
73
- ty:: { self , subst :: SubstsRef } ,
73
+ ty:: { self , GenericArgsRef } ,
74
74
} ,
75
75
span:: Span ,
76
76
target:: abi:: { FieldIdx , Integer } ,
@@ -1051,12 +1051,16 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> {
1051
1051
Some ( ( mid_g, mid_b1) )
1052
1052
} else {
1053
1053
// Cannot add loop guard to loop invariant
1054
- let fn_names: Vec < _ > = preconds. iter ( ) . filter_map ( |( name, _) | name. as_ref ( ) ) . map ( |name| {
1055
- if let Some ( rust_name) = name. strip_prefix ( "f_" ) {
1056
- return rust_name
1057
- } ;
1058
- name. strip_prefix ( "m_" ) . unwrap_or ( name)
1059
- } ) . collect ( ) ;
1054
+ let fn_names: Vec < _ > = preconds
1055
+ . iter ( )
1056
+ . filter_map ( |( name, _) | name. as_ref ( ) )
1057
+ . map ( |name| {
1058
+ if let Some ( rust_name) = name. strip_prefix ( "f_" ) {
1059
+ return rust_name;
1060
+ } ;
1061
+ name. strip_prefix ( "m_" ) . unwrap_or ( name)
1062
+ } )
1063
+ . collect ( ) ;
1060
1064
let warning_msg = if fn_names. is_empty ( ) {
1061
1065
"the loop guard was not automatically added as a `body_invariant!(...)`, consider doing this manually" . to_string ( )
1062
1066
} else {
@@ -1640,9 +1644,12 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> {
1640
1644
times,
1641
1645
ty,
1642
1646
location,
1643
- ) ?
1644
- }
1645
- mir:: Rvalue :: Cast ( mir:: CastKind :: PointerCoercion ( ty:: adjustment:: PointerCoercion :: Unsize ) , ref operand, cast_ty) => {
1647
+ ) ?,
1648
+ mir:: Rvalue :: Cast (
1649
+ mir:: CastKind :: PointerCoercion ( ty:: adjustment:: PointerCoercion :: Unsize ) ,
1650
+ ref operand,
1651
+ cast_ty,
1652
+ ) => {
1646
1653
let rhs_ty = self . mir_encoder . get_operand_ty ( operand) ;
1647
1654
if rhs_ty. is_array_ref ( ) && cast_ty. is_slice_ref ( ) {
1648
1655
trace ! ( "slice: operand={:?}, ty={:?}" , operand, cast_ty) ;
@@ -1654,8 +1661,8 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> {
1654
1661
) ) ;
1655
1662
}
1656
1663
}
1657
- mir:: Rvalue :: Cast ( mir:: CastKind :: PointerCoercion ( _) , _, _) |
1658
- mir:: Rvalue :: Cast ( mir:: CastKind :: DynStar , _, _) => {
1664
+ mir:: Rvalue :: Cast ( mir:: CastKind :: PointerCoercion ( _) , _, _)
1665
+ | mir:: Rvalue :: Cast ( mir:: CastKind :: DynStar , _, _) => {
1659
1666
return Err ( SpannedEncodingError :: unsupported (
1660
1667
"raw pointers are not supported" ,
1661
1668
span,
@@ -1830,7 +1837,11 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> {
1830
1837
( expiring, Some ( restored) , false , stmts)
1831
1838
}
1832
1839
1833
- mir:: Rvalue :: Cast ( mir:: CastKind :: PointerCoercion ( ty:: adjustment:: PointerCoercion :: Unsize ) , ref operand, ty) => {
1840
+ mir:: Rvalue :: Cast (
1841
+ mir:: CastKind :: PointerCoercion ( ty:: adjustment:: PointerCoercion :: Unsize ) ,
1842
+ ref operand,
1843
+ ty,
1844
+ ) => {
1834
1845
trace ! ( "cast: operand={:?}, ty={:?}" , operand, ty) ;
1835
1846
let place = match * operand {
1836
1847
mir:: Operand :: Move ( place) => place,
@@ -1923,11 +1934,15 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> {
1923
1934
if let Some ( stmt) = self . polonius_info ( ) . get_assignment_for_loan ( loan) ? {
1924
1935
Ok ( match stmt. kind {
1925
1936
mir:: StatementKind :: Assign ( box ( _, ref rhs) ) => match rhs {
1926
- & mir:: Rvalue :: Ref ( _, mir:: BorrowKind :: Shared , _) |
1927
- & mir:: Rvalue :: Use ( mir:: Operand :: Copy ( _) ) => false ,
1928
- & mir:: Rvalue :: Ref ( _, mir:: BorrowKind :: Mut { .. } , _) |
1929
- & mir:: Rvalue :: Use ( mir:: Operand :: Move ( _) ) => true ,
1930
- & mir:: Rvalue :: Cast ( mir:: CastKind :: PointerCoercion ( ty:: adjustment:: PointerCoercion :: Unsize ) , _, _ty) => false ,
1937
+ & mir:: Rvalue :: Ref ( _, mir:: BorrowKind :: Shared , _)
1938
+ | & mir:: Rvalue :: Use ( mir:: Operand :: Copy ( _) ) => false ,
1939
+ & mir:: Rvalue :: Ref ( _, mir:: BorrowKind :: Mut { .. } , _)
1940
+ | & mir:: Rvalue :: Use ( mir:: Operand :: Move ( _) ) => true ,
1941
+ & mir:: Rvalue :: Cast (
1942
+ mir:: CastKind :: PointerCoercion ( ty:: adjustment:: PointerCoercion :: Unsize ) ,
1943
+ _,
1944
+ _ty,
1945
+ ) => false ,
1931
1946
& mir:: Rvalue :: Use ( mir:: Operand :: Constant ( _) ) => false ,
1932
1947
x => unreachable ! ( "{:?}" , x) ,
1933
1948
} ,
@@ -3381,7 +3396,11 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> {
3381
3396
3382
3397
// TODO: weird fix for closure call substitutions, we need to
3383
3398
// prepend the identity substs of the containing method ...
3384
- substs = self . encoder . env ( ) . tcx ( ) . mk_args_from_iter ( self . substs . iter ( ) . chain ( substs) ) ;
3399
+ substs = self
3400
+ . encoder
3401
+ . env ( )
3402
+ . tcx ( )
3403
+ . mk_args_from_iter ( self . substs . iter ( ) . chain ( substs) ) ;
3385
3404
} else {
3386
3405
for ( arg, encoded_operand) in mir_args. iter ( ) . zip ( encoded_operands. iter_mut ( ) ) {
3387
3406
let arg_ty = self . mir_encoder . get_operand_ty ( arg) ;
@@ -3990,13 +4009,8 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> {
3990
4009
& self ,
3991
4010
contract : & ProcedureContract < ' tcx > ,
3992
4011
substs : GenericArgsRef < ' tcx > ,
3993
- override_spans : FxHashMap < Local , Span > // spans for fake locals
3994
- ) -> SpannedEncodingResult < (
3995
- vir:: Expr ,
3996
- Vec < vir:: Expr > ,
3997
- vir:: Expr ,
3998
- vir:: Expr ,
3999
- ) > {
4012
+ override_spans : FxHashMap < Local , Span > , // spans for fake locals
4013
+ ) -> SpannedEncodingResult < ( vir:: Expr , Vec < vir:: Expr > , vir:: Expr , vir:: Expr ) > {
4000
4014
let borrow_infos = & contract. borrow_infos ;
4001
4015
let maybe_blocked_paths = if !borrow_infos. is_empty ( ) {
4002
4016
assert_eq ! (
0 commit comments