diff options
-rw-r--r-- | tests/misc/NoNestedBorrows.fst | 526 | ||||
-rw-r--r-- | tests/misc/Paper.fst | 140 |
2 files changed, 666 insertions, 0 deletions
diff --git a/tests/misc/NoNestedBorrows.fst b/tests/misc/NoNestedBorrows.fst new file mode 100644 index 00000000..505dfc73 --- /dev/null +++ b/tests/misc/NoNestedBorrows.fst @@ -0,0 +1,526 @@ +(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *) +(** [no_nested_borrows] *) +module NoNestedBorrows +open Primitives + +#set-options "--z3rlimit 50 --fuel 0 --ifuel 1" + +(** [no_nested_borrows::Pair] *) +type pair_t (t1 t2 : Type0) = { pair_x : t1; pair_y : t2; } + +(** [no_nested_borrows::List] *) +type list_t (t : Type0) = +| ListCons : t -> list_t t -> list_t t +| ListNil : list_t t + +(** [no_nested_borrows::One] *) +type one_t (t1 : Type0) = | OneOne : t1 -> one_t t1 + +(** [no_nested_borrows::EmptyEnum] *) +type empty_enum_t = | EmptyEnumEmpty : empty_enum_t + +(** [no_nested_borrows::Enum] *) +type enum_t = | EnumVariant1 : enum_t | EnumVariant2 : enum_t + +(** [no_nested_borrows::EmptyStruct] *) +type empty_struct_t = unit + +(** [no_nested_borrows::Sum] *) +type sum_t (t1 t2 : Type0) = +| SumLeft : t1 -> sum_t t1 t2 +| SumRight : t2 -> sum_t t1 t2 + +(** [no_nested_borrows::add_test] *) +let add_test_fwd (x : u32) (y : u32) : result u32 = + begin match u32_add x y with | Fail -> Fail | Return i -> Return i end + +(** [no_nested_borrows::subs_test] *) +let subs_test_fwd (x : u32) (y : u32) : result u32 = + begin match u32_sub x y with | Fail -> Fail | Return i -> Return i end + +(** [no_nested_borrows::div_test] *) +let div_test_fwd (x : u32) (y : u32) : result u32 = + begin match u32_div x y with | Fail -> Fail | Return i -> Return i end + +(** [no_nested_borrows::rem_test] *) +let rem_test_fwd (x : u32) (y : u32) : result u32 = + begin match u32_rem x y with | Fail -> Fail | Return i -> Return i end + +(** [no_nested_borrows::test2] *) +let test2_fwd : result unit = Return () + +(** Unit test for [no_nested_borrows::test2] *) +let _ = assert_norm (test2_fwd = Return ()) + +(** [no_nested_borrows::get_max] *) +let get_max_fwd (x : u32) (y : u32) : result u32 = + if x >= y then Return x else Return y + +(** [no_nested_borrows::test3] *) +let test3_fwd : result unit = + begin match get_max_fwd 4 3 with + | Fail -> Fail + | Return i -> + begin match get_max_fwd 10 11 with + | Fail -> Fail + | Return i0 -> + begin match u32_add i i0 with + | Fail -> Fail + | Return z -> if not (z = 15) then Fail else Return () + end + end + end + +(** Unit test for [no_nested_borrows::test3] *) +let _ = assert_norm (test3_fwd = Return ()) + +(** [no_nested_borrows::test_neg] *) +let test_neg_fwd (x : i32) : result i32 = + if x = -2147483648 + then Fail + else begin match i32_neg x with | Fail -> Fail | Return i -> Return i end + +(** [no_nested_borrows::test_neg1] *) +let test_neg1_fwd : result unit = Return () + +(** Unit test for [no_nested_borrows::test_neg1] *) +let _ = assert_norm (test_neg1_fwd = Return ()) + +(** [no_nested_borrows::refs_test1] *) +let refs_test1_fwd : result unit = if not (1 = 1) then Fail else Return () + +(** Unit test for [no_nested_borrows::refs_test1] *) +let _ = assert_norm (refs_test1_fwd = Return ()) + +(** [no_nested_borrows::refs_test2] *) +let refs_test2_fwd : result unit = + if not (2 = 2) + then Fail + else + if not (0 = 0) + then Fail + else if not (2 = 2) then Fail else if not (2 = 2) then Fail else Return () + +(** Unit test for [no_nested_borrows::refs_test2] *) +let _ = assert_norm (refs_test2_fwd = Return ()) + +(** [no_nested_borrows::test_list1] *) +let test_list1_fwd : result unit = Return () + +(** Unit test for [no_nested_borrows::test_list1] *) +let _ = assert_norm (test_list1_fwd = Return ()) + +(** [no_nested_borrows::test_box1] *) +let test_box1_fwd : result unit = + let i = 1 in let i0 = i in if not (i0 = 1) then Fail else Return () + +(** Unit test for [no_nested_borrows::test_box1] *) +let _ = assert_norm (test_box1_fwd = Return ()) + +(** [no_nested_borrows::copy_int] *) +let copy_int_fwd (x : i32) : result i32 = Return x + +(** [no_nested_borrows::test_unreachable] *) +let test_unreachable_fwd (b : bool) : result unit = + if b then Fail else Return () + +(** [no_nested_borrows::test_panic] *) +let test_panic_fwd (b : bool) : result unit = if b then Fail else Return () + +(** [no_nested_borrows::test_copy_int] *) +let test_copy_int_fwd : result unit = + begin match copy_int_fwd 0 with + | Fail -> Fail + | Return i -> if not (0 = i) then Fail else Return () + end + +(** Unit test for [no_nested_borrows::test_copy_int] *) +let _ = assert_norm (test_copy_int_fwd = Return ()) + +(** [no_nested_borrows::is_cons] *) +let is_cons_fwd (t : Type0) (l : list_t t) : result bool = + begin match l with + | ListCons x l0 -> Return true + | ListNil -> Return false + end + +(** [no_nested_borrows::test_is_cons] *) +let test_is_cons_fwd : result unit = + let l = ListNil in + begin match is_cons_fwd i32 (ListCons 0 l) with + | Fail -> Fail + | Return b -> if not b then Fail else Return () + end + +(** Unit test for [no_nested_borrows::test_is_cons] *) +let _ = assert_norm (test_is_cons_fwd = Return ()) + +(** [no_nested_borrows::split_list] *) +let split_list_fwd (t : Type0) (l : list_t t) : result (t & (list_t t)) = + begin match l with + | ListCons hd tl -> let l0 = tl in Return (hd, l0) + | ListNil -> Fail + end + +(** [no_nested_borrows::test_split_list] *) +let test_split_list_fwd : result unit = + let l = ListNil in + begin match split_list_fwd i32 (ListCons 0 l) with + | Fail -> Fail + | Return p -> let (hd, _) = p in if not (hd = 0) then Fail else Return () + end + +(** Unit test for [no_nested_borrows::test_split_list] *) +let _ = assert_norm (test_split_list_fwd = Return ()) + +(** [no_nested_borrows::get_elem] *) +let get_elem_fwd (t : Type0) (b : bool) (x : t) (y : t) : result t = + let x0 = y in let x1 = x in if b then Return x1 else Return x0 + +(** [no_nested_borrows::get_elem] *) +let get_elem_back + (t : Type0) (b : bool) (x : t) (y : t) (ret : t) : result (t & t) = + if b + then let x0 = ret in let y0 = y in Return (x0, y0) + else let x0 = x in let y0 = ret in Return (x0, y0) + +(** [no_nested_borrows::get_elem_test] *) +let get_elem_test_fwd : result unit = + begin match get_elem_fwd i32 true 0 0 with + | Fail -> Fail + | Return i -> + begin match i32_add i 1 with + | Fail -> Fail + | Return z -> + if not (z = 1) + then Fail + else + begin match get_elem_back i32 true 0 0 z with + | Fail -> Fail + | Return (i0, i1) -> + if not (i0 = 1) + then Fail + else if not (i1 = 0) then Fail else Return () + end + end + end + +(** Unit test for [no_nested_borrows::get_elem_test] *) +let _ = assert_norm (get_elem_test_fwd = Return ()) + +(** [no_nested_borrows::test_char] *) +let test_char_fwd : result char = Return 'a' + +(** [no_nested_borrows::Tree] *) +type tree_t (t : Type0) = +| TreeLeaf : t -> tree_t t +| TreeNode : t -> node_elem_t t -> tree_t t -> tree_t t + +(** [no_nested_borrows::NodeElem] *) +and node_elem_t (t : Type0) = +| NodeElemCons : tree_t t -> node_elem_t t -> node_elem_t t +| NodeElemNil : node_elem_t t + +(** [no_nested_borrows::even] *) +let rec even_fwd (x : u32) : result bool = + begin match x with + | 0 -> Return true + | _ -> + begin match u32_sub x 1 with + | Fail -> Fail + | Return i -> + begin match odd_fwd i with | Fail -> Fail | Return b -> Return b end + end + end + +(** [no_nested_borrows::odd] *) +and odd_fwd (x : u32) : result bool = + begin match x with + | 0 -> Return false + | _ -> + begin match u32_sub x 1 with + | Fail -> Fail + | Return i -> + begin match even_fwd i with | Fail -> Fail | Return b -> Return b end + end + end + +(** [no_nested_borrows::test_even_odd] *) +let test_even_odd_fwd : result unit = + begin match even_fwd 0 with + | Fail -> Fail + | Return b -> + if not b + then Fail + else + begin match even_fwd 4 with + | Fail -> Fail + | Return b0 -> + if not b0 + then Fail + else + begin match odd_fwd 1 with + | Fail -> Fail + | Return b1 -> + if not b1 + then Fail + else + begin match odd_fwd 5 with + | Fail -> Fail + | Return b2 -> if not b2 then Fail else Return () + end + end + end + end + +(** Unit test for [no_nested_borrows::test_even_odd] *) +let _ = assert_norm (test_even_odd_fwd = Return ()) + +(** [no_nested_borrows::list_length] *) +let rec list_length_fwd (t : Type0) (l : list_t t) : result u32 = + begin match l with + | ListCons x l1 -> + begin match list_length_fwd t l1 with + | Fail -> Fail + | Return i -> + begin match u32_add 1 i with | Fail -> Fail | Return i0 -> Return i0 end + end + | ListNil -> Return 0 + end + +(** [no_nested_borrows::list_nth_shared] *) +let rec list_nth_shared_fwd (t : Type0) (l : list_t t) (i : u32) : result t = + begin match l with + | ListCons x tl -> + begin match i with + | 0 -> Return x + | _ -> + begin match u32_sub i 1 with + | Fail -> Fail + | Return i0 -> + begin match list_nth_shared_fwd t tl i0 with + | Fail -> Fail + | Return x0 -> let x1 = x0 in Return x1 + end + end + end + | ListNil -> Fail + end + +(** [no_nested_borrows::list_nth_mut] *) +let rec list_nth_mut_fwd (t : Type0) (l : list_t t) (i : u32) : result t = + begin match l with + | ListCons x tl -> + begin match i with + | 0 -> Return x + | _ -> + begin match u32_sub i 1 with + | Fail -> Fail + | Return i0 -> + begin match list_nth_mut_fwd t tl i0 with + | Fail -> Fail + | Return x0 -> let x1 = x0 in Return x1 + end + end + end + | ListNil -> Fail + end + +(** [no_nested_borrows::list_nth_mut] *) +let rec list_nth_mut_back + (t : Type0) (l : list_t t) (i : u32) (ret : t) : result (list_t t) = + begin match l with + | ListCons x tl -> + begin match i with + | 0 -> let x0 = ret in let l0 = ListCons x0 tl in Return l0 + | _ -> + begin match u32_sub i 1 with + | Fail -> Fail + | Return i0 -> + begin match list_nth_mut_back t tl i0 ret with + | Fail -> Fail + | Return l0 -> let l1 = ListCons x l0 in Return l1 + end + end + end + | ListNil -> Fail + end + +(** [no_nested_borrows::test_list_functions] *) +let test_list_functions_fwd : result unit = + let l = ListNil in + let l0 = ListCons 2 l in + let l1 = ListCons 1 l0 in + begin match list_length_fwd i32 (ListCons 0 l1) with + | Fail -> Fail + | Return i -> + if not (i = 3) + then Fail + else + begin match list_nth_shared_fwd i32 (ListCons 0 l1) 0 with + | Fail -> Fail + | Return i0 -> + if not (i0 = 0) + then Fail + else + begin match list_nth_shared_fwd i32 (ListCons 0 l1) 1 with + | Fail -> Fail + | Return i1 -> + if not (i1 = 1) + then Fail + else + begin match list_nth_shared_fwd i32 (ListCons 0 l1) 2 with + | Fail -> Fail + | Return i2 -> + if not (i2 = 2) + then Fail + else + begin match list_nth_mut_back i32 (ListCons 0 l1) 1 3 with + | Fail -> Fail + | Return l2 -> + begin match list_nth_shared_fwd i32 l2 0 with + | Fail -> Fail + | Return i3 -> + if not (i3 = 0) + then Fail + else + begin match list_nth_shared_fwd i32 l2 1 with + | Fail -> Fail + | Return i4 -> + if not (i4 = 3) + then Fail + else + begin match list_nth_shared_fwd i32 l2 2 with + | Fail -> Fail + | Return i5 -> + if not (i5 = 2) then Fail else Return () + end + end + end + end + end + end + end + end + +(** Unit test for [no_nested_borrows::test_list_functions] *) +let _ = assert_norm (test_list_functions_fwd = Return ()) + +(** [no_nested_borrows::id_mut_pair1] *) +let id_mut_pair1_fwd (t1 t2 : Type0) (x : t1) (y : t2) : result (t1 & t2) = + let x0 = y in let x1 = x in Return (x1, x0) + +(** [no_nested_borrows::id_mut_pair1] *) +let id_mut_pair1_back + (t1 t2 : Type0) (x : t1) (y : t2) (ret : (t1 & t2)) : result (t1 & t2) = + let (x0, x1) = ret in let x2 = x0 in let y0 = x1 in Return (x2, y0) + +(** [no_nested_borrows::id_mut_pair2] *) +let id_mut_pair2_fwd (t1 t2 : Type0) (p : (t1 & t2)) : result (t1 & t2) = + let (x, x0) = p in let x1 = x in let x2 = x0 in Return (x1, x2) + +(** [no_nested_borrows::id_mut_pair2] *) +let id_mut_pair2_back + (t1 t2 : Type0) (p : (t1 & t2)) (ret : (t1 & t2)) : result (t1 & t2) = + let (x, x0) = ret in let p0 = (x, x0) in Return p0 + +(** [no_nested_borrows::id_mut_pair3] *) +let id_mut_pair3_fwd (t1 t2 : Type0) (x : t1) (y : t2) : result (t1 & t2) = + let x0 = y in let x1 = x in Return (x1, x0) + +(** [no_nested_borrows::id_mut_pair3] *) +let id_mut_pair3_back'a + (t1 t2 : Type0) (x : t1) (y : t2) (ret : t1) : result t1 = + let x0 = ret in Return x0 + +(** [no_nested_borrows::id_mut_pair3] *) +let id_mut_pair3_back'b + (t1 t2 : Type0) (x : t1) (y : t2) (ret : t2) : result t2 = + let y0 = ret in Return y0 + +(** [no_nested_borrows::id_mut_pair4] *) +let id_mut_pair4_fwd (t1 t2 : Type0) (p : (t1 & t2)) : result (t1 & t2) = + let (x, x0) = p in let x1 = x in let x2 = x0 in Return (x1, x2) + +(** [no_nested_borrows::id_mut_pair4] *) +let id_mut_pair4_back'a + (t1 t2 : Type0) (p : (t1 & t2)) (ret : t1) : result t1 = + let p0 = ret in Return p0 + +(** [no_nested_borrows::id_mut_pair4] *) +let id_mut_pair4_back'b + (t1 t2 : Type0) (p : (t1 & t2)) (ret : t2) : result t2 = + let p0 = ret in Return p0 + +(** [no_nested_borrows::StructWithTuple] *) +type struct_with_tuple_t (t1 t2 : Type0) = { struct_with_tuple_p : (t1 & t2); } + +(** [no_nested_borrows::new_tuple1] *) +let new_tuple1_fwd : result (struct_with_tuple_t u32 u32) = + Return (Mkstruct_with_tuple_t (1, 2)) + +(** [no_nested_borrows::new_tuple2] *) +let new_tuple2_fwd : result (struct_with_tuple_t i16 i16) = + Return (Mkstruct_with_tuple_t (1, 2)) + +(** [no_nested_borrows::new_tuple3] *) +let new_tuple3_fwd : result (struct_with_tuple_t u64 i64) = + Return (Mkstruct_with_tuple_t (1, 2)) + +(** [no_nested_borrows::StructWithPair] *) +type struct_with_pair_t (t1 t2 : Type0) = +{ + struct_with_pair_p : pair_t t1 t2; +} + +(** [no_nested_borrows::new_pair1] *) +let new_pair1_fwd : result (struct_with_pair_t u32 u32) = + Return (Mkstruct_with_pair_t (Mkpair_t 1 2)) + +(** [no_nested_borrows::test_constants] *) +let test_constants_fwd : result unit = + begin match new_tuple1_fwd with + | Fail -> Fail + | Return s -> + let (i, _) = s.struct_with_tuple_p in + if not (i = 1) + then Fail + else + begin match new_tuple2_fwd with + | Fail -> Fail + | Return s0 -> + let (i0, _) = s0.struct_with_tuple_p in + if not (i0 = 1) + then Fail + else + begin match new_tuple3_fwd with + | Fail -> Fail + | Return s1 -> + let (i1, _) = s1.struct_with_tuple_p in + if not (i1 = 1) + then Fail + else + begin match new_pair1_fwd with + | Fail -> Fail + | Return s2 -> + let p = s2.struct_with_pair_p in + if not (p.pair_x = 1) then Fail else Return () + end + end + end + end + +(** Unit test for [no_nested_borrows::test_constants] *) +let _ = assert_norm (test_constants_fwd = Return ()) + +(** [no_nested_borrows::test_weird_borrows1] *) +let test_weird_borrows1_fwd : result unit = Return () + +(** Unit test for [no_nested_borrows::test_weird_borrows1] *) +let _ = assert_norm (test_weird_borrows1_fwd = Return ()) + +(** [no_nested_borrows::test_mem_replace] *) +let test_mem_replace_fwd_back (px : u32) : result u32 = + let i = mem_replace_fwd u32 px 1 in + if not (i = 0) then Fail else let px0 = 2 in Return px0 + diff --git a/tests/misc/Paper.fst b/tests/misc/Paper.fst new file mode 100644 index 00000000..1ab42726 --- /dev/null +++ b/tests/misc/Paper.fst @@ -0,0 +1,140 @@ +(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *) +(** [paper] *) +module Paper +open Primitives + +#set-options "--z3rlimit 50 --fuel 0 --ifuel 1" + +(** [paper::ref_incr] *) +let ref_incr_fwd_back (x : i32) : result i32 = + begin match i32_add x 1 with + | Fail -> Fail + | Return x0 -> let x1 = x0 in Return x1 + end + +(** [paper::test_incr] *) +let test_incr_fwd : result unit = + begin match ref_incr_fwd_back 0 with + | Fail -> Fail + | Return i -> if not (i = 1) then Fail else Return () + end + +(** Unit test for [paper::test_incr] *) +let _ = assert_norm (test_incr_fwd = Return ()) + +(** [paper::choose] *) +let choose_fwd (t : Type0) (b : bool) (x : t) (y : t) : result t = + let x0 = y in let x1 = x in if b then Return x1 else Return x0 + +(** [paper::choose] *) +let choose_back + (t : Type0) (b : bool) (x : t) (y : t) (ret : t) : result (t & t) = + if b + then let x0 = ret in let y0 = y in Return (x0, y0) + else let x0 = x in let y0 = ret in Return (x0, y0) + +(** [paper::test_choose] *) +let test_choose_fwd : result unit = + begin match choose_fwd i32 true 0 0 with + | Fail -> Fail + | Return i -> + begin match i32_add i 1 with + | Fail -> Fail + | Return z -> + if not (z = 1) + then Fail + else + begin match choose_back i32 true 0 0 z with + | Fail -> Fail + | Return (i0, i1) -> + if not (i0 = 1) + then Fail + else if not (i1 = 0) then Fail else Return () + end + end + end + +(** Unit test for [paper::test_choose] *) +let _ = assert_norm (test_choose_fwd = Return ()) + +(** [paper::List] *) +type list_t (t : Type0) = +| ListCons : t -> list_t t -> list_t t +| ListNil : list_t t + +(** [paper::list_nth_mut] *) +let rec list_nth_mut_fwd (t : Type0) (l : list_t t) (i : u32) : result t = + begin match l with + | ListCons x tl -> + begin match i with + | 0 -> Return x + | _ -> + begin match u32_sub i 1 with + | Fail -> Fail + | Return i0 -> + begin match list_nth_mut_fwd t tl i0 with + | Fail -> Fail + | Return x0 -> let x1 = x0 in Return x1 + end + end + end + | ListNil -> Fail + end + +(** [paper::list_nth_mut] *) +let rec list_nth_mut_back + (t : Type0) (l : list_t t) (i : u32) (ret : t) : result (list_t t) = + begin match l with + | ListCons x tl -> + begin match i with + | 0 -> let x0 = ret in let l0 = ListCons x0 tl in Return l0 + | _ -> + begin match u32_sub i 1 with + | Fail -> Fail + | Return i0 -> + begin match list_nth_mut_back t tl i0 ret with + | Fail -> Fail + | Return l0 -> let l1 = ListCons x l0 in Return l1 + end + end + end + | ListNil -> Fail + end + +(** [paper::sum] *) +let rec sum_fwd (l : list_t i32) : result i32 = + begin match l with + | ListCons x tl -> + begin match sum_fwd tl with + | Fail -> Fail + | Return i -> + begin match i32_add x i with | Fail -> Fail | Return i0 -> Return i0 end + end + | ListNil -> Return 0 + end + +(** [paper::test_nth] *) +let test_nth_fwd : result unit = + let l = ListNil in + let l0 = ListCons 3 l in + let l1 = ListCons 2 l0 in + begin match list_nth_mut_fwd i32 (ListCons 1 l1) 2 with + | Fail -> Fail + | Return i -> + begin match i32_add i 1 with + | Fail -> Fail + | Return x -> + begin match list_nth_mut_back i32 (ListCons 1 l1) 2 x with + | Fail -> Fail + | Return l2 -> + begin match sum_fwd l2 with + | Fail -> Fail + | Return i0 -> if not (i0 = 7) then Fail else Return () + end + end + end + end + +(** Unit test for [paper::test_nth] *) +let _ = assert_norm (test_nth_fwd = Return ()) + |