#![feature(attr_literals)] #![register_tool(c2rust)] use std::mem; use std::os::raw::c_void; use std::ptr; extern "C" { #[ownership_mono("", MOVE)] #[ownership_variant_of("analysis_ownership/8cd878b::[0]::malloc[0]")] fn malloc(size: usize) -> *const c_void; #[ownership_mono("", MOVE)] #[ownership_variant_of("analysis_ownership/8cd878b::[0]::free[0]")] fn free(ptr: *mut c_void); } struct Forest { tree: *mut Tree, next: *mut Forest, } struct Tree { data: i32, children: *mut Forest, } #[ownership_mono("", MOVE)] #[ownership_variant_of("analysis_ownership/8cd878b::leaf[0]")] unsafe fn leaf(data: i32) -> *mut Tree { let t: *mut Tree = malloc(mem::size_of::()) as *mut Tree; (*t).data = data; (*t).children = ptr::null_mut(); t } #[ownership_mono("", WRITE, MOVE)] #[ownership_variant_of("analysis_ownership/8cd878b::add_child[0]")] unsafe fn add_child(parent: *mut Tree, child: *mut Tree) { let link: *mut Forest = malloc(mem::size_of::()) as *mut Forest; (*link).tree = child; (*link).next = (*parent).children; (*parent).children = link; } #[ownership_mono("", MOVE)] #[ownership_variant_of("analysis_ownership/8cd878b::delete_tree[0]")] unsafe fn delete_tree(tree: *mut Tree) { delete_forest((*tree).children); free(tree as *mut c_void); } #[ownership_mono("", MOVE)] #[ownership_variant_of("analysis_ownership/8cd878b::delete_forest[0]")] unsafe fn delete_forest(forest: *mut Forest) { delete_tree((*forest).tree); if !(*forest).next.is_null() { delete_forest((*forest).next); } free(forest as *mut c_void); } #[ownership_mono("take", WRITE, MOVE)] #[ownership_variant_of("analysis_ownership/8cd878b::get_children[0]")] unsafe fn get_children_take(parent: *mut Tree) -> *mut Forest { (*parent).children } #[ownership_mono("mut", WRITE, WRITE)] #[ownership_variant_of("analysis_ownership/8cd878b::get_children[0]")] unsafe fn get_children_mut(parent: *mut Tree) -> *mut Forest { (*parent).children } #[ownership_mono("", READ, READ)] #[ownership_variant_of("analysis_ownership/8cd878b::get_children[0]")] unsafe fn get_children(parent: *mut Tree) -> *mut Forest { (*parent).children } #[ownership_mono("take", WRITE, WRITE, MOVE)] #[ownership_variant_of("analysis_ownership/8cd878b::get_children_err[0]")] unsafe fn get_children_err_take(parent: *mut Tree, children_out: *mut *mut Forest) -> i32 { *children_out = (*parent).children; 0 } #[ownership_mono("mut", WRITE, WRITE, WRITE)] #[ownership_variant_of("analysis_ownership/8cd878b::get_children_err[0]")] unsafe fn get_children_err_mut(parent: *mut Tree, children_out: *mut *mut Forest) -> i32 { *children_out = (*parent).children; 0 } #[ownership_mono("", READ, WRITE, READ)] #[ownership_variant_of("analysis_ownership/8cd878b::get_children_err[0]")] unsafe fn get_children_err(parent: *mut Tree, children_out: *mut *mut Forest) -> i32 { *children_out = (*parent).children; 0 } #[ownership_mono("take", WRITE, MOVE)] #[ownership_variant_of("analysis_ownership/8cd878b::head[0]")] unsafe fn head_take(f: *mut Forest) -> *mut Tree { (*f).tree } #[ownership_mono("mut", WRITE, WRITE)] #[ownership_variant_of("analysis_ownership/8cd878b::head[0]")] unsafe fn head_mut(f: *mut Forest) -> *mut Tree { (*f).tree } #[ownership_mono("", READ, READ)] #[ownership_variant_of("analysis_ownership/8cd878b::head[0]")] unsafe fn head(f: *mut Forest) -> *mut Tree { (*f).tree } #[ownership_mono("take", WRITE, MOVE)] #[ownership_variant_of("analysis_ownership/8cd878b::tail[0]")] unsafe fn tail_take(f: *mut Forest) -> *mut Forest { (*f).next } #[ownership_mono("mut", WRITE, WRITE)] #[ownership_variant_of("analysis_ownership/8cd878b::tail[0]")] unsafe fn tail_mut(f: *mut Forest) -> *mut Forest { (*f).next } #[ownership_mono("", READ, READ)] #[ownership_variant_of("analysis_ownership/8cd878b::tail[0]")] unsafe fn tail(f: *mut Forest) -> *mut Forest { (*f).next } #[ownership_mono("", MOVE)] #[ownership_variant_of("analysis_ownership/8cd878b::delete_tree2[0]")] unsafe fn delete_tree2(tree: *mut Tree) { let c: *mut Forest = get_children_take(tree); delete_forest2(c); free(tree as *mut c_void); } #[ownership_mono("", MOVE)] #[ownership_variant_of("analysis_ownership/8cd878b::delete_forest2[0]")] unsafe fn delete_forest2(forest: *mut Forest) { let t: *mut Tree = head_take(forest); delete_tree2(t); let f: *mut Forest = tail_take(forest); if !f.is_null() { delete_forest2(f); } free(forest as *mut c_void); } #[ownership_mono("")] #[ownership_variant_of("analysis_ownership/8cd878b::main[0]")] fn main() {}