@@ -853,6 +853,16 @@ fn return_to_ivl(expr: Option<&Expr>, span: &Span, method_context: &MethodContex
853
853
854
854
fn loop_to_ivl ( invariants : & Vec < Expr > , variant : & Option < Expr > , cases : & Cases , method_context : & MethodContext ) -> Result < IVLCmd , Error > {
855
855
let mut result = IVLCmd :: assert ( & Expr :: new_typed ( ExprKind :: Bool ( true ) , Type :: Bool ) , "Please don't fail!" ) ;
856
+
857
+ match variant {
858
+ Some ( variant_expr) => {
859
+ let mut variant_entry_assertion = IVLCmd :: assert ( & Expr :: op ( variant_expr, Op :: Ge , & Expr :: num ( 0 ) ) , "Loop variant might not be non-negative on entry" ) ;
860
+ variant_entry_assertion. span = variant_expr. span ;
861
+ result = result. seq ( & variant_entry_assertion) ;
862
+ }
863
+ _ => { }
864
+ }
865
+
856
866
let mut loop_invariants_assertions: Vec < ( Expr , Expr ) > = Vec :: new ( ) ;
857
867
for invariant in invariants {
858
868
let expr_without_broke = replace_broke_in_expression ( invariant, false ) ;
@@ -878,9 +888,7 @@ fn loop_to_ivl(invariants: &Vec<Expr>, variant: &Option<Expr>, cases: &Cases, me
878
888
Some ( variant_expr) => {
879
889
let variant_name = get_fresh_var_name ( & Ident ( String :: from ( "variant" ) ) ) ;
880
890
let variant_assignment = IVLCmd :: assign ( & Name { span : variant_expr. span , ident : variant_name. clone ( ) } , variant_expr) ;
881
- let mut variant_base = Expr :: new_typed ( ExprKind :: Infix ( Box :: new ( Expr :: ident ( & variant_name. clone ( ) , & Type :: Int ) ) , Op :: Ge , Box :: new ( Expr :: num ( 0 ) ) ) , Type :: Bool ) ;
882
- variant_base. span = variant_expr. span . clone ( ) ;
883
- result = result. seq ( & variant_assignment) . seq ( & IVLCmd :: assert ( & variant_base, "Loop variant might not be non-negative on entry" ) ) ;
891
+ result = result. seq ( & variant_assignment) ;
884
892
& Expr :: new_typed ( ExprKind :: Infix ( Box :: new ( variant_expr. clone ( ) ) , Op :: Lt , Box :: new ( Expr :: ident ( & variant_name, & Type :: Int ) ) ) , Type :: Bool )
885
893
} ,
886
894
_ => & Expr :: new_typed ( ExprKind :: Bool ( true ) , Type :: Bool )
0 commit comments