diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index dae3b5916..e78230bf0 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -34,22 +34,6 @@ std::vector Converter::global_inits_; Converter::RecordIndex Converter::record_decls_; std::map Converter::virtual_methods_; -void Converter::ConvertUniquePtrDeref(clang::CXXOperatorCallExpr *expr) { - bool is_star = expr->getOperator() == clang::OverloadedOperatorKind::OO_Star; - PushParen paren(*this, is_star); - if (is_star) { - StrCat(token::kStar); - } - if (expr->getArg(0)->IgnoreImplicit()->getType().isConstQualified()) { - StrCat("(*(std::ptr::addr_of!("); - Convert(expr->getArg(0)); - StrCat(").cast_mut())).as_deref_mut().unwrap()"); - } else { - Convert(expr->getArg(0)); - StrCat(".as_deref_mut().unwrap()"); - } -} - void Converter::EmitFilePreamble() { StrCat(R"( extern crate libc; @@ -3345,9 +3329,7 @@ bool Converter::ConvertCXXOperatorCallExpr(clang::CXXOperatorCallExpr *expr) { break; case clang::OverloadedOperatorKind::OO_Star: case clang::OverloadedOperatorKind::OO_Arrow: - if (IsUniquePtr(expr->getArg(0)->getType())) { - ConvertUniquePtrDeref(expr); - } else if (expr->getOperator() == clang::OverloadedOperatorKind::OO_Star) { + if (expr->getOperator() == clang::OverloadedOperatorKind::OO_Star) { PushParen paren(*this); StrCat(token::kStar); Convert(expr->getArg(0)); @@ -3372,8 +3354,7 @@ bool Converter::ConvertCXXOperatorCallExpr(clang::CXXOperatorCallExpr *expr) { } else { base_vars = GetAllVars(base); } - if (!IsUniquePtr(base->getType()) && - std::ranges::any_of(GetAllVars(idx), [&](const clang::ValueDecl *var) { + if (std::ranges::any_of(GetAllVars(idx), [&](const clang::ValueDecl *var) { return base_vars.contains(var); })) { std::string idx_str; @@ -4539,8 +4520,7 @@ void Converter::ConvertUnsignedArithOperand(clang::Expr *expr, void Converter::ConvertEqualsNullPtr(clang::Expr *expr) { StrCat('('); Convert(expr); - if (IsUniquePtr(expr->getType()) || - expr->getType()->isFunctionPointerType()) { + if (expr->getType()->isFunctionPointerType()) { StrCat(").is_none()"); } else { StrCat(").is_null()"); @@ -4614,13 +4594,7 @@ void Converter::ConvertArraySubscript(clang::Expr *base, clang::Expr *idx, return; } } - if (IsUniquePtr(base->getType())) { - PushExplicitAutoref no_autoref(*this, std::nullopt); - Convert(base->IgnoreImplicit()); - StrCat(".as_mut().unwrap()"); - } else { - Convert(base->IgnoreImplicit()); - } + Convert(base->IgnoreImplicit()); PushExplicitAutoref no_autoref(*this, std::nullopt); PushBracket bracket(*this); { diff --git a/cpp2rust/converter/converter.h b/cpp2rust/converter/converter.h index 201018834..79022d26e 100644 --- a/cpp2rust/converter/converter.h +++ b/cpp2rust/converter/converter.h @@ -753,8 +753,6 @@ class Converter : public clang::RecursiveASTVisitor { virtual void ConvertLoopVariable(clang::VarDecl *decl, clang::Expr *range_init); - virtual void ConvertUniquePtrDeref(clang::CXXOperatorCallExpr *expr); - virtual bool ConvertCXXOperatorCallExpr(clang::CXXOperatorCallExpr *expr); std::string GetMappedAsString(clang::Expr *expr, clang::Expr **args = nullptr, diff --git a/cpp2rust/converter/models/boxed_vars.cpp b/cpp2rust/converter/models/boxed_vars.cpp index 7de2eb2b7..e64d6db84 100644 --- a/cpp2rust/converter/models/boxed_vars.cpp +++ b/cpp2rust/converter/models/boxed_vars.cpp @@ -147,19 +147,6 @@ class AddressTakenVisitor AddValueUse(expr->getArg(0), /*write=*/true); AddValueUse(IgnoreNoOpCasts(expr->getArg(1))); } - // Dereferencing a unique_ptr reads the pointer it holds; the object it - // points to is not stored in the unique_ptr. - switch (expr->getOperator()) { - case clang::OO_Subscript: - case clang::OO_Star: - case clang::OO_Arrow: - if (IsUniquePtr(expr->getArg(0)->getType())) { - AddValueUse(IgnoreNoOpCasts(expr->getArg(0))); - } - break; - default: - break; - } return true; } diff --git a/cpp2rust/converter/models/converter_refcount.cpp b/cpp2rust/converter/models/converter_refcount.cpp index d2854addd..df5ef3a5d 100644 --- a/cpp2rust/converter/models/converter_refcount.cpp +++ b/cpp2rust/converter/models/converter_refcount.cpp @@ -89,11 +89,12 @@ static bool IsArrayFieldPtr(clang::ASTContext &ctx, const clang::Expr *expr) { // Whether `expr` is a field of an element of a std::vector, whose arrays and // vectors are accessed through the place of the element, which is never // reinterpreted memory. -static bool IsFieldOfVectorElem(const clang::MemberExpr *expr) { +static bool IsFieldOfVectorElem(clang::ASTContext &ctx, + const clang::MemberExpr *expr) { auto *op = clang::dyn_cast( expr->getBase()->IgnoreParenImpCasts()); return !expr->isArrow() && op && op->getOperator() == clang::OO_Subscript && - !IsUniquePtr(op->getArg(0)->getType()); + !Mapper::Contains(ctx, op); } static bool IsPointerType(clang::ASTContext &ctx, clang::QualType type) { @@ -175,8 +176,7 @@ bool ConverterRefCount::IsUnboxedPlace(const clang::Expr *expr) const { } if (auto *op = clang::dyn_cast(expr)) { return op->getOperator() == clang::OO_Subscript && - !IsUniquePtr(op->getArg(0)->getType()) && - IsUnboxedPlace(op->getArg(0)); + !Mapper::Contains(ctx_, op) && IsUnboxedPlace(op->getArg(0)); } auto *ref = clang::dyn_cast(expr); return ref && IsUnboxedVar(ref->getDecl()); @@ -2811,20 +2811,6 @@ void ConverterRefCount::ConvertGenericBinaryOperator( computed_expr_type_ = ComputedExprType::FreshValue; } -void ConverterRefCount::ConvertUniquePtrDeref( - clang::CXXOperatorCallExpr *expr) { - if (isAddrOf()) { - StrCat(ConvertRValue(expr->getArg(0)), ".as_pointer()"); - computed_expr_type_ = ComputedExprType::FreshPointer; - } else { - // The object is modified through its own Value. - StrCat(std::format("(*{}.as_ref().unwrap().borrow{}())", - ConvertRValue(expr->getArg(0)), - isRValue() ? "" : "_mut")); - SetValueFreshness(expr->getType()); - } -} - bool ConverterRefCount::ConvertCXXOperatorCallExpr( clang::CXXOperatorCallExpr *expr) { switch (expr->getOperator()) { @@ -2834,11 +2820,6 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr( case clang::OverloadedOperatorKind::OO_Arrow: case clang::OverloadedOperatorKind::OO_Star: - if (IsUniquePtr(expr->getArg(0)->getType())) { - ConvertUniquePtrDeref(expr); - break; - } - if (isLValue()) { auto ptr = ToString(expr->getArg(0)); pending_deref_.set(std::move(ptr), isFresh()); @@ -2860,24 +2841,6 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr( break; case clang::OverloadedOperatorKind::OO_Subscript: { - if (IsUniquePtr(expr->getArg(0)->getType())) { - StrCat( - std::format("{}.as_ref().unwrap()", ConvertRValue(expr->getArg(0)))); - if (isAddrOf()) { - StrCat(std::format(".as_pointer().offset(({}))", - ConvertRValue(expr->getArg(1)))); - } else { - if (isRValue()) { - StrCat(".borrow()"); - } else { - StrCat(".borrow_mut()"); - } - StrCat(std::format("[({}) as usize]", ConvertRValue(expr->getArg(1)))); - } - SetValueFreshness(expr->getType()); - break; - } - bool is_inner_boxed = IsBoxedType(ctx_, expr->getType().getNonReferenceType()) && IsBoxedType(ctx_, expr->getArg(0)->getType().getNonReferenceType()); @@ -2995,7 +2958,7 @@ std::string ConverterRefCount::ConvertElemPlace(clang::Expr *container, !IsUnboxedPlace(member) && Mapper::Map(ctx_, field->getType().getUnqualifiedType()) .starts_with("Vec<")) { - if (IsFieldOfVectorElem(member)) { + if (IsFieldOfVectorElem(ctx_, member)) { return std::format("index!({}, {})", ConvertPlace(member), ConvertSubscriptIndex(idx)); } @@ -3136,7 +3099,7 @@ void ConverterRefCount::ConvertPointerElem(clang::Expr *base, // An element of an array field is accessed in place, through the struct. if (IsArrayFieldPtr(ctx_, base)) { auto *member = clang::cast(base->IgnoreParenImpCasts()); - if (IsFieldOfVectorElem(member)) { + if (IsFieldOfVectorElem(ctx_, member)) { StrCat(std::format("index!({}, {})", ConvertPlace(member), ConvertRValue(idx))); computed_expr_type_ = ComputedExprType::FreshPointer; diff --git a/cpp2rust/converter/models/converter_refcount.h b/cpp2rust/converter/models/converter_refcount.h index f47c8db0a..d4202d185 100644 --- a/cpp2rust/converter/models/converter_refcount.h +++ b/cpp2rust/converter/models/converter_refcount.h @@ -285,8 +285,6 @@ class ConverterRefCount final : public Converter { void ConvertAssignment(clang::Expr *lhs, clang::Expr *rhs, std::string_view assign_operator) override; - void ConvertUniquePtrDeref(clang::CXXOperatorCallExpr *expr) override; - bool ConvertCXXOperatorCallExpr(clang::CXXOperatorCallExpr *expr) override; void ConvertFunctionParameters(clang::FunctionDecl *decl) override; diff --git a/rules/unique_ptr/src.cpp b/rules/unique_ptr/src.cpp index 7029ebd9b..862272727 100644 --- a/rules/unique_ptr/src.cpp +++ b/rules/unique_ptr/src.cpp @@ -63,3 +63,21 @@ std::unique_ptr &f15(std::unique_ptr &dst, std::unique_ptr &&src) { return dst = std::move(src); } + +template T1 &f17(const std::unique_ptr &o) { return *o; } + +template T1 *f18(const std::unique_ptr &o) { + return o.operator->(); +} + +template T1 &f19(const std::unique_ptr &o, std::size_t i) { + return o[i]; +} + +template bool f20(const std::unique_ptr &o, std::nullptr_t) { + return o == nullptr; +} + +template bool f21(const std::unique_ptr &o, std::nullptr_t) { + return o != nullptr; +} diff --git a/rules/unique_ptr/tgt_refcount.rs b/rules/unique_ptr/tgt_refcount.rs index 668be4c9b..1d542bfff 100644 --- a/rules/unique_ptr/tgt_refcount.rs +++ b/rules/unique_ptr/tgt_refcount.rs @@ -79,3 +79,23 @@ fn f14(a0: Ptr>>, a1: &mut Option>) { fn f15(a0: Ptr>>>, a1: &mut Option>>) { a0.write(a1.take()) } + +fn f17(a0: Value) -> Ptr { + a0.as_pointer() +} + +fn f18(a0: Value) -> Ptr { + a0.as_pointer() +} + +fn f19(a0: Value, a1: usize) -> Ptr { + (a0.as_pointer() as Ptr).offset(a1 as isize) +} + +fn f20(a0: Option>) -> bool { + a0.is_none() +} + +fn f21(a0: Option>) -> bool { + a0.is_some() +} diff --git a/rules/unique_ptr/tgt_unsafe.rs b/rules/unique_ptr/tgt_unsafe.rs index a6da92486..72075b95f 100644 --- a/rules/unique_ptr/tgt_unsafe.rs +++ b/rules/unique_ptr/tgt_unsafe.rs @@ -73,3 +73,27 @@ unsafe fn f14(a0: &mut Option>, a1: &mut Option>) { unsafe fn f15(a0: &mut Option>, a1: &mut Option>) { *a0 = a1.take() } + +unsafe fn f17(a0: &mut Option>) -> *mut T1 { + a0.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const T1 as *mut T1) +} + +unsafe fn f18(a0: &mut Option>) -> *mut T1 { + a0.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const T1 as *mut T1) +} + +unsafe fn f19(a0: &mut Option>, a1: usize) -> *mut T1 { + a0.as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut T1) + .add(a1) +} + +unsafe fn f20(a0: &mut Option>) -> bool { + a0.is_none() +} + +unsafe fn f21(a0: &mut Option>) -> bool { + a0.is_some() +} diff --git a/tests/ub/out/refcount/ub6.rs b/tests/ub/out/refcount/ub6.rs index 6c1067543..92075fba4 100644 --- a/tests/ub/out/refcount/ub6.rs +++ b/tests/ub/out/refcount/ub6.rs @@ -31,18 +31,22 @@ pub fn fill_1(arr: Ptr]>>>>, n1: Ptr) { mkPair_0(_x1, _x2) }), )); - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut()[(0_usize) as usize] = - ({ (*pair.borrow()).x1.clone() }).clone(); - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut()[(1_usize) as usize] = - ({ (*pair.borrow()).x2.clone() }).clone(); + ((*arr.upgrade().deref()).as_pointer() as Ptr>) + .offset(0_usize as isize) + .write(({ (*pair.borrow()).x1.clone() }).clone()); + ((*arr.upgrade().deref()).as_pointer() as Ptr>) + .offset(1_usize as isize) + .write(({ (*pair.borrow()).x2.clone() }).clone()); } pub fn any_2(arr: Ptr]>>>>, n1: Ptr) -> bool { let mut out: bool = false; let mut i: i32 = 0; 'loop_: while ({ i } < { (n1.read()) }) { let __rhs = (out) - || (((*arr.upgrade().deref()).as_ref().unwrap().borrow()[(i as usize) as usize] + || (((((*arr.upgrade().deref()).as_pointer() as Ptr>) + .offset((i as usize) as isize) .read()) + .read()) == 0); out = __rhs; i.prefix_inc(); diff --git a/tests/ub/out/unsafe/ub6.rs b/tests/ub/out/unsafe/ub6.rs index da7972c8f..ea62e69b6 100644 --- a/tests/ub/out/unsafe/ub6.rs +++ b/tests/ub/out/unsafe/ub6.rs @@ -22,14 +22,25 @@ pub unsafe fn fill_1(arr: *mut Option>, n1: *mut i32) { let _x2: *mut i32 = &mut n2; mkPair_0(_x1, _x2) }); - (*arr).as_mut().unwrap()[(0_usize)] = (pair.x1); - (*arr).as_mut().unwrap()[(1_usize)] = (pair.x2); + (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut *mut i32) + .add(0_usize)) = (pair.x1); + (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut *mut i32) + .add(1_usize)) = (pair.x2); } pub unsafe fn any_2(arr: *mut Option>, n1: *mut i32) -> bool { let mut out: bool = false; let mut i: i32 = 0; 'loop_: while ((i) < (*n1)) { - out = (out) || ((*(*arr).as_mut().unwrap()[(i as usize)]) == (0)); + out = (out) + || ((*(*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut *mut i32) + .add((i as usize)))) + == (0)); i.prefix_inc(); } return out; diff --git a/tests/unit/out/refcount/07_unique.rs b/tests/unit/out/refcount/07_unique.rs index c7ce67af8..0a5cee656 100644 --- a/tests/unit/out/refcount/07_unique.rs +++ b/tests/unit/out/refcount/07_unique.rs @@ -7,7 +7,7 @@ use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; pub fn fn_0(mut u: Option>) -> Option> { - (*u.as_ref().unwrap().borrow_mut()) = 10; + u.as_pointer().write(10); return u.take(); } pub fn main() { @@ -16,14 +16,14 @@ pub fn main() { } fn main_0() -> i32 { let f: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(8))))); - (*(*f.borrow()).as_ref().unwrap().borrow_mut()) = 9; + (*f.borrow()).as_pointer().write(9); let mut f_ptr1: Ptr = (*f.borrow()).as_pointer(); f_ptr1.write(10); let mut f_ptr2: Ptr = ((*f.borrow()).as_pointer()); f_ptr2.write(11); (f.as_pointer() as Ptr>>).write(Some(Rc::new(RefCell::new(9))).take()); (f.as_pointer() as Ptr>>).write(({ fn_0((*f.borrow_mut()).take()) }).take()); - assert!(((*(*f.borrow()).as_ref().unwrap().borrow()) == 10)); + assert!((((*f.borrow()).as_pointer().read()) == 10)); return 0; } pub fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/refcount/08_unique_array.rs b/tests/unit/out/refcount/08_unique_array.rs index ab21d5dd7..2056473e2 100644 --- a/tests/unit/out/refcount/08_unique_array.rs +++ b/tests/unit/out/refcount/08_unique_array.rs @@ -14,14 +14,18 @@ fn main_0() -> i32 { let mut g: Option>> = Some(Rc::new(RefCell::new( (0..2_usize).map(|_| ::default()).collect::>(), ))); - g.as_ref().unwrap().borrow_mut()[(0_usize) as usize] = 11; - g.as_ref().unwrap().borrow_mut()[(1_usize) as usize] = 12; + (g.as_pointer() as Ptr) + .offset(0_usize as isize) + .write(11); + (g.as_pointer() as Ptr) + .offset(1_usize as isize) + .write(12); let mut g_ptr: Ptr = g.as_pointer(); elem!(g_ptr, 0).write(13); elem!(g_ptr, 1).write(14); assert!( - ((g.as_ref().unwrap().borrow()[(0_usize) as usize] - + g.as_ref().unwrap().borrow()[(1_usize) as usize]) + ((((g.as_pointer() as Ptr).offset(0_usize as isize).read()) + + ((g.as_pointer() as Ptr).offset(1_usize as isize).read())) == 27) ); return 0; diff --git a/tests/unit/out/refcount/11_move.rs b/tests/unit/out/refcount/11_move.rs index 8bbc6c7ce..18219cb7f 100644 --- a/tests/unit/out/refcount/11_move.rs +++ b/tests/unit/out/refcount/11_move.rs @@ -18,7 +18,7 @@ pub fn main() { fn main_0() -> i32 { let n: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(10))))); ({ change_0(n.as_pointer()) }); - assert!(((*(*n.borrow()).as_ref().unwrap().borrow()) == 20)); + assert!((((*n.borrow()).as_pointer().read()) == 20)); return 0; } pub fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/refcount/alloc_array.rs b/tests/unit/out/refcount/alloc_array.rs index ed884f966..6e42ca74e 100644 --- a/tests/unit/out/refcount/alloc_array.rs +++ b/tests/unit/out/refcount/alloc_array.rs @@ -14,7 +14,9 @@ pub fn All_0(arr: Ptr>>>, mut N: i32, mut element: i32) ))))); let mut i: i32 = 0; 'loop_: while (i < N) { - (*all.borrow()).as_ref().unwrap().borrow_mut()[(i as usize) as usize] = element; + ((*all.borrow()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(element); i.prefix_inc(); } ((arr).clone() as Ptr>>>).write((*all.borrow_mut()).take()); @@ -23,7 +25,9 @@ pub fn Consume_1(mut arr: Option>>, mut N: i32) -> i32 { let mut sum: i32 = 0; let mut i: i32 = -1_i32; 'loop_: while (i.prefix_inc() < N) { - sum += arr.as_ref().unwrap().borrow()[(i as usize) as usize]; + sum += ((arr.as_pointer() as Ptr) + .offset((i as usize) as isize) + .read()); } return sum; } diff --git a/tests/unit/out/refcount/copy_move_defaulted.rs b/tests/unit/out/refcount/copy_move_defaulted.rs index b9491dac7..087a0e844 100644 --- a/tests/unit/out/refcount/copy_move_defaulted.rs +++ b/tests/unit/out/refcount/copy_move_defaulted.rs @@ -379,7 +379,7 @@ fn main_0() -> i32 { assert!( ((({ (*o2.borrow()).n } == 5) && ((*o2.borrow()).data.len() == 1_usize)) && ((array_elem!(o2.as_pointer(), arr, 1).read()) == 6)) - && ((*{ (*o2.borrow()).p.clone() }.as_ref().unwrap().borrow()) == 7) + && (({ (*o2.borrow()).p.clone() }.as_pointer().read()) == 7) ); assert!( ((*o1.borrow()).data.is_empty()) && (({ (*o1.borrow()).p.clone() }.as_pointer()).is_null()) @@ -390,7 +390,7 @@ fn main_0() -> i32 { ((({ (*o3.borrow()).n } == 5) && ((vec_elem!(o3.as_pointer(), data, 0_usize).read()) == 5)) && ((array_elem!(o3.as_pointer(), arr, 0).read()) == 5)) - && ((*{ (*o3.borrow()).p.clone() }.as_ref().unwrap().borrow()) == 7) + && (({ (*o3.borrow()).p.clone() }.as_pointer().read()) == 7) ); assert!( ((*o2.borrow()).data.is_empty()) && (({ (*o2.borrow()).p.clone() }.as_pointer()).is_null()) @@ -405,7 +405,7 @@ fn main_0() -> i32 { let _dtor_h2 = ScopedDestructor::new(&h2, |__p| __p.destructor()); assert!( ((({ (*h2.borrow()).inner.x } == 4) && ({ (*h2.borrow()).e.v } == 4)) - && ((*{ (*h2.borrow()).p.clone() }.as_ref().unwrap().borrow()) == 9)) + && (({ (*h2.borrow()).p.clone() }.as_pointer().read()) == 9)) && (({ (*h1.borrow()).p.clone() }.as_pointer()).is_null()) ); let h3: Value = Rc::new(RefCell::new(Holder::new({ 1 }))); @@ -414,7 +414,7 @@ fn main_0() -> i32 { assert!( ((({ (*h3.borrow()).inner.x } == 4) && ((array_elem!(field_ptr!(h3.as_pointer(), e), arr, 1).read()) == 5)) - && ((*{ (*h3.borrow()).p.clone() }.as_ref().unwrap().borrow()) == 9)) + && (({ (*h3.borrow()).p.clone() }.as_pointer().read()) == 9)) && (({ (*h2.borrow()).p.clone() }.as_pointer()).is_null()) ); return 0; diff --git a/tests/unit/out/refcount/fft.rs b/tests/unit/out/refcount/fft.rs index 6c59ce37f..2a02ae192 100644 --- a/tests/unit/out/refcount/fft.rs +++ b/tests/unit/out/refcount/fft.rs @@ -43,10 +43,16 @@ pub fn fft_3(a: Ptr>>>, mut N: i32) -> Option) + .offset(0_usize as isize) + .with(|__s| __s.re), + img: ((*a.upgrade().deref()).as_pointer() as Ptr) + .offset(0_usize as isize) + .with(|__s| __s.img), }; - y.as_ref().unwrap().borrow_mut()[(0_usize) as usize] = __rhs; + (y.as_pointer() as Ptr) + .offset(0_usize as isize) + .write(__rhs); return y.take(); } let mut w: Option>> = Some(Rc::new(RefCell::new( @@ -62,7 +68,9 @@ pub fn fft_3(a: Ptr>>>, mut N: i32) -> Option) + .offset((i as usize) as isize) + .write(__rhs); i.postfix_inc(); } let A0: Value>>> = @@ -80,25 +88,27 @@ pub fn fft_3(a: Ptr>>>, mut N: i32) -> Option) + .offset(((i * 2) as usize) as isize) + .with(|__s| __s.re), + img: ((*a.upgrade().deref()).as_pointer() as Ptr) + .offset(((i * 2) as usize) as isize) + .with(|__s| __s.img), }; - (*A0.borrow()).as_ref().unwrap().borrow_mut()[(i as usize) as usize] = __rhs; + ((*A0.borrow()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(__rhs); let __rhs = Complex { - re: { - (*a.upgrade().deref()).as_ref().unwrap().borrow()[(((i * 2) + 1) as usize) as usize] - .re - }, - img: { - (*a.upgrade().deref()).as_ref().unwrap().borrow()[(((i * 2) + 1) as usize) as usize] - .img - }, + re: ((*a.upgrade().deref()).as_pointer() as Ptr) + .offset((((i * 2) + 1) as usize) as isize) + .with(|__s| __s.re), + img: ((*a.upgrade().deref()).as_pointer() as Ptr) + .offset((((i * 2) + 1) as usize) as isize) + .with(|__s| __s.img), }; - (*A1.borrow()).as_ref().unwrap().borrow_mut()[(i as usize) as usize] = __rhs; + ((*A1.borrow()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(__rhs); i.postfix_inc(); } let mut y0: Option>> = ({ fft_3(A0.as_pointer(), (N / 2)) }); @@ -106,37 +116,63 @@ pub fn fft_3(a: Ptr>>>, mut N: i32) -> Option) + .offset((k as usize) as isize) + .upgrade() + .deref()) + .clone(); let _z2: Complex = ({ - let _z1: Complex = (w.as_ref().unwrap().borrow()[(k as usize) as usize]).clone(); - let _z2: Complex = (y1.as_ref().unwrap().borrow()[(k as usize) as usize]).clone(); + let _z1: Complex = (*(w.as_pointer() as Ptr) + .offset((k as usize) as isize) + .upgrade() + .deref()) + .clone(); + let _z2: Complex = (*(y1.as_pointer() as Ptr) + .offset((k as usize) as isize) + .upgrade() + .deref()) + .clone(); Product_0(_z1, _z2) }); Sum_1(_z1, _z2) }); - y.as_ref().unwrap().borrow_mut()[(k as usize) as usize] = Complex { - re: yk.re, - img: yk.img, - }; + (y.as_pointer() as Ptr) + .offset((k as usize) as isize) + .write(Complex { + re: yk.re, + img: yk.img, + }); let mut yk_n2: Complex = ({ - let _z1: Complex = (y0.as_ref().unwrap().borrow()[(k as usize) as usize]).clone(); + let _z1: Complex = (*(y0.as_pointer() as Ptr) + .offset((k as usize) as isize) + .upgrade() + .deref()) + .clone(); let _z2: Complex = ({ Neg_2( ({ - let _z1: Complex = - (w.as_ref().unwrap().borrow()[(k as usize) as usize]).clone(); - let _z2: Complex = - (y1.as_ref().unwrap().borrow()[(k as usize) as usize]).clone(); + let _z1: Complex = (*(w.as_pointer() as Ptr) + .offset((k as usize) as isize) + .upgrade() + .deref()) + .clone(); + let _z2: Complex = (*(y1.as_pointer() as Ptr) + .offset((k as usize) as isize) + .upgrade() + .deref()) + .clone(); Product_0(_z1, _z2) }), ) }); Sum_1(_z1, _z2) }); - y.as_ref().unwrap().borrow_mut()[((k + (N / 2)) as usize) as usize] = Complex { - re: yk_n2.re, - img: yk_n2.img, - }; + (y.as_pointer() as Ptr) + .offset(((k + (N / 2)) as usize) as isize) + .write(Complex { + re: yk_n2.re, + img: yk_n2.img, + }); k.postfix_inc(); } return y.take(); @@ -159,7 +195,9 @@ fn main_0() -> i32 { re: ((i as f64) + 1_f64), img: 0_f64, }; - (*a.borrow()).as_ref().unwrap().borrow_mut()[(i as usize) as usize] = __rhs; + ((*a.borrow()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(__rhs); i.postfix_inc(); } let mut b: Option>> = ({ fft_3(a.as_pointer(), N) }); @@ -175,21 +213,55 @@ fn main_0() -> i32 { ))); let mut i: i32 = 0; 'loop_: while (i < N) { - let __rhs = ({ b.as_ref().unwrap().borrow()[(i as usize) as usize].re }.round() as i32); - reals.as_ref().unwrap().borrow_mut()[(i as usize) as usize] = __rhs; - let __rhs = ({ b.as_ref().unwrap().borrow()[(i as usize) as usize].img }.round() as i32); - imgs.as_ref().unwrap().borrow_mut()[(i as usize) as usize] = __rhs; + let __rhs = ((b.as_pointer() as Ptr) + .offset((i as usize) as isize) + .with(|__s| __s.re) + .round() as i32); + (reals.as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(__rhs); + let __rhs = ((b.as_pointer() as Ptr) + .offset((i as usize) as isize) + .with(|__s| __s.img) + .round() as i32); + (imgs.as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(__rhs); i.prefix_inc(); } assert!( - (((((((reals.as_ref().unwrap().borrow()[(0_usize) as usize] == 10) - && (imgs.as_ref().unwrap().borrow()[(0_usize) as usize] == 0)) - && (reals.as_ref().unwrap().borrow()[(1_usize) as usize] == -2_i32)) - && (imgs.as_ref().unwrap().borrow()[(1_usize) as usize] == 2)) - && (reals.as_ref().unwrap().borrow()[(2_usize) as usize] == -2_i32)) - && (imgs.as_ref().unwrap().borrow()[(2_usize) as usize] == 0)) - && (reals.as_ref().unwrap().borrow()[(3_usize) as usize] == -2_i32)) - && (imgs.as_ref().unwrap().borrow()[(3_usize) as usize] == -2_i32) + (((((((((reals.as_pointer() as Ptr) + .offset(0_usize as isize) + .read()) + == 10) + && (((imgs.as_pointer() as Ptr) + .offset(0_usize as isize) + .read()) + == 0)) + && (((reals.as_pointer() as Ptr) + .offset(1_usize as isize) + .read()) + == -2_i32)) + && (((imgs.as_pointer() as Ptr) + .offset(1_usize as isize) + .read()) + == 2)) + && (((reals.as_pointer() as Ptr) + .offset(2_usize as isize) + .read()) + == -2_i32)) + && (((imgs.as_pointer() as Ptr) + .offset(2_usize as isize) + .read()) + == 0)) + && (((reals.as_pointer() as Ptr) + .offset(3_usize as isize) + .read()) + == -2_i32)) + && (((imgs.as_pointer() as Ptr) + .offset(3_usize as isize) + .read()) + == -2_i32) ); return 0; } diff --git a/tests/unit/out/refcount/huffman.rs b/tests/unit/out/refcount/huffman.rs index b7d015196..92ba55003 100644 --- a/tests/unit/out/refcount/huffman.rs +++ b/tests/unit/out/refcount/huffman.rs @@ -103,7 +103,7 @@ pub fn Huffman_2( let _n: i32 = size; MinHeapImpl::Build(&(minHeap.as_pointer()), _data, _freq, _n) }); - 'loop_: while ({ (*minHeap.as_ref().unwrap().borrow()).size } != 1) { + 'loop_: while (minHeap.as_pointer().with(|__s| (__s).size) != 1) { let mut left: Ptr = ({ MinHeapImpl::ExtractMin(&(minHeap.as_pointer())) }); let mut right: Ptr = ({ MinHeapImpl::ExtractMin(&(minHeap.as_pointer())) }); let mut top: Ptr = ({ @@ -125,21 +125,30 @@ pub fn CollectCode_3( out: Ptr>>>, next: Ptr, ) { - (*out.upgrade().deref()).as_ref().unwrap().borrow_mut()[((next.read()) as usize) as usize] = 0; + ((*out.upgrade().deref()).as_pointer() as Ptr) + .offset(((next.read()) as usize) as isize) + .write(0); let mut i: i32 = 0; 'loop_: while (i < top) { - let __rhs = ((*out.upgrade().deref()).as_ref().unwrap().borrow() - [((next.read()) as usize) as usize] + let __rhs = ((((*out.upgrade().deref()).as_pointer() as Ptr) + .offset(((next.read()) as usize) as isize) + .read()) * 10); - (*out.upgrade().deref()).as_ref().unwrap().borrow_mut() - [((next.read()) as usize) as usize] = __rhs; + ((*out.upgrade().deref()).as_pointer() as Ptr) + .offset(((next.read()) as usize) as isize) + .write(__rhs); let __rhs = ({ - (*out.upgrade().deref()).as_ref().unwrap().borrow()[((next.read()) as usize) as usize] + (((*out.upgrade().deref()).as_pointer() as Ptr) + .offset(((next.read()) as usize) as isize) + .read()) } + { - (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(i as usize) as usize] + (((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .read()) }); - (*out.upgrade().deref()).as_ref().unwrap().borrow_mut() - [((next.read()) as usize) as usize] = __rhs; + ((*out.upgrade().deref()).as_pointer() as Ptr) + .offset(((next.read()) as usize) as isize) + .write(__rhs); i.prefix_inc(); } next.with_mut(|__v| __v.prefix_inc()); @@ -152,7 +161,9 @@ pub fn CollectCodes_4( next: Ptr, ) { if !((root.with(|__s| __s.left.clone())).is_null()) { - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut()[(top as usize) as usize] = 0; + ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((top as usize) as isize) + .write(0); ({ let _root: Ptr = root.with(|__s| __s.left.clone()); let _arr: Ptr>>> = (arr).clone(); @@ -163,7 +174,9 @@ pub fn CollectCodes_4( }); } if !((root.with(|__s| __s.right.clone())).is_null()) { - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut()[(top as usize) as usize] = 1; + ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((top as usize) as isize) + .write(1); ({ let _root: Ptr = root.with(|__s| __s.right.clone()); let _arr: Ptr>>> = (arr).clone(); @@ -247,20 +260,42 @@ fn main_0() -> i32 { let mut i: i32 = 0; 'loop_: while (i < size) { let __rhs = arr1[(i) as usize]; - (*data.borrow()).as_ref().unwrap().borrow_mut()[(i as usize) as usize] = __rhs; + ((*data.borrow()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(__rhs); let __rhs = arr2[(i) as usize]; - (*freq.borrow()).as_ref().unwrap().borrow_mut()[(i as usize) as usize] = __rhs; + ((*freq.borrow()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(__rhs); i.prefix_inc(); } let mut out: Option>> = ({ HuffmanCodes_5(data.as_pointer(), freq.as_pointer(), size) }); assert!( - (((((out.as_ref().unwrap().borrow()[(0_usize) as usize] == 0) - && (out.as_ref().unwrap().borrow()[(1_usize) as usize] == 100)) - && (out.as_ref().unwrap().borrow()[(2_usize) as usize] == 101)) - && (out.as_ref().unwrap().borrow()[(3_usize) as usize] == 1100)) - && (out.as_ref().unwrap().borrow()[(4_usize) as usize] == 1101)) - && (out.as_ref().unwrap().borrow()[(5_usize) as usize] == 111) + (((((((out.as_pointer() as Ptr) + .offset(0_usize as isize) + .read()) + == 0) + && (((out.as_pointer() as Ptr) + .offset(1_usize as isize) + .read()) + == 100)) + && (((out.as_pointer() as Ptr) + .offset(2_usize as isize) + .read()) + == 101)) + && (((out.as_pointer() as Ptr) + .offset(3_usize as isize) + .read()) + == 1100)) + && (((out.as_pointer() as Ptr) + .offset(4_usize as isize) + .read()) + == 1101)) + && (((out.as_pointer() as Ptr) + .offset(5_usize as isize) + .read()) + == 111) ); return 0; } @@ -279,98 +314,72 @@ pub trait MinHeapImpl { } impl MinHeapImpl for Ptr { fn Alloc(&self, mut data: i8, mut freq: i32) -> Ptr { - (*self) - .with(|__s| __s.alloc.clone()) - .as_ref() - .unwrap() - .borrow_mut()[((*self).with(|__s| __s.next) as usize) as usize] = MinHeapNode { - data: data, - freq: freq, - left: Ptr::::null(), - right: Ptr::::null(), - }; - return ((*self) - .with(|__s| __s.alloc.clone()) - .as_ref() - .unwrap() - .as_pointer() - .offset((field!((*self), next).with_mut(|__v| __v.postfix_inc()) as usize))) - .clone(); + ((*self).with(|__s| __s.alloc.clone()).as_pointer() as Ptr) + .offset(((*self).with(|__s| __s.next) as usize) as isize) + .write(MinHeapNode { + data: data, + freq: freq, + left: Ptr::::null(), + right: Ptr::::null(), + }); + return (((*self).with(|__s| __s.alloc.clone()).as_pointer() as Ptr) + .offset((field!((*self), next).with_mut(|__v| __v.postfix_inc()) as usize) as isize)); } fn Heapify(&self, mut idx: i32) { let mut smallest: i32 = idx; let mut left: i32 = ((2 * idx) + 1); let mut right: i32 = ((2 * idx) + 2); if (left < (*self).with(|__s| __s.size)) - && ((*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow()[(left as usize) as usize] - .with(|__s| __s.freq) - < (*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow()[(smallest as usize) as usize] - .with(|__s| __s.freq)) + && ((((*self).with(|__s| __s.arr.clone()).as_pointer() as Ptr>) + .offset((left as usize) as isize) + .read()) + .with(|__s| __s.freq) + < (((*self).with(|__s| __s.arr.clone()).as_pointer() as Ptr>) + .offset((smallest as usize) as isize) + .read()) + .with(|__s| __s.freq)) { smallest = left; } if (right < (*self).with(|__s| __s.size)) - && ((*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow()[(right as usize) as usize] - .with(|__s| __s.freq) - < (*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow()[(smallest as usize) as usize] - .with(|__s| __s.freq)) + && ((((*self).with(|__s| __s.arr.clone()).as_pointer() as Ptr>) + .offset((right as usize) as isize) + .read()) + .with(|__s| __s.freq) + < (((*self).with(|__s| __s.arr.clone()).as_pointer() as Ptr>) + .offset((smallest as usize) as isize) + .read()) + .with(|__s| __s.freq)) { smallest = right; } if (smallest != idx) { ({ - let _a: Ptr = ((*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow()[(smallest as usize) as usize]) - .clone(); - let _b: Ptr = ((*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow()[(idx as usize) as usize]) - .clone(); + let _a: Ptr = (((*self).with(|__s| __s.arr.clone()).as_pointer() + as Ptr>) + .offset((smallest as usize) as isize) + .read()); + let _b: Ptr = (((*self).with(|__s| __s.arr.clone()).as_pointer() + as Ptr>) + .offset((idx as usize) as isize) + .read()); Swap_0(_a, _b) }); ({ MinHeapImpl::Heapify(self, smallest) }); } } fn ExtractMin(&self) -> Ptr { - let mut out: Ptr = ((*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow()[(0_usize) as usize]) - .clone(); + let mut out: Ptr = (((*self).with(|__s| __s.arr.clone()).as_pointer() + as Ptr>) + .offset(0_usize as isize) + .read()); field!((*self), size).with_mut(|__v| __v.prefix_dec()); - let __rhs = ((*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow()[((*self).with(|__s| __s.size) as usize) as usize]) - .clone(); - (*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow_mut()[(0_usize) as usize] = __rhs; + let __rhs = (((*self).with(|__s| __s.arr.clone()).as_pointer() as Ptr>) + .offset(((*self).with(|__s| __s.size) as usize) as isize) + .read()); + ((*self).with(|__s| __s.arr.clone()).as_pointer() as Ptr>) + .offset(0_usize as isize) + .write(__rhs); ({ MinHeapImpl::Heapify(self, 0) }); return out; } @@ -379,32 +388,24 @@ impl MinHeapImpl for Ptr { let mut i: i32 = ((*self).with(|__s| __s.size) - 1); 'loop_: while (i != 0) && ({ node.with(|__s| __s.freq) } < { - (*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow()[(((i - 1) / 2) as usize) as usize] - .with(|__s| __s.freq) + (((*self).with(|__s| __s.arr.clone()).as_pointer() as Ptr>) + .offset((((i - 1) / 2) as usize) as isize) + .read()) + .with(|__s| __s.freq) }) { - let __rhs = ((*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow()[(((i - 1) / 2) as usize) as usize]) - .clone(); - (*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow_mut()[(i as usize) as usize] = __rhs; + let __rhs = (((*self).with(|__s| __s.arr.clone()).as_pointer() + as Ptr>) + .offset((((i - 1) / 2) as usize) as isize) + .read()); + ((*self).with(|__s| __s.arr.clone()).as_pointer() as Ptr>) + .offset((i as usize) as isize) + .write(__rhs); i = { ((i - 1) / 2) }; } - (*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow_mut()[(i as usize) as usize] = (node).clone(); + ((*self).with(|__s| __s.arr.clone()).as_pointer() as Ptr>) + .offset((i as usize) as isize) + .write((node).clone()); } fn Build( &self, @@ -414,18 +415,19 @@ impl MinHeapImpl for Ptr { ) { let mut i: i32 = 0; 'loop_: while (i < n) { - (*self) - .with(|__s| __s.arr.clone()) - .as_ref() - .unwrap() - .borrow_mut() - [(field!((*self), size).with_mut(|__v| __v.postfix_inc()) as usize) as usize] = ({ - let _data: i8 = - (*data.upgrade().deref()).as_ref().unwrap().borrow()[(i as usize) as usize]; - let _freq: i32 = - (*freq.upgrade().deref()).as_ref().unwrap().borrow()[(i as usize) as usize]; - MinHeapImpl::Alloc(self, _data, _freq) - }); + ((*self).with(|__s| __s.arr.clone()).as_pointer() as Ptr>) + .offset((field!((*self), size).with_mut(|__v| __v.postfix_inc()) as usize) as isize) + .write( + ({ + let _data: i8 = (((*data.upgrade().deref()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .read()); + let _freq: i32 = (((*freq.upgrade().deref()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .read()); + MinHeapImpl::Alloc(self, _data, _freq) + }), + ); i.prefix_inc(); } let mut i: i32 = (((*self).with(|__s| __s.size) - 2) / 2); diff --git a/tests/unit/out/refcount/kruskal.rs b/tests/unit/out/refcount/kruskal.rs index 02a5f1f14..1c5aebeaf 100644 --- a/tests/unit/out/refcount/kruskal.rs +++ b/tests/unit/out/refcount/kruskal.rs @@ -17,17 +17,15 @@ pub struct Edge { pub weight: f64, } pub fn partition_0(arr: Ptr>>>, mut start: i32, mut end: i32) -> i32 { - let pivot: Ptr = ((*arr.upgrade().deref()) - .as_ref() - .unwrap() - .as_pointer() - .offset((start as usize))) - .clone(); + let pivot: Ptr = + ((*arr.upgrade().deref()).as_pointer() as Ptr).offset((start as usize) as isize); let mut count: i32 = 0; let mut i: i32 = (start + 1); 'loop_: while (i <= end) { if ({ - { (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(i as usize) as usize].weight } + ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .with(|__s| __s.weight) } <= { pivot.with(|__s| __s.weight) }) { count.postfix_inc(); @@ -36,63 +34,89 @@ pub fn partition_0(arr: Ptr>>>, mut start: i32, mut end } let mut pidx: i32 = (start + count); let mut tmp: Edge = Edge { - u: { (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(pidx as usize) as usize].u }, - v: { (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(pidx as usize) as usize].v }, - weight: { - (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(pidx as usize) as usize].weight - }, + u: ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((pidx as usize) as isize) + .with(|__s| __s.u), + v: ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((pidx as usize) as isize) + .with(|__s| __s.v), + weight: ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((pidx as usize) as isize) + .with(|__s| __s.weight), }; let __rhs = Edge { - u: { (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(start as usize) as usize].u }, - v: { (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(start as usize) as usize].v }, - weight: { - (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(start as usize) as usize].weight - }, - }; - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut()[(pidx as usize) as usize] = __rhs; - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut()[(start as usize) as usize] = Edge { - u: tmp.u, - v: tmp.v, - weight: tmp.weight, + u: ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((start as usize) as isize) + .with(|__s| __s.u), + v: ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((start as usize) as isize) + .with(|__s| __s.v), + weight: ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((start as usize) as isize) + .with(|__s| __s.weight), }; + ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((pidx as usize) as isize) + .write(__rhs); + ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((start as usize) as isize) + .write(Edge { + u: tmp.u, + v: tmp.v, + weight: tmp.weight, + }); let mut i: i32 = start; let mut j: i32 = end; 'loop_: while (i < pidx) && (j > pidx) { 'loop_: while ({ - { (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(i as usize) as usize].weight } + ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .with(|__s| __s.weight) } <= { pivot.with(|__s| __s.weight) }) { i.prefix_inc(); } 'loop_: while ({ - { (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(j as usize) as usize].weight } + ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((j as usize) as isize) + .with(|__s| __s.weight) } > { pivot.with(|__s| __s.weight) }) { j.prefix_dec(); } if (i < pidx) && (j > pidx) { tmp = Edge { - u: { (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(i as usize) as usize].u }, - v: { (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(i as usize) as usize].v }, - weight: { - (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(i as usize) as usize] - .weight - }, + u: ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .with(|__s| __s.u), + v: ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .with(|__s| __s.v), + weight: ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .with(|__s| __s.weight), }; let __rhs = Edge { - u: { (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(j as usize) as usize].u }, - v: { (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(j as usize) as usize].v }, - weight: { - (*arr.upgrade().deref()).as_ref().unwrap().borrow()[(j as usize) as usize] - .weight - }, - }; - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut()[(i as usize) as usize] = __rhs; - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut()[(j as usize) as usize] = Edge { - u: tmp.u, - v: tmp.v, - weight: tmp.weight, + u: ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((j as usize) as isize) + .with(|__s| __s.u), + v: ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((j as usize) as isize) + .with(|__s| __s.v), + weight: ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((j as usize) as isize) + .with(|__s| __s.weight), }; + ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(__rhs); + ((*arr.upgrade().deref()).as_pointer() as Ptr) + .offset((j as usize) as isize) + .write(Edge { + u: tmp.u, + v: tmp.v, + weight: tmp.weight, + }); i.postfix_inc(); j.postfix_dec(); } @@ -186,30 +210,15 @@ pub fn MSTKruskal_2(graph: Ptr) -> f64 { let mut total_weight: f64 = 0_f64; let mut i: i32 = 0; 'loop_: while ({ i } < { graph.with(|__s| __s.E) }) { - let mut x: i32 = { - graph - .with(|__s| __s.edges.clone()) - .as_ref() - .unwrap() - .borrow()[(i as usize) as usize] - .u - }; - let mut y: i32 = { - graph - .with(|__s| __s.edges.clone()) - .as_ref() - .unwrap() - .borrow()[(i as usize) as usize] - .v - }; - let mut w: f64 = { - graph - .with(|__s| __s.edges.clone()) - .as_ref() - .unwrap() - .borrow()[(i as usize) as usize] - .weight - }; + let mut x: i32 = (graph.with(|__s| __s.edges.clone()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .with(|__s| __s.u); + let mut y: i32 = (graph.with(|__s| __s.edges.clone()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .with(|__s| __s.v); + let mut w: f64 = (graph.with(|__s| __s.edges.clone()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .with(|__s| __s.weight); if (({ DisjointSetImpl::find(&set.as_pointer(), x) }) != ({ DisjointSetImpl::find(&set.as_pointer(), y) })) { @@ -236,46 +245,41 @@ fn main_0() -> i32 { V: V, E: E, })); - { (*graph.borrow()).edges.clone() } - .as_ref() - .unwrap() - .borrow_mut()[(0_usize) as usize] = Edge { - u: 0, - v: 1, - weight: 10_f64, - }; - { (*graph.borrow()).edges.clone() } - .as_ref() - .unwrap() - .borrow_mut()[(1_usize) as usize] = Edge { - u: 1, - v: 3, - weight: 15_f64, - }; - { (*graph.borrow()).edges.clone() } - .as_ref() - .unwrap() - .borrow_mut()[(2_usize) as usize] = Edge { - u: 2, - v: 3, - weight: 4_f64, - }; - { (*graph.borrow()).edges.clone() } - .as_ref() - .unwrap() - .borrow_mut()[(3_usize) as usize] = Edge { - u: 2, - v: 0, - weight: 6_f64, - }; - { (*graph.borrow()).edges.clone() } - .as_ref() - .unwrap() - .borrow_mut()[(4_usize) as usize] = Edge { - u: 0, - v: 3, - weight: 5_f64, - }; + ({ (*graph.borrow()).edges.clone() }.as_pointer() as Ptr) + .offset(0_usize as isize) + .write(Edge { + u: 0, + v: 1, + weight: 10_f64, + }); + ({ (*graph.borrow()).edges.clone() }.as_pointer() as Ptr) + .offset(1_usize as isize) + .write(Edge { + u: 1, + v: 3, + weight: 15_f64, + }); + ({ (*graph.borrow()).edges.clone() }.as_pointer() as Ptr) + .offset(2_usize as isize) + .write(Edge { + u: 2, + v: 3, + weight: 4_f64, + }); + ({ (*graph.borrow()).edges.clone() }.as_pointer() as Ptr) + .offset(3_usize as isize) + .write(Edge { + u: 2, + v: 0, + weight: 6_f64, + }); + ({ (*graph.borrow()).edges.clone() }.as_pointer() as Ptr) + .offset(4_usize as isize) + .write(Edge { + u: 0, + v: 3, + weight: 5_f64, + }); let mut total_weight: f64 = ({ MSTKruskal_2(graph.as_pointer()) }); assert!((total_weight == 19_f64)); return 0; @@ -291,46 +295,34 @@ impl DisjointSetImpl for Ptr { let mut i: i32 = 0; 'loop_: while (i < (*self).with(|__s| __s.n)) { let __rhs = i; - (*self) - .with(|__s| __s.parent.clone()) - .as_ref() - .unwrap() - .borrow_mut()[(i as usize) as usize] = __rhs; - (*self) - .with(|__s| __s.rank.clone()) - .as_ref() - .unwrap() - .borrow_mut()[(i as usize) as usize] = 1; + ((*self).with(|__s| __s.parent.clone()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(__rhs); + ((*self).with(|__s| __s.rank.clone()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(1); i.postfix_inc(); } } fn find(&self, mut x: i32) -> i32 { - if ((*self) - .with(|__s| __s.parent.clone()) - .as_ref() - .unwrap() - .borrow()[(x as usize) as usize] + if ((((*self).with(|__s| __s.parent.clone()).as_pointer() as Ptr) + .offset((x as usize) as isize) + .read()) != x) { let __rhs = ({ - let _x: i32 = (*self) - .with(|__s| __s.parent.clone()) - .as_ref() - .unwrap() - .borrow()[(x as usize) as usize]; + let _x: i32 = (((*self).with(|__s| __s.parent.clone()).as_pointer() as Ptr) + .offset((x as usize) as isize) + .read()); DisjointSetImpl::find(self, _x) }); - (*self) - .with(|__s| __s.parent.clone()) - .as_ref() - .unwrap() - .borrow_mut()[(x as usize) as usize] = __rhs; + ((*self).with(|__s| __s.parent.clone()).as_pointer() as Ptr) + .offset((x as usize) as isize) + .write(__rhs); } - return (*self) - .with(|__s| __s.parent.clone()) - .as_ref() - .unwrap() - .borrow()[(x as usize) as usize]; + return (((*self).with(|__s| __s.parent.clone()).as_pointer() as Ptr) + .offset((x as usize) as isize) + .read()); } fn merge(&self, mut x: i32, mut y: i32) { let mut xset: i32 = ({ DisjointSetImpl::find(self, x) }); @@ -338,55 +330,37 @@ impl DisjointSetImpl for Ptr { if (xset == yset) { return; } - if ((*self) - .with(|__s| __s.rank.clone()) - .as_ref() - .unwrap() - .borrow()[(xset as usize) as usize] - < (*self) - .with(|__s| __s.rank.clone()) - .as_ref() - .unwrap() - .borrow()[(yset as usize) as usize]) + if ((((*self).with(|__s| __s.rank.clone()).as_pointer() as Ptr) + .offset((xset as usize) as isize) + .read()) + < (((*self).with(|__s| __s.rank.clone()).as_pointer() as Ptr) + .offset((yset as usize) as isize) + .read())) { - (*self) - .with(|__s| __s.parent.clone()) - .as_ref() - .unwrap() - .borrow_mut()[(xset as usize) as usize] = yset; - } else if ((*self) - .with(|__s| __s.rank.clone()) - .as_ref() - .unwrap() - .borrow()[(xset as usize) as usize] - > (*self) - .with(|__s| __s.rank.clone()) - .as_ref() - .unwrap() - .borrow()[(yset as usize) as usize]) + ((*self).with(|__s| __s.parent.clone()).as_pointer() as Ptr) + .offset((xset as usize) as isize) + .write(yset); + } else if ((((*self).with(|__s| __s.rank.clone()).as_pointer() as Ptr) + .offset((xset as usize) as isize) + .read()) + > (((*self).with(|__s| __s.rank.clone()).as_pointer() as Ptr) + .offset((yset as usize) as isize) + .read())) { - (*self) - .with(|__s| __s.parent.clone()) - .as_ref() - .unwrap() - .borrow_mut()[(yset as usize) as usize] = xset; + ((*self).with(|__s| __s.parent.clone()).as_pointer() as Ptr) + .offset((yset as usize) as isize) + .write(xset); } else { - (*self) - .with(|__s| __s.parent.clone()) - .as_ref() - .unwrap() - .borrow_mut()[(yset as usize) as usize] = xset; - let __rhs = ((*self) - .with(|__s| __s.rank.clone()) - .as_ref() - .unwrap() - .borrow()[(xset as usize) as usize] + ((*self).with(|__s| __s.parent.clone()).as_pointer() as Ptr) + .offset((yset as usize) as isize) + .write(xset); + let __rhs = ((((*self).with(|__s| __s.rank.clone()).as_pointer() as Ptr) + .offset((xset as usize) as isize) + .read()) + 1); - (*self) - .with(|__s| __s.rank.clone()) - .as_ref() - .unwrap() - .borrow_mut()[(xset as usize) as usize] = __rhs; + ((*self).with(|__s| __s.rank.clone()).as_pointer() as Ptr) + .offset((xset as usize) as isize) + .write(__rhs); } } fn move_assign(&self, _a0: Ptr) -> Ptr { diff --git a/tests/unit/out/refcount/lambda_capture_library_types.rs b/tests/unit/out/refcount/lambda_capture_library_types.rs index be1be47d0..0d1a9a4e0 100644 --- a/tests/unit/out/refcount/lambda_capture_library_types.rs +++ b/tests/unit/out/refcount/lambda_capture_library_types.rs @@ -32,7 +32,7 @@ fn main_0() -> i32 { }, || -> i32 { return if !((*u.borrow()).as_pointer()).is_null() { - (*(*u.borrow()).as_ref().unwrap().borrow()) + ((*u.borrow()).as_pointer().read()) } else { 0 }; diff --git a/tests/unit/out/refcount/matmul.rs b/tests/unit/out/refcount/matmul.rs index 786ac735c..ab520533e 100644 --- a/tests/unit/out/refcount/matmul.rs +++ b/tests/unit/out/refcount/matmul.rs @@ -18,7 +18,7 @@ pub fn matalloc_0( ))); let mut i: i32 = 0; 'loop_: while (i < n) { - ((m.as_ref().unwrap().as_pointer().offset((i as usize))).clone() + ((m.as_pointer() as Ptr>>>).offset((i as usize) as isize) as Ptr>>>) .write( Some(Rc::new(RefCell::new( @@ -30,10 +30,13 @@ pub fn matalloc_0( ); let mut j: i32 = 0; 'loop_: while (j < p) { - m.as_ref().unwrap().borrow()[(i as usize) as usize] - .as_ref() - .unwrap() - .borrow_mut()[(j as usize) as usize] = e; + ((*(m.as_pointer() as Ptr>>>) + .offset((i as usize) as isize) + .upgrade() + .deref()) + .as_pointer() as Ptr) + .offset((j as usize) as isize) + .write(e); j.prefix_inc(); } i.prefix_inc(); @@ -56,20 +59,29 @@ pub fn matmul_1( 'loop_: while (j < p2) { let mut k: i32 = 0; 'loop_: while (k < p1) { - sum += (m1.as_ref().unwrap().borrow()[(i as usize) as usize] - .as_ref() - .unwrap() - .borrow()[(k as usize) as usize] - * m2.as_ref().unwrap().borrow()[(k as usize) as usize] - .as_ref() - .unwrap() - .borrow()[(j as usize) as usize]); + sum += ((((*(m1.as_pointer() as Ptr>>>) + .offset((i as usize) as isize) + .upgrade() + .deref()) + .as_pointer() as Ptr) + .offset((k as usize) as isize) + .read()) + * (((*(m2.as_pointer() as Ptr>>>) + .offset((k as usize) as isize) + .upgrade() + .deref()) + .as_pointer() as Ptr) + .offset((j as usize) as isize) + .read())); k.prefix_inc(); } - m3.as_ref().unwrap().borrow()[(i as usize) as usize] - .as_ref() - .unwrap() - .borrow_mut()[(j as usize) as usize] = sum; + ((*(m3.as_pointer() as Ptr>>>) + .offset((i as usize) as isize) + .upgrade() + .deref()) + .as_pointer() as Ptr) + .offset((j as usize) as isize) + .write(sum); j.prefix_inc(); } i.prefix_inc(); @@ -97,10 +109,13 @@ fn main_0() -> i32 { matmul_1(_m1, _n1, _p1, _m2, _n2, _p2) }); assert!( - (m3.as_ref().unwrap().borrow()[(0_usize) as usize] - .as_ref() - .unwrap() - .borrow()[(0_usize) as usize] + ((((*(m3.as_pointer() as Ptr>>>) + .offset(0_usize as isize) + .upgrade() + .deref()) + .as_pointer() as Ptr) + .offset(0_usize as isize) + .read()) == 20) ); return 0; diff --git a/tests/unit/out/refcount/references2.rs b/tests/unit/out/refcount/references2.rs index 277ff7aa0..6012a885e 100644 --- a/tests/unit/out/refcount/references2.rs +++ b/tests/unit/out/refcount/references2.rs @@ -17,7 +17,7 @@ pub fn main() { fn main_0() -> i32 { let a: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(5))))); ({ change_0(a.as_pointer()) }); - assert!(((*(*a.borrow()).as_ref().unwrap().borrow()) == 7)); + assert!((((*a.borrow()).as_pointer().read()) == 7)); return 0; } pub fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/refcount/unique_ptr.rs b/tests/unit/out/refcount/unique_ptr.rs index c37b659d3..c24143f43 100644 --- a/tests/unit/out/refcount/unique_ptr.rs +++ b/tests/unit/out/refcount/unique_ptr.rs @@ -31,7 +31,7 @@ pub struct Pair { pub fn DoStuffWithSafePointer_0(safe_ptr: Ptr>>) { let x1: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(0))))); let x2: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(0))))); - (*(*x2.borrow()).as_ref().unwrap().borrow_mut()) = 1; + (*x2.borrow()).as_pointer().write(1); (x1.as_pointer() as Ptr>>).write((*x2.borrow_mut()).take()); let mut raw_ptr1: Ptr = ((*x1.borrow()).as_pointer()); raw_ptr1.with_mut(|__v| __v.prefix_inc()); @@ -41,9 +41,8 @@ pub fn DoStuffWithSafePointer_0(safe_ptr: Ptr>>) { ({ SafePointerImpl::inc(&((*safe_ptr.upgrade().deref()).as_pointer())) }); let x3: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(10))))); let x4: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(20))))); - let __rhs = ((*(*x3.borrow()).as_ref().unwrap().borrow()) - + (*(*x4.borrow()).as_ref().unwrap().borrow())); - (*(*x3.borrow()).as_ref().unwrap().borrow_mut()) = __rhs; + let __rhs = (((*x3.borrow()).as_pointer().read()) + ((*x4.borrow()).as_pointer().read())); + (*x3.borrow()).as_pointer().write(__rhs); (x4.as_pointer() as Ptr>>).write((*x3.borrow_mut()).take()); let mut raw_ptr2: Ptr = ((*x4.borrow()).as_pointer()); { @@ -56,34 +55,29 @@ pub fn DoStuffWithSafePointer_0(safe_ptr: Ptr>>) { ({ PairImpl::inc(&(pair.as_pointer()), 10) }); let __rhs = ({ ({ - (*{ - (*(*safe_ptr.upgrade().deref()).as_ref().unwrap().borrow()) - .ptr - .clone() - } - .as_ref() - .unwrap() - .borrow()) - } + { { (*pair.as_ref().unwrap().borrow()).x } }) - } + { { (*pair.as_ref().unwrap().borrow()).y } }); - (*{ - (*(*safe_ptr.upgrade().deref()).as_ref().unwrap().borrow()) - .ptr - .clone() - } - .as_ref() - .unwrap() - .borrow_mut()) = __rhs; + ((*safe_ptr.upgrade().deref()) + .as_pointer() + .with(|__s| (__s).ptr.clone()) + .as_pointer() + .read()) + } + { pair.as_pointer().with(|__s| (__s).x) }) + } + { pair.as_pointer().with(|__s| (__s).y) }); + (*safe_ptr.upgrade().deref()) + .as_pointer() + .with(|__s| (__s).ptr.clone()) + .as_pointer() + .write(__rhs); } pub fn Consume_1(safe_ptr: Option>) -> i32 { let safe_ptr: Value>> = Rc::new(RefCell::new(safe_ptr)); let mut x: Option> = (*safe_ptr.borrow_mut()).take(); let mut p: Option> = Ptr::alloc(::default()).to_owned_opt(); - return ((*{ (*x.as_ref().unwrap().borrow()).ptr.clone() } - .as_ref() - .unwrap() - .borrow()) - + { (*p.as_ref().unwrap().borrow()).x }); + return ((x + .as_pointer() + .with(|__s| (__s).ptr.clone()) + .as_pointer() + .read()) + + p.as_pointer().with(|__s| __s.x)); } pub fn RndStuff_2() { let mut x1: Option>> = None; @@ -92,7 +86,9 @@ pub fn RndStuff_2() { )); let mut i: i32 = 0; 'loop_: while (i < 100) { - (*x2.borrow()).as_ref().unwrap().borrow_mut()[(i as usize) as usize] = 1; + ((*x2.borrow()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(1); i.prefix_inc(); } (x2.as_pointer() as Ptr>>>).write( @@ -100,7 +96,9 @@ pub fn RndStuff_2() { ); let mut i: i32 = 0; 'loop_: while (i < 200) { - (*x2.borrow()).as_ref().unwrap().borrow_mut()[(i as usize) as usize] = 2; + ((*x2.borrow()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(2); i.prefix_inc(); } let mut p2: Ptr = (*x2.borrow()).as_pointer(); @@ -116,7 +114,9 @@ pub fn RndStuff_2() { ))))); let mut i: i32 = 0; 'loop_: while (i < 10) { - (*x3.borrow()).as_ref().unwrap().borrow_mut()[(i as usize) as usize] = Pair { x: 1, y: 2 }; + ((*x3.borrow()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(Pair { x: 1, y: 2 }); i.prefix_inc(); } let mut p3_0: Ptr = (*x3.borrow()).as_pointer(); @@ -126,11 +126,7 @@ pub fn RndStuff_2() { assert!((elem!(p3_0, i).with(|__s| __s.y) == 2)); ({ PairImpl::inc( - &(*x3.borrow()) - .as_ref() - .unwrap() - .as_pointer() - .offset((i as usize)), + &((*x3.borrow()).as_pointer() as Ptr).offset((i as usize) as isize), 10, ) }); @@ -148,10 +144,12 @@ pub fn RndStuff_2() { ); let mut i: i32 = 0; 'loop_: while (i < 50) { - (*x3.borrow()).as_ref().unwrap().borrow_mut()[(i as usize) as usize] = Pair { - x: -1_i32, - y: -2_i32, - }; + ((*x3.borrow()).as_pointer() as Ptr) + .offset((i as usize) as isize) + .write(Pair { + x: -1_i32, + y: -2_i32, + }); i.prefix_inc(); } let mut p3_1: Ptr = (*x3.borrow()).as_pointer(); @@ -162,11 +160,7 @@ pub fn RndStuff_2() { assert!((elem!(p3_1, i).with(|__s| __s.y) == -2_i32)); ({ PairImpl::inc( - &(*x3.borrow()) - .as_ref() - .unwrap() - .as_pointer() - .offset((i as usize)), + &((*x3.borrow()).as_pointer() as Ptr).offset((i as usize) as isize), -10_i32, ) }); @@ -210,12 +204,10 @@ pub trait SafePointerImpl { } impl SafePointerImpl for Ptr { fn inc(&self) { - (*(*self) + (*self) .with(|__s| __s.ptr.clone()) - .as_ref() - .unwrap() - .borrow_mut()) - .prefix_inc(); + .as_pointer() + .with_mut(|__v| __v.prefix_inc()); } fn move_assign(&self, _a0: Ptr) -> Ptr { (field_ptr!((*self), ptr) as Ptr>>) diff --git a/tests/unit/out/refcount/unique_ptr_const_deref.rs b/tests/unit/out/refcount/unique_ptr_const_deref.rs index 55240cf54..9ad07cc00 100644 --- a/tests/unit/out/refcount/unique_ptr_const_deref.rs +++ b/tests/unit/out/refcount/unique_ptr_const_deref.rs @@ -21,10 +21,10 @@ impl Holder { } } pub fn read_val_0(mut h: Ptr) -> i32 { - return (*h.with(|__s| __s.val.clone()).as_ref().unwrap().borrow()); + return (h.with(|__s| __s.val.clone()).as_pointer().read()); } pub fn write_val_1(mut h: Ptr, mut v: i32) { - (*h.with(|__s| __s.val.clone()).as_ref().unwrap().borrow_mut()) = v; + h.with(|__s| __s.val.clone()).as_pointer().write(v); } pub fn main() { __cpp2rust_init_globals(); diff --git a/tests/unit/out/refcount/unique_ptr_deref_ops.rs b/tests/unit/out/refcount/unique_ptr_deref_ops.rs index 1d84d5dd3..7d333c831 100644 --- a/tests/unit/out/refcount/unique_ptr_deref_ops.rs +++ b/tests/unit/out/refcount/unique_ptr_deref_ops.rs @@ -12,11 +12,17 @@ pub fn main() { } fn main_0() -> i32 { let mut p: Option> = Some(Rc::new(RefCell::new(10))); - (*p.as_ref().unwrap().borrow_mut()) += 5; - (*p.as_ref().unwrap().borrow_mut()) -= 3; - (*p.as_ref().unwrap().borrow_mut()) *= 2; + { + p.as_pointer().with_mut(|__v| *__v = *__v + 5) + }; + { + p.as_pointer().with_mut(|__v| *__v = *__v - 3) + }; + { + p.as_pointer().with_mut(|__v| *__v = *__v * 2) + }; let mut q: Option> = Some(Rc::new(RefCell::new(1))); - let mut sum: i32 = ((*p.as_ref().unwrap().borrow()) + (*q.as_ref().unwrap().borrow())); + let mut sum: i32 = ((p.as_pointer().read()) + (q.as_pointer().read())); assert!((sum == 25)); return 0; } diff --git a/tests/unit/out/refcount/unique_ptr_field_reset.rs b/tests/unit/out/refcount/unique_ptr_field_reset.rs index a86cb183c..6db12088d 100644 --- a/tests/unit/out/refcount/unique_ptr_field_reset.rs +++ b/tests/unit/out/refcount/unique_ptr_field_reset.rs @@ -41,16 +41,29 @@ fn main_0() -> i32 { let _p: Ptr<_> = Ptr::alloc(Data { v: 3 }); (field_ptr!(hp, data) as Ptr>>).write(_p.to_owned_opt()) }; - assert!(({ (*{ (*h.borrow()).data.clone() }.as_ref().unwrap().borrow()).v } == 3)); + assert!( + ({ (*h.borrow()).data.clone() } + .as_pointer() + .with(|__s| __s.v) + == 3) + ); ({ HolderImpl::set(&h.as_pointer(), Ptr::alloc(Data { v: 4 })) }); - assert!(({ (*hp.with(|__s| __s.data.clone()).as_ref().unwrap().borrow()).v } == 4)); + assert!( + (hp.with(|__s| __s.data.clone()) + .as_pointer() + .with(|__s| __s.v) + == 4) + ); let __rhs = hp.with(|__s| __s.n); - (*hp.with(|__s| __s.data.clone()) - .as_ref() - .unwrap() - .borrow_mut()) - .v += __rhs; - assert!(({ (*{ (*h.borrow()).data.clone() }.as_ref().unwrap().borrow()).v } == 5)); + { + field!(hp.with(|__s| __s.data.clone()).as_pointer(), v).with_mut(|__v| *__v = *__v + __rhs) + }; + assert!( + ({ (*h.borrow()).data.clone() } + .as_pointer() + .with(|__s| __s.v) + == 5) + ); return 0; } pub trait HolderImpl { diff --git a/tests/unit/out/refcount/unique_ptr_nested.rs b/tests/unit/out/refcount/unique_ptr_nested.rs index a8f7dcbcb..6969fc19a 100644 --- a/tests/unit/out/refcount/unique_ptr_nested.rs +++ b/tests/unit/out/refcount/unique_ptr_nested.rs @@ -36,29 +36,24 @@ fn main_0() -> i32 { let mut o: Option> = Some(Rc::new(RefCell::new(Outer { inner: Some(Rc::new(RefCell::new(Inner { x: 10, y: 20 }))), }))); - (*{ (*o.as_ref().unwrap().borrow()).inner.clone() } - .as_ref() - .unwrap() - .borrow_mut()) - .x += 5; - let mut sum: i32 = ({ - (*{ (*o.as_ref().unwrap().borrow()).inner.clone() } - .as_ref() - .unwrap() - .borrow()) - .x - } + { - (*{ (*o.as_ref().unwrap().borrow()).inner.clone() } - .as_ref() - .unwrap() - .borrow()) - .y - }); + { + field!(o.as_pointer().with(|__s| __s.inner.clone()).as_pointer(), x) + .with_mut(|__v| *__v = *__v + 5) + }; + let mut sum: i32 = (o + .as_pointer() + .with(|__s| __s.inner.clone()) + .as_pointer() + .with(|__s| __s.x) + + o.as_pointer() + .with(|__s| __s.inner.clone()) + .as_pointer() + .with(|__s| __s.y)); let mut a: Option> = Some(Rc::new(RefCell::new(100))); let mut b: Option> = Some(Rc::new(RefCell::new(0))); - let __rhs = (*a.as_ref().unwrap().borrow()); - (*b.as_ref().unwrap().borrow_mut()) = __rhs; - assert!(((sum + (*b.as_ref().unwrap().borrow())) == 135)); + let __rhs = (a.as_pointer().read()); + b.as_pointer().write(__rhs); + assert!(((sum + (b.as_pointer().read())) == 135)); return 0; } pub trait OuterImpl { diff --git a/tests/unit/out/refcount/unique_ptr_small.rs b/tests/unit/out/refcount/unique_ptr_small.rs index 8e94698e7..1898f63bb 100644 --- a/tests/unit/out/refcount/unique_ptr_small.rs +++ b/tests/unit/out/refcount/unique_ptr_small.rs @@ -17,7 +17,10 @@ pub fn main() { fn main_0() -> i32 { let n: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(10))))); ({ change_0(n.as_pointer()) }); - assert!(((*(*n.borrow()).as_ref().unwrap().borrow()) == 20)); + assert!((((*n.borrow()).as_pointer().read()) == 20)); + let mut empty: Option> = None; + assert!(empty.is_none()); + assert!((*n.borrow()).is_some()); return 0; } pub fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/refcount/unique_ptr_struct.rs b/tests/unit/out/refcount/unique_ptr_struct.rs index 2ad6fdec9..206bdb514 100644 --- a/tests/unit/out/refcount/unique_ptr_struct.rs +++ b/tests/unit/out/refcount/unique_ptr_struct.rs @@ -23,10 +23,12 @@ pub fn main() { } fn main_0() -> i32 { let mut p: Option> = Some(Rc::new(RefCell::new(Point { x: 3, y: 4 }))); - (*p.as_ref().unwrap().borrow_mut()).x += 10; - let __rhs = ({ (*p.as_ref().unwrap().borrow()).x } + { (*p.as_ref().unwrap().borrow()).y }); - (*p.as_ref().unwrap().borrow_mut()).y = __rhs; - let mut s: i32 = ({ sum_0((*p.as_ref().unwrap().borrow()).clone()) }); + { + field!(p.as_pointer(), x).with_mut(|__v| *__v = *__v + 10) + }; + let __rhs = (p.as_pointer().with(|__s| __s.x) + p.as_pointer().with(|__s| __s.y)); + field!(p.as_pointer(), y).write(__rhs); + let mut s: i32 = ({ sum_0((*p.as_pointer().upgrade().deref()).clone()) }); assert!((s == 30)); return 0; } diff --git a/tests/unit/out/refcount/void_cast.rs b/tests/unit/out/refcount/void_cast.rs index ce1027570..96d41f5b1 100644 --- a/tests/unit/out/refcount/void_cast.rs +++ b/tests/unit/out/refcount/void_cast.rs @@ -122,7 +122,7 @@ fn main_0() -> i32 { (&(*g.borrow_mut())); &(*g.borrow_mut()); ({ unused_noncopyable_param_5(g.as_pointer()) }); - assert!(((*{ (*g.borrow()).value.clone() }.as_ref().unwrap().borrow()) == 9)); + assert!((({ (*g.borrow()).value.clone() }.as_pointer().read()) == 9)); return 0; } pub trait NonCopyableImpl { diff --git a/tests/unit/out/unsafe/07_unique.rs b/tests/unit/out/unsafe/07_unique.rs index e27a68d59..a7970bfbd 100644 --- a/tests/unit/out/unsafe/07_unique.rs +++ b/tests/unit/out/unsafe/07_unique.rs @@ -7,7 +7,8 @@ use std::io::{Read, Seek, Write}; use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; pub unsafe fn fn_0(mut u: Option>) -> Option> { - (*u.as_deref_mut().unwrap()) = 10; + (*u.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) = 10; return u.take(); } pub fn main() { @@ -18,16 +19,24 @@ pub fn main() { } unsafe fn main_0() -> i32 { let mut f: Option> = Some(Box::new(8)); - (*f.as_deref_mut().unwrap()) = 9; + (*f.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) = 9; let mut f_ptr1: *mut i32 = f .as_deref_mut() .map_or(::std::ptr::null_mut(), |v| v as *mut i32); (*f_ptr1) = 10; - let mut f_ptr2: *mut i32 = (&mut (*f.as_deref_mut().unwrap()) as *mut i32); + let mut f_ptr2: *mut i32 = (&mut (*f + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + as *mut i32); (*f_ptr2) = 11; f = Some(Box::new(9)).take(); f = (unsafe { fn_0(f.take()) }).take(); - assert!(((*f.as_deref_mut().unwrap()) == (10))); + assert!( + ((*f.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + == (10)) + ); return 0; } pub unsafe fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/unsafe/08_unique_array.rs b/tests/unit/out/unsafe/08_unique_array.rs index 52325f4c3..37efd0417 100644 --- a/tests/unit/out/unsafe/08_unique_array.rs +++ b/tests/unit/out/unsafe/08_unique_array.rs @@ -15,14 +15,28 @@ pub fn main() { unsafe fn main_0() -> i32 { let mut g: Option> = Some((0..2_usize).map(|_| ::default()).collect::>()); - g.as_mut().unwrap()[(0_usize)] = 11; - g.as_mut().unwrap()[(1_usize)] = 12; + (*g.as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(0_usize)) = 11; + (*g.as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(1_usize)) = 12; let mut g_ptr: *mut i32 = g .as_deref_mut() .map_or(::std::ptr::null_mut(), |s| s.as_mut_ptr()); (*g_ptr.offset((0) as isize)) = 13; (*g_ptr.offset((1) as isize)) = 14; - assert!((((g.as_mut().unwrap()[(0_usize)]) + (g.as_mut().unwrap()[(1_usize)])) == (27))); + assert!( + (((*g + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(0_usize)) + + (*g + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(1_usize))) + == (27)) + ); return 0; } pub unsafe fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/unsafe/11_move.rs b/tests/unit/out/unsafe/11_move.rs index e9774a476..6cfc19d49 100644 --- a/tests/unit/out/unsafe/11_move.rs +++ b/tests/unit/out/unsafe/11_move.rs @@ -24,7 +24,11 @@ pub fn main() { unsafe fn main_0() -> i32 { let mut n: Option> = Some(Box::new(10)); (unsafe { change_0(&mut n) }); - assert!(((*n.as_deref_mut().unwrap()) == (20))); + assert!( + ((*n.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + == (20)) + ); return 0; } pub unsafe fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/unsafe/alloc_array.rs b/tests/unit/out/unsafe/alloc_array.rs index ef7c2dbde..2e969ff6e 100644 --- a/tests/unit/out/unsafe/alloc_array.rs +++ b/tests/unit/out/unsafe/alloc_array.rs @@ -14,7 +14,10 @@ pub unsafe fn All_0(arr: *mut Option>, mut N: i32, mut element: i32) ); let mut i: i32 = 0; 'loop_: while ((i) < (N)) { - all.as_mut().unwrap()[(i as usize)] = element; + (*all + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((i as usize))) = element; i.prefix_inc(); } (*arr) = all.take(); @@ -23,7 +26,10 @@ pub unsafe fn Consume_1(mut arr: Option>, mut N: i32) -> i32 { let mut sum: i32 = 0; let mut i: i32 = -1_i32; 'loop_: while ((i.prefix_inc()) < (N)) { - sum += arr.as_mut().unwrap()[(i as usize)]; + sum += (*arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((i as usize))); } return sum; } diff --git a/tests/unit/out/unsafe/bst.rs b/tests/unit/out/unsafe/bst.rs index 4996e7baa..125c49071 100644 --- a/tests/unit/out/unsafe/bst.rs +++ b/tests/unit/out/unsafe/bst.rs @@ -66,11 +66,41 @@ unsafe fn main_0() -> i32 { right: std::ptr::null_mut(), value: 4, })); - let mut ptr1: *mut node_t = (&mut (*tree.as_deref_mut().unwrap()) as *mut node_t); - ptr1 = (unsafe { insert_1(ptr1, (&mut (*n1.as_deref_mut().unwrap()) as *mut node_t)) }); - ptr1 = (unsafe { insert_1(ptr1, (&mut (*n2.as_deref_mut().unwrap()) as *mut node_t)) }); - ptr1 = (unsafe { insert_1(ptr1, (&mut (*n3.as_deref_mut().unwrap()) as *mut node_t)) }); - ptr1 = (unsafe { insert_1(ptr1, (&mut (*n4.as_deref_mut().unwrap()) as *mut node_t)) }); + let mut ptr1: *mut node_t = (&mut (*tree.as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const node_t as *mut node_t + })) as *mut node_t); + ptr1 = (unsafe { + insert_1( + ptr1, + (&mut (*n1.as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const node_t as *mut node_t + })) as *mut node_t), + ) + }); + ptr1 = (unsafe { + insert_1( + ptr1, + (&mut (*n2.as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const node_t as *mut node_t + })) as *mut node_t), + ) + }); + ptr1 = (unsafe { + insert_1( + ptr1, + (&mut (*n3.as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const node_t as *mut node_t + })) as *mut node_t), + ) + }); + ptr1 = (unsafe { + insert_1( + ptr1, + (&mut (*n4.as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const node_t as *mut node_t + })) as *mut node_t), + ) + }); assert!( (((((((*(unsafe { find_0(ptr1, 0,) })).value) == (0)) && (((*(unsafe { find_0(ptr1, 1,) })).value) == (1))) diff --git a/tests/unit/out/unsafe/copy_move_defaulted.rs b/tests/unit/out/unsafe/copy_move_defaulted.rs index b64ddf832..2083dd181 100644 --- a/tests/unit/out/unsafe/copy_move_defaulted.rs +++ b/tests/unit/out/unsafe/copy_move_defaulted.rs @@ -346,7 +346,11 @@ unsafe fn main_0() -> i32 { let mut o2: Owner = Owner::move_from({ &mut o1 }); assert!( ((((o2.n) == (5)) && ((o2.data.len()) == (1_usize))) && ((o2.arr[(1) as usize]) == (6))) - && ((*o2.p.as_deref_mut().unwrap()) == (7)) + && ((*o2 + .p + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + == (7)) ); assert!( (o1.data.is_empty()) @@ -360,7 +364,11 @@ unsafe fn main_0() -> i32 { (unsafe { Owner::move_assign(&mut o3, &mut o2) }); assert!( ((((o3.n) == (5)) && ((o3.data[(0_usize)]) == (5))) && ((o3.arr[(0) as usize]) == (5))) - && ((*o3.p.as_deref_mut().unwrap()) == (7)) + && ((*o3 + .p + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + == (7)) ); assert!( (o2.data.is_empty()) @@ -383,7 +391,12 @@ unsafe fn main_0() -> i32 { let mut h2: Holder = Holder::move_from({ &mut h1 }); let _dtor_h2 = ScopedDestructorUnsafe::new(&raw mut h2, Holder::destructor); assert!( - ((((h2.inner.x) == (4)) && ((h2.e.v) == (4))) && ((*h2.p.as_deref_mut().unwrap()) == (9))) + ((((h2.inner.x) == (4)) && ((h2.e.v) == (4))) + && ((*h2 + .p + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + == (9))) && ((h1 .p .as_deref_mut() @@ -395,7 +408,11 @@ unsafe fn main_0() -> i32 { (unsafe { Holder::move_assign(&mut h3, &mut h2) }); assert!( ((((h3.inner.x) == (4)) && ((h3.e.arr[(1) as usize]) == (5))) - && ((*h3.p.as_deref_mut().unwrap()) == (9))) + && ((*h3 + .p + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + == (9))) && ((h2 .p .as_deref_mut() diff --git a/tests/unit/out/unsafe/fft.rs b/tests/unit/out/unsafe/fft.rs index d3a7a5833..6c7b71ce4 100644 --- a/tests/unit/out/unsafe/fft.rs +++ b/tests/unit/out/unsafe/fft.rs @@ -40,9 +40,19 @@ pub unsafe fn fft_3(a: *mut Option>, mut N: i32) -> Option>(), ); if ((N) == (1)) { - y.as_mut().unwrap()[(0_usize)] = Complex { - re: (*a).as_mut().unwrap()[(0_usize)].re, - img: (*a).as_mut().unwrap()[(0_usize)].img, + (*y.as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Complex) + .add(0_usize)) = Complex { + re: (*(*a) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Complex) + .add(0_usize)) + .re, + img: (*(*a) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Complex) + .add(0_usize)) + .img, }; return y.take(); } @@ -55,7 +65,9 @@ pub unsafe fn fft_3(a: *mut Option>, mut N: i32) -> Option>, mut N: i32) -> Option>, mut N: i32) -> Option i32 { ); let mut i: i32 = 0; 'loop_: while ((i) < (N)) { - a.as_mut().unwrap()[(i as usize)] = Complex { + (*a.as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Complex) + .add((i as usize))) = Complex { re: ((i as f64) + (1_f64)), img: 0_f64, }; @@ -155,21 +211,67 @@ unsafe fn main_0() -> i32 { ); let mut i: i32 = 0; 'loop_: while ((i) < (N)) { - reals.as_mut().unwrap()[(i as usize)] = - (b.as_mut().unwrap()[(i as usize)].re.round() as i32); - imgs.as_mut().unwrap()[(i as usize)] = - (b.as_mut().unwrap()[(i as usize)].img.round() as i32); + (*reals + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((i as usize))) = ((*b + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Complex) + .add((i as usize))) + .re + .round() as i32); + (*imgs + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((i as usize))) = ((*b + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Complex) + .add((i as usize))) + .img + .round() as i32); i.prefix_inc(); } assert!( - ((((((((reals.as_mut().unwrap()[(0_usize)]) == (10)) - && ((imgs.as_mut().unwrap()[(0_usize)]) == (0))) - && ((reals.as_mut().unwrap()[(1_usize)]) == (-2_i32))) - && ((imgs.as_mut().unwrap()[(1_usize)]) == (2))) - && ((reals.as_mut().unwrap()[(2_usize)]) == (-2_i32))) - && ((imgs.as_mut().unwrap()[(2_usize)]) == (0))) - && ((reals.as_mut().unwrap()[(3_usize)]) == (-2_i32))) - && ((imgs.as_mut().unwrap()[(3_usize)]) == (-2_i32)) + ((((((((*reals + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(0_usize)) + == (10)) + && ((*imgs + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(0_usize)) + == (0))) + && ((*reals + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(1_usize)) + == (-2_i32))) + && ((*imgs + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(1_usize)) + == (2))) + && ((*reals + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(2_usize)) + == (-2_i32))) + && ((*imgs + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(2_usize)) + == (0))) + && ((*reals + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(3_usize)) + == (-2_i32))) + && ((*imgs + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(3_usize)) + == (-2_i32)) ); return 0; } diff --git a/tests/unit/out/unsafe/huffman.rs b/tests/unit/out/unsafe/huffman.rs index 3aa308a59..9633487d8 100644 --- a/tests/unit/out/unsafe/huffman.rs +++ b/tests/unit/out/unsafe/huffman.rs @@ -50,44 +50,109 @@ pub struct MinHeap { } impl MinHeap { pub unsafe fn Alloc(&mut self, mut data: libc::c_char, mut freq: i32) -> *mut MinHeapNode { - self.alloc.as_mut().unwrap()[(self.next as usize)] = MinHeapNode { + (*self + .alloc + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut MinHeapNode) + .add((self.next as usize))) = MinHeapNode { data: data, freq: freq, left: std::ptr::null_mut(), right: std::ptr::null_mut(), }; - return (&mut self.alloc.as_mut().unwrap()[(self.next.postfix_inc() as usize)] - as *mut MinHeapNode); + return (&mut (*self + .alloc + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut MinHeapNode) + .add((self.next.postfix_inc() as usize))) as *mut MinHeapNode); } pub unsafe fn Heapify(&mut self, mut idx: i32) { let mut smallest: i32 = idx; let mut left: i32 = (((2) * (idx)) + (1)); let mut right: i32 = (((2) * (idx)) + (2)); if ((left) < (self.size)) - && (((*self.arr.as_mut().unwrap()[(left as usize)]).freq) - < ((*self.arr.as_mut().unwrap()[(smallest as usize)]).freq)) + && (((*(*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add((left as usize)))) + .freq) + < ((*(*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add((smallest as usize)))) + .freq)) { smallest = left; } if ((right) < (self.size)) - && (((*self.arr.as_mut().unwrap()[(right as usize)]).freq) - < ((*self.arr.as_mut().unwrap()[(smallest as usize)]).freq)) + && (((*(*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add((right as usize)))) + .freq) + < ((*(*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add((smallest as usize)))) + .freq)) { smallest = right; } if ((smallest) != (idx)) { (unsafe { - let _a: *mut MinHeapNode = &mut (*self.arr.as_mut().unwrap()[(smallest as usize)]); - let _b: *mut MinHeapNode = &mut (*self.arr.as_mut().unwrap()[(idx as usize)]); + let _a: *mut MinHeapNode = &mut (*(*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add((smallest as usize)))); + let _b: *mut MinHeapNode = &mut (*(*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add((idx as usize)))); Swap_0(_a, _b) }); (unsafe { MinHeap::Heapify(self, smallest) }); } } pub unsafe fn ExtractMin(&mut self) -> *mut MinHeapNode { - let mut out: *mut MinHeapNode = self.arr.as_mut().unwrap()[(0_usize)]; + let mut out: *mut MinHeapNode = (*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add(0_usize)); self.size.prefix_dec(); - self.arr.as_mut().unwrap()[(0_usize)] = self.arr.as_mut().unwrap()[(self.size as usize)]; + (*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add(0_usize)) = (*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add((self.size as usize))); (unsafe { MinHeap::Heapify(self, 0) }); return out; } @@ -96,13 +161,37 @@ impl MinHeap { let mut i: i32 = ((self.size) - (1)); 'loop_: while ((i) != (0)) && (((*node).freq) - < ((*self.arr.as_mut().unwrap()[((((i) - (1)) / (2)) as usize)]).freq)) + < ((*(*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add(((((i) - (1)) / (2)) as usize)))) + .freq)) { - self.arr.as_mut().unwrap()[(i as usize)] = - self.arr.as_mut().unwrap()[((((i) - (1)) / (2)) as usize)]; + (*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add((i as usize))) = (*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add(((((i) - (1)) / (2)) as usize))); i = (((i) - (1)) / (2)); } - self.arr.as_mut().unwrap()[(i as usize)] = node; + (*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add((i as usize))) = node; } pub unsafe fn Build( &mut self, @@ -112,9 +201,21 @@ impl MinHeap { ) { let mut i: i32 = 0; 'loop_: while ((i) < (n)) { - self.arr.as_mut().unwrap()[(self.size.postfix_inc() as usize)] = (unsafe { - let _data: libc::c_char = (*data).as_mut().unwrap()[(i as usize)]; - let _freq: i32 = (*freq).as_mut().unwrap()[(i as usize)]; + (*self + .arr + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut *mut MinHeapNode + }) + .add((self.size.postfix_inc() as usize))) = (unsafe { + let _data: libc::c_char = (*(*data) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut libc::c_char) + .add((i as usize))); + let _freq: i32 = (*(*freq) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((i as usize))); MinHeap::Alloc(self, _data, _freq) }); i.prefix_inc(); @@ -172,23 +273,54 @@ pub unsafe fn Huffman_2( let _data: *mut Option> = data; let _freq: *mut Option> = freq; let _n: i32 = size; - MinHeap::Build(&mut (*minHeap.as_deref_mut().unwrap()), _data, _freq, _n) + MinHeap::Build( + &mut (*minHeap.as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const MinHeap as *mut MinHeap + })), + _data, + _freq, + _n, + ) }); - 'loop_: while (((*minHeap.as_deref_mut().unwrap()).size) != (1)) { - let mut left: *mut MinHeapNode = - (unsafe { MinHeap::ExtractMin(&mut (*minHeap.as_deref_mut().unwrap())) }); - let mut right: *mut MinHeapNode = - (unsafe { MinHeap::ExtractMin(&mut (*minHeap.as_deref_mut().unwrap())) }); + 'loop_: while (((*minHeap.as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const MinHeap as *mut MinHeap + })) + .size) + != (1)) + { + let mut left: *mut MinHeapNode = (unsafe { + MinHeap::ExtractMin( + &mut (*minHeap.as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const MinHeap as *mut MinHeap + })), + ) + }); + let mut right: *mut MinHeapNode = (unsafe { + MinHeap::ExtractMin( + &mut (*minHeap.as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const MinHeap as *mut MinHeap + })), + ) + }); let mut top: *mut MinHeapNode = (unsafe { MinHeap::Alloc( - &mut (*minHeap.as_deref_mut().unwrap()), + &mut (*minHeap.as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const MinHeap as *mut MinHeap + })), ('$' as libc::c_char), (((*left).freq) + ((*right).freq)), ) }); (*top).left = left; (*top).right = right; - (unsafe { MinHeap::Insert(&mut (*minHeap.as_deref_mut().unwrap()), top) }); + (unsafe { + MinHeap::Insert( + &mut (*minHeap.as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const MinHeap as *mut MinHeap + })), + top, + ) + }); } return minHeap.take(); } @@ -198,14 +330,31 @@ pub unsafe fn CollectCode_3( out: *mut Option>, next: *mut i32, ) { - (*out).as_mut().unwrap()[((*next) as usize)] = 0; + (*(*out) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(((*next) as usize))) = 0; let mut i: i32 = 0; 'loop_: while ((i) < (top)) { - (*out).as_mut().unwrap()[((*next) as usize)] = - (((*out).as_mut().unwrap()[((*next) as usize)]) * (10)); - (*out).as_mut().unwrap()[((*next) as usize)] = (((*out).as_mut().unwrap() - [((*next) as usize)]) - + ((*arr).as_mut().unwrap()[(i as usize)])); + (*(*out) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(((*next) as usize))) = ((*(*out) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(((*next) as usize))) + * (10)); + (*(*out) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(((*next) as usize))) = ((*(*out) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(((*next) as usize))) + + (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((i as usize)))); i.prefix_inc(); } (*next).prefix_inc(); @@ -218,7 +367,10 @@ pub unsafe fn CollectCodes_4( next: *mut i32, ) { if !(((*root).left).is_null()) { - (*arr).as_mut().unwrap()[(top as usize)] = 0; + (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((top as usize))) = 0; (unsafe { let _root: *mut MinHeapNode = (*root).left; let _arr: *mut Option> = arr; @@ -229,7 +381,10 @@ pub unsafe fn CollectCodes_4( }); } if !(((*root).right).is_null()) { - (*arr).as_mut().unwrap()[(top as usize)] = 1; + (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((top as usize))) = 1; (unsafe { let _root: *mut MinHeapNode = (*root).right; let _arr: *mut Option> = arr; @@ -260,8 +415,13 @@ pub unsafe fn HuffmanCodes_5( let _size: i32 = size; Huffman_2(_data, _freq, _size) }); - let mut root: *mut MinHeapNode = - (unsafe { MinHeap::ExtractMin(&mut (*minHeap.as_deref_mut().unwrap())) }); + let mut root: *mut MinHeapNode = (unsafe { + MinHeap::ExtractMin( + &mut (*minHeap.as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const MinHeap as *mut MinHeap + })), + ) + }); let mut arr: Option> = Some( (0..100_usize) .map(|_| ::default()) @@ -306,18 +466,48 @@ unsafe fn main_0() -> i32 { ); let mut i: i32 = 0; 'loop_: while ((i) < (size)) { - data.as_mut().unwrap()[(i as usize)] = arr1[(i) as usize]; - freq.as_mut().unwrap()[(i as usize)] = arr2[(i) as usize]; + (*data + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut libc::c_char) + .add((i as usize))) = arr1[(i) as usize]; + (*freq + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((i as usize))) = arr2[(i) as usize]; i.prefix_inc(); } let mut out: Option> = (unsafe { HuffmanCodes_5(&mut data, &mut freq, size) }); assert!( - ((((((out.as_mut().unwrap()[(0_usize)]) == (0)) - && ((out.as_mut().unwrap()[(1_usize)]) == (100))) - && ((out.as_mut().unwrap()[(2_usize)]) == (101))) - && ((out.as_mut().unwrap()[(3_usize)]) == (1100))) - && ((out.as_mut().unwrap()[(4_usize)]) == (1101))) - && ((out.as_mut().unwrap()[(5_usize)]) == (111)) + ((((((*out + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(0_usize)) + == (0)) + && ((*out + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(1_usize)) + == (100))) + && ((*out + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(2_usize)) + == (101))) + && ((*out + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(3_usize)) + == (1100))) + && ((*out + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(4_usize)) + == (1101))) + && ((*out + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(5_usize)) + == (111)) ); return 0; } diff --git a/tests/unit/out/unsafe/kruskal.rs b/tests/unit/out/unsafe/kruskal.rs index 854124d5e..84cbdf95c 100644 --- a/tests/unit/out/unsafe/kruskal.rs +++ b/tests/unit/out/unsafe/kruskal.rs @@ -14,27 +14,66 @@ pub struct Edge { pub weight: f64, } pub unsafe fn partition_0(arr: *mut Option>, mut start: i32, mut end: i32) -> i32 { - let pivot: *mut Edge = &mut (*arr).as_mut().unwrap()[(start as usize)]; + let pivot: *mut Edge = &mut (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((start as usize))); let mut count: i32 = 0; let mut i: i32 = ((start) + (1)); 'loop_: while ((i) <= (end)) { - if (((*arr).as_mut().unwrap()[(i as usize)].weight) <= ((*pivot).weight)) { + if (((*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((i as usize))) + .weight) + <= ((*pivot).weight)) + { count.postfix_inc(); } i.prefix_inc(); } let mut pidx: i32 = ((start) + (count)); let mut tmp: Edge = Edge { - u: (*arr).as_mut().unwrap()[(pidx as usize)].u, - v: (*arr).as_mut().unwrap()[(pidx as usize)].v, - weight: (*arr).as_mut().unwrap()[(pidx as usize)].weight, + u: (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((pidx as usize))) + .u, + v: (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((pidx as usize))) + .v, + weight: (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((pidx as usize))) + .weight, }; - (*arr).as_mut().unwrap()[(pidx as usize)] = Edge { - u: (*arr).as_mut().unwrap()[(start as usize)].u, - v: (*arr).as_mut().unwrap()[(start as usize)].v, - weight: (*arr).as_mut().unwrap()[(start as usize)].weight, + (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((pidx as usize))) = Edge { + u: (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((start as usize))) + .u, + v: (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((start as usize))) + .v, + weight: (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((start as usize))) + .weight, }; - (*arr).as_mut().unwrap()[(start as usize)] = Edge { + (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((start as usize))) = Edge { u: tmp.u, v: tmp.v, weight: tmp.weight, @@ -42,24 +81,66 @@ pub unsafe fn partition_0(arr: *mut Option>, mut start: i32, mut end let mut i: i32 = start; let mut j: i32 = end; 'loop_: while ((i) < (pidx)) && ((j) > (pidx)) { - 'loop_: while (((*arr).as_mut().unwrap()[(i as usize)].weight) <= ((*pivot).weight)) { + 'loop_: while (((*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((i as usize))) + .weight) + <= ((*pivot).weight)) + { i.prefix_inc(); } - 'loop_: while (((*arr).as_mut().unwrap()[(j as usize)].weight) > ((*pivot).weight)) { + 'loop_: while (((*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((j as usize))) + .weight) + > ((*pivot).weight)) + { j.prefix_dec(); } if ((i) < (pidx)) && ((j) > (pidx)) { tmp = Edge { - u: (*arr).as_mut().unwrap()[(i as usize)].u, - v: (*arr).as_mut().unwrap()[(i as usize)].v, - weight: (*arr).as_mut().unwrap()[(i as usize)].weight, + u: (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((i as usize))) + .u, + v: (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((i as usize))) + .v, + weight: (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((i as usize))) + .weight, }; - (*arr).as_mut().unwrap()[(i as usize)] = Edge { - u: (*arr).as_mut().unwrap()[(j as usize)].u, - v: (*arr).as_mut().unwrap()[(j as usize)].v, - weight: (*arr).as_mut().unwrap()[(j as usize)].weight, + (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((i as usize))) = Edge { + u: (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((j as usize))) + .u, + v: (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((j as usize))) + .v, + weight: (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((j as usize))) + .weight, }; - (*arr).as_mut().unwrap()[(j as usize)] = Edge { + (*(*arr) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((j as usize))) = Edge { u: tmp.u, v: tmp.v, weight: tmp.weight, @@ -104,19 +185,45 @@ impl DisjointSet { pub unsafe fn makeSet(&mut self) { let mut i: i32 = 0; 'loop_: while ((i) < (self.n)) { - self.parent.as_mut().unwrap()[(i as usize)] = i; - self.rank.as_mut().unwrap()[(i as usize)] = 1; + (*self + .parent + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((i as usize))) = i; + (*self + .rank + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((i as usize))) = 1; i.postfix_inc(); } } pub unsafe fn find(&mut self, mut x: i32) -> i32 { - if ((self.parent.as_mut().unwrap()[(x as usize)]) != (x)) { - self.parent.as_mut().unwrap()[(x as usize)] = (unsafe { - let _x: i32 = self.parent.as_mut().unwrap()[(x as usize)]; + if ((*self + .parent + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((x as usize))) + != (x)) + { + (*self + .parent + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((x as usize))) = (unsafe { + let _x: i32 = (*self + .parent + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((x as usize))); DisjointSet::find(self, _x) }); } - return self.parent.as_mut().unwrap()[(x as usize)]; + return (*self + .parent + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((x as usize))); } pub unsafe fn merge(&mut self, mut x: i32, mut y: i32) { let mut xset: i32 = (unsafe { DisjointSet::find(self, x) }); @@ -124,18 +231,54 @@ impl DisjointSet { if ((xset) == (yset)) { return; } - if ((self.rank.as_mut().unwrap()[(xset as usize)]) - < (self.rank.as_mut().unwrap()[(yset as usize)])) + if ((*self + .rank + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((xset as usize))) + < (*self + .rank + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((yset as usize)))) { - self.parent.as_mut().unwrap()[(xset as usize)] = yset; - } else if ((self.rank.as_mut().unwrap()[(xset as usize)]) - > (self.rank.as_mut().unwrap()[(yset as usize)])) + (*self + .parent + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((xset as usize))) = yset; + } else if ((*self + .rank + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((xset as usize))) + > (*self + .rank + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((yset as usize)))) { - self.parent.as_mut().unwrap()[(yset as usize)] = xset; + (*self + .parent + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((yset as usize))) = xset; } else { - self.parent.as_mut().unwrap()[(yset as usize)] = xset; - self.rank.as_mut().unwrap()[(xset as usize)] = - ((self.rank.as_mut().unwrap()[(xset as usize)]) + (1)); + (*self + .parent + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((yset as usize))) = xset; + (*self + .rank + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((xset as usize))) = ((*self + .rank + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((xset as usize))) + + (1)); } } pub unsafe fn move_from(_a0: *mut DisjointSet) -> Self { @@ -199,9 +342,24 @@ pub unsafe fn MSTKruskal_2(graph: *mut Graph) -> f64 { let mut total_weight: f64 = 0_f64; let mut i: i32 = 0; 'loop_: while ((i) < ((*graph).E)) { - let mut x: i32 = (*graph).edges.as_mut().unwrap()[(i as usize)].u; - let mut y: i32 = (*graph).edges.as_mut().unwrap()[(i as usize)].v; - let mut w: f64 = (*graph).edges.as_mut().unwrap()[(i as usize)].weight; + let mut x: i32 = (*(*graph) + .edges + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((i as usize))) + .u; + let mut y: i32 = (*(*graph) + .edges + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((i as usize))) + .v; + let mut w: f64 = (*(*graph) + .edges + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add((i as usize))) + .weight; if ((unsafe { DisjointSet::find(&mut set, x) }) != (unsafe { DisjointSet::find(&mut set, y) })) { @@ -230,27 +388,47 @@ unsafe fn main_0() -> i32 { V: V, E: E, }; - graph.edges.as_mut().unwrap()[(0_usize)] = Edge { + (*graph + .edges + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add(0_usize)) = Edge { u: 0, v: 1, weight: 10_f64, }; - graph.edges.as_mut().unwrap()[(1_usize)] = Edge { + (*graph + .edges + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add(1_usize)) = Edge { u: 1, v: 3, weight: 15_f64, }; - graph.edges.as_mut().unwrap()[(2_usize)] = Edge { + (*graph + .edges + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add(2_usize)) = Edge { u: 2, v: 3, weight: 4_f64, }; - graph.edges.as_mut().unwrap()[(3_usize)] = Edge { + (*graph + .edges + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add(3_usize)) = Edge { u: 2, v: 0, weight: 6_f64, }; - graph.edges.as_mut().unwrap()[(4_usize)] = Edge { + (*graph + .edges + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Edge) + .add(4_usize)) = Edge { u: 0, v: 3, weight: 5_f64, diff --git a/tests/unit/out/unsafe/lambda_capture_library_types.rs b/tests/unit/out/unsafe/lambda_capture_library_types.rs index ebdf8087c..ffa85ea9a 100644 --- a/tests/unit/out/unsafe/lambda_capture_library_types.rs +++ b/tests/unit/out/unsafe/lambda_capture_library_types.rs @@ -37,9 +37,8 @@ unsafe fn main_0() -> i32 { .map_or(::std::ptr::null_mut(), |v| v as *mut i32)) .is_null() { - (*(*(std::ptr::addr_of!(u).cast_mut())) - .as_deref_mut() - .unwrap()) + (*u.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) } else { 0 }; diff --git a/tests/unit/out/unsafe/matmul.rs b/tests/unit/out/unsafe/matmul.rs index 02f6c6f43..c8b1b503f 100644 --- a/tests/unit/out/unsafe/matmul.rs +++ b/tests/unit/out/unsafe/matmul.rs @@ -14,7 +14,11 @@ pub unsafe fn matalloc_0(mut n: i32, mut p: i32, mut e: i32) -> Option> + }) + .add((i as usize))) = Some( (0..(p as usize)) .map(|_| ::default()) .collect::>(), @@ -22,7 +26,15 @@ pub unsafe fn matalloc_0(mut n: i32, mut p: i32, mut e: i32) -> Option> + }) + .add((i as usize))) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((j as usize))) = e; j.prefix_inc(); } i.prefix_inc(); @@ -45,11 +57,35 @@ pub unsafe fn matmul_1( 'loop_: while ((j) < (p2)) { let mut k: i32 = 0; 'loop_: while ((k) < (p1)) { - sum += ((m1.as_mut().unwrap()[(i as usize)].as_mut().unwrap()[(k as usize)]) - * (m2.as_mut().unwrap()[(k as usize)].as_mut().unwrap()[(j as usize)])); + sum += ((*(*m1 + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut Option> + }) + .add((i as usize))) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((k as usize))) + * (*(*m2 + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut Option> + }) + .add((k as usize))) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((j as usize)))); k.prefix_inc(); } - m3.as_mut().unwrap()[(i as usize)].as_mut().unwrap()[(j as usize)] = sum; + (*(*m3 + .as_deref() + .map_or(::std::ptr::null_mut(), |s| { + s.as_ptr() as *mut Option> + }) + .add((i as usize))) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((j as usize))) = sum; j.prefix_inc(); } i.prefix_inc(); @@ -76,7 +112,17 @@ unsafe fn main_0() -> i32 { let _p2: i32 = n; matmul_1(_m1, _n1, _p1, _m2, _n2, _p2) }); - assert!(((m3.as_mut().unwrap()[(0_usize)].as_mut().unwrap()[(0_usize)]) == (20))); + assert!( + ((*(*m3 + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() + as *mut Option>) + .add(0_usize)) + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add(0_usize)) + == (20)) + ); return 0; } pub unsafe fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/unsafe/references2.rs b/tests/unit/out/unsafe/references2.rs index 04a3ea9d4..ab79698d5 100644 --- a/tests/unit/out/unsafe/references2.rs +++ b/tests/unit/out/unsafe/references2.rs @@ -19,7 +19,11 @@ pub fn main() { unsafe fn main_0() -> i32 { let mut a: Option> = Some(Box::new(5)); (unsafe { change_0(&mut a) }); - assert!(((*a.as_deref_mut().unwrap()) == (7))); + assert!( + ((*a.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + == (7)) + ); return 0; } pub unsafe fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/unsafe/unique_ptr.rs b/tests/unit/out/unsafe/unique_ptr.rs index 10145b902..853490b81 100644 --- a/tests/unit/out/unsafe/unique_ptr.rs +++ b/tests/unit/out/unsafe/unique_ptr.rs @@ -13,7 +13,11 @@ pub struct SafePointer { } impl SafePointer { pub unsafe fn inc(&mut self) { - (*self.ptr.as_deref_mut().unwrap()).prefix_inc(); + (*self + .ptr + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + .prefix_inc(); } pub unsafe fn move_from(_a0: *mut SafePointer) -> Self { let mut this = Self { @@ -41,41 +45,95 @@ impl Pair { pub unsafe fn DoStuffWithSafePointer_0(safe_ptr: *mut Option>) { let mut x1: Option> = Some(Box::new(0)); let mut x2: Option> = Some(Box::new(0)); - (*x2.as_deref_mut().unwrap()) = 1; + (*x2.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) = 1; x1 = x2.take(); - let mut raw_ptr1: *mut i32 = (&mut (*x1.as_deref_mut().unwrap()) as *mut i32); + let mut raw_ptr1: *mut i32 = (&mut (*x1 + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + as *mut i32); (*raw_ptr1).prefix_inc(); - (*(*safe_ptr).as_deref_mut().unwrap()).ptr = x1.take(); - (unsafe { SafePointer::inc(&mut (*(*safe_ptr).as_deref_mut().unwrap())) }); - (unsafe { SafePointer::inc(&mut (*(*safe_ptr).as_deref_mut().unwrap())) }); + (*(*safe_ptr).as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const SafePointer as *mut SafePointer + })) + .ptr = x1.take(); + (unsafe { + SafePointer::inc( + &mut (*(*safe_ptr).as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const SafePointer as *mut SafePointer + })), + ) + }); + (unsafe { + SafePointer::inc( + &mut (*(*safe_ptr).as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const SafePointer as *mut SafePointer + })), + ) + }); let mut x3: Option> = Some(Box::new(10)); let mut x4: Option> = Some(Box::new(20)); - (*x3.as_deref_mut().unwrap()) = ((*x3.as_deref_mut().unwrap()) + (*x4.as_deref_mut().unwrap())); + (*x3.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) = ((*x3 + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + + (*x4 + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32))); x4 = x3.take(); - let mut raw_ptr2: *mut i32 = (&mut (*x4.as_deref_mut().unwrap()) as *mut i32); + let mut raw_ptr2: *mut i32 = (&mut (*x4 + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + as *mut i32); (*raw_ptr2) += 1; let mut pair: Option> = Some(Box::new(Pair { x: (*raw_ptr2), y: 5, })); - (unsafe { Pair::inc(&mut (*pair.as_deref_mut().unwrap()), 10) }); - (*(*(*safe_ptr).as_deref_mut().unwrap()) + (unsafe { + Pair::inc( + &mut (*pair + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Pair as *mut Pair)), + 10, + ) + }); + (*(*(*safe_ptr).as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const SafePointer as *mut SafePointer + })) + .ptr + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) = + (((*(*(*safe_ptr).as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const SafePointer as *mut SafePointer + })) .ptr - .as_deref_mut() - .unwrap()) = (((*(*(*safe_ptr).as_deref_mut().unwrap()) - .ptr - .as_deref_mut() - .unwrap()) - + ((*pair.as_deref_mut().unwrap()).x)) - + ((*pair.as_deref_mut().unwrap()).y)); + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + + ((*pair + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Pair as *mut Pair)) + .x)) + + ((*pair + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Pair as *mut Pair)) + .y)); } pub unsafe fn Consume_1(mut safe_ptr: Option>) -> i32 { let mut x: Option> = safe_ptr.take(); let mut p: Option> = Some(Box::from_raw( (Box::leak(Box::new(::default())) as *mut Pair), )); - return ((*(*x.as_deref_mut().unwrap()).ptr.as_deref_mut().unwrap()) - + ((*p.as_deref_mut().unwrap()).x)); + return ((*(*x.as_deref().map_or(::std::ptr::null_mut(), |v| { + v as *const SafePointer as *mut SafePointer + })) + .ptr + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + + ((*p + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Pair as *mut Pair)) + .x)); } pub unsafe fn RndStuff_2() { let mut x1: Option> = None; @@ -84,7 +142,9 @@ pub unsafe fn RndStuff_2() { ))); let mut i: i32 = 0; 'loop_: while ((i) < (100)) { - x2.as_mut().unwrap()[(i as usize)] = 1; + (*x2.as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((i as usize))) = 1; i.prefix_inc(); } x2 = Some(Box::from_raw(Box::leak( @@ -92,7 +152,9 @@ pub unsafe fn RndStuff_2() { ))); let mut i: i32 = 0; 'loop_: while ((i) < (200)) { - x2.as_mut().unwrap()[(i as usize)] = 2; + (*x2.as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut i32) + .add((i as usize))) = 2; i.prefix_inc(); } let mut p2: *mut i32 = x2 @@ -110,7 +172,9 @@ pub unsafe fn RndStuff_2() { ); let mut i: i32 = 0; 'loop_: while ((i) < (10)) { - x3.as_mut().unwrap()[(i as usize)] = Pair { x: 1, y: 2 }; + (*x3.as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Pair) + .add((i as usize))) = Pair { x: 1, y: 2 }; i.prefix_inc(); } let mut p3_0: *mut Pair = x3 @@ -120,7 +184,15 @@ pub unsafe fn RndStuff_2() { 'loop_: while ((i) < (10)) { assert!((((*p3_0.offset((i) as isize)).x) == (1))); assert!((((*p3_0.offset((i) as isize)).y) == (2))); - (unsafe { Pair::inc(&mut x3.as_mut().unwrap()[(i as usize)], 10) }); + (unsafe { + Pair::inc( + &mut (*x3 + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Pair) + .add((i as usize))), + 10, + ) + }); assert!((((*p3_0.offset((i) as isize)).x) == (11))); assert!((((*p3_0.offset((i) as isize)).y) == (12))); i.prefix_inc(); @@ -132,7 +204,9 @@ pub unsafe fn RndStuff_2() { ))); let mut i: i32 = 0; 'loop_: while ((i) < (50)) { - x3.as_mut().unwrap()[(i as usize)] = Pair { + (*x3.as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Pair) + .add((i as usize))) = Pair { x: -1_i32, y: -2_i32, }; @@ -146,7 +220,15 @@ pub unsafe fn RndStuff_2() { 'loop_: while ((i) < (50)) { assert!((((*p3_1.offset((i) as isize)).x) == (-1_i32))); assert!((((*p3_1.offset((i) as isize)).y) == (-2_i32))); - (unsafe { Pair::inc(&mut x3.as_mut().unwrap()[(i as usize)], -10_i32) }); + (unsafe { + Pair::inc( + &mut (*x3 + .as_deref() + .map_or(::std::ptr::null_mut(), |s| s.as_ptr() as *mut Pair) + .add((i as usize))), + -10_i32, + ) + }); assert!((((*p3_1.offset((i) as isize)).x) == (-11_i32))); assert!((((*p3_1.offset((i) as isize)).y) == (-12_i32))); i.prefix_inc(); diff --git a/tests/unit/out/unsafe/unique_ptr_const_deref.rs b/tests/unit/out/unsafe/unique_ptr_const_deref.rs index 5f598f89c..9f93c6ff2 100644 --- a/tests/unit/out/unsafe/unique_ptr_const_deref.rs +++ b/tests/unit/out/unsafe/unique_ptr_const_deref.rs @@ -24,14 +24,16 @@ impl Holder { } } pub unsafe fn read_val_0(mut h: *const Holder) -> i32 { - return (*(*(std::ptr::addr_of!((*h).val).cast_mut())) - .as_deref_mut() - .unwrap()); + return (*(*h) + .val + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)); } pub unsafe fn write_val_1(mut h: *const Holder, mut v: i32) { - (*(*(std::ptr::addr_of!((*h).val).cast_mut())) - .as_deref_mut() - .unwrap()) = v; + (*(*h) + .val + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) = v; } pub fn main() { unsafe { diff --git a/tests/unit/out/unsafe/unique_ptr_deref_ops.rs b/tests/unit/out/unsafe/unique_ptr_deref_ops.rs index 3f0842102..31a1b8360 100644 --- a/tests/unit/out/unsafe/unique_ptr_deref_ops.rs +++ b/tests/unit/out/unsafe/unique_ptr_deref_ops.rs @@ -14,11 +14,19 @@ pub fn main() { } unsafe fn main_0() -> i32 { let mut p: Option> = Some(Box::new(10)); - (*p.as_deref_mut().unwrap()) += 5; - (*p.as_deref_mut().unwrap()) -= 3; - (*p.as_deref_mut().unwrap()) *= 2; + (*p.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) += 5; + (*p.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) -= 3; + (*p.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) *= 2; let mut q: Option> = Some(Box::new(1)); - let mut sum: i32 = ((*p.as_deref_mut().unwrap()) + (*q.as_deref_mut().unwrap())); + let mut sum: i32 = ((*p + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + + (*q + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32))); assert!(((sum) == (25))); return 0; } diff --git a/tests/unit/out/unsafe/unique_ptr_field_reset.rs b/tests/unit/out/unsafe/unique_ptr_field_reset.rs index 64ec1a750..342681996 100644 --- a/tests/unit/out/unsafe/unique_ptr_field_reset.rs +++ b/tests/unit/out/unsafe/unique_ptr_field_reset.rs @@ -59,11 +59,33 @@ unsafe fn main_0() -> i32 { Some(Box::from_raw(_a0)) } }; - assert!((((*h.data.as_deref_mut().unwrap()).v) == (3))); + assert!( + (((*h + .data + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Data as *mut Data)) + .v) == (3)) + ); (unsafe { Holder::set(&mut h, (Box::leak(Box::new(Data { v: 4 })) as *mut Data)) }); - assert!((((*(*hp).data.as_deref_mut().unwrap()).v) == (4))); - (*(*hp).data.as_deref_mut().unwrap()).v += (*hp).n; - assert!((((*h.data.as_deref_mut().unwrap()).v) == (5))); + assert!( + (((*(*hp) + .data + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Data as *mut Data)) + .v) == (4)) + ); + (*(*hp) + .data + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Data as *mut Data)) + .v += (*hp).n; + assert!( + (((*h + .data + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Data as *mut Data)) + .v) == (5)) + ); return 0; } pub unsafe fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/unsafe/unique_ptr_nested.rs b/tests/unit/out/unsafe/unique_ptr_nested.rs index 02e0961fd..114cce9e9 100644 --- a/tests/unit/out/unsafe/unique_ptr_nested.rs +++ b/tests/unit/out/unsafe/unique_ptr_nested.rs @@ -39,13 +39,39 @@ unsafe fn main_0() -> i32 { let mut o: Option> = Some(Box::new(Outer { inner: Some(Box::new(Inner { x: 10, y: 20 })), })); - (*(*o.as_deref_mut().unwrap()).inner.as_deref_mut().unwrap()).x += 5; - let mut sum: i32 = (((*(*o.as_deref_mut().unwrap()).inner.as_deref_mut().unwrap()).x) - + ((*(*o.as_deref_mut().unwrap()).inner.as_deref_mut().unwrap()).y)); + (*(*o + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Outer as *mut Outer)) + .inner + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Inner as *mut Inner)) + .x += 5; + let mut sum: i32 = (((*(*o + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Outer as *mut Outer)) + .inner + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Inner as *mut Inner)) + .x) + ((*(*o + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Outer as *mut Outer)) + .inner + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Inner as *mut Inner)) + .y)); let mut a: Option> = Some(Box::new(100)); let mut b: Option> = Some(Box::new(0)); - (*b.as_deref_mut().unwrap()) = (*a.as_deref_mut().unwrap()); - assert!((((sum) + (*b.as_deref_mut().unwrap())) == (135))); + (*b.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) = (*a + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)); + assert!( + (((sum) + + (*b + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32))) + == (135)) + ); return 0; } pub unsafe fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/unsafe/unique_ptr_small.rs b/tests/unit/out/unsafe/unique_ptr_small.rs index 9521f17bf..4a523a580 100644 --- a/tests/unit/out/unsafe/unique_ptr_small.rs +++ b/tests/unit/out/unsafe/unique_ptr_small.rs @@ -19,7 +19,14 @@ pub fn main() { unsafe fn main_0() -> i32 { let mut n: Option> = Some(Box::new(10)); (unsafe { change_0(&mut n) }); - assert!(((*n.as_deref_mut().unwrap()) == (20))); + assert!( + ((*n.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + == (20)) + ); + let mut empty: Option> = None; + assert!(empty.is_none()); + assert!(n.is_some()); return 0; } pub unsafe fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/unsafe/unique_ptr_struct.rs b/tests/unit/out/unsafe/unique_ptr_struct.rs index 70ef1df85..03d86cbee 100644 --- a/tests/unit/out/unsafe/unique_ptr_struct.rs +++ b/tests/unit/out/unsafe/unique_ptr_struct.rs @@ -23,10 +23,24 @@ pub fn main() { } unsafe fn main_0() -> i32 { let mut p: Option> = Some(Box::new(Point { x: 3, y: 4 })); - (*p.as_deref_mut().unwrap()).x += 10; - (*p.as_deref_mut().unwrap()).y = - (((*p.as_deref_mut().unwrap()).x) + ((*p.as_deref_mut().unwrap()).y)); - let mut s: i32 = (unsafe { sum_0((*p.as_deref_mut().unwrap())) }); + (*p.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Point as *mut Point)) + .x += 10; + (*p.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Point as *mut Point)) + .y = (((*p + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Point as *mut Point)) + .x) + ((*p + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Point as *mut Point)) + .y)); + let mut s: i32 = (unsafe { + sum_0( + (*p.as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const Point as *mut Point)), + ) + }); assert!(((s) == (30))); return 0; } diff --git a/tests/unit/out/unsafe/void_cast.rs b/tests/unit/out/unsafe/void_cast.rs index f667b817e..954c2b7c3 100644 --- a/tests/unit/out/unsafe/void_cast.rs +++ b/tests/unit/out/unsafe/void_cast.rs @@ -125,7 +125,12 @@ unsafe fn main_0() -> i32 { (&(g)); &(g); (unsafe { unused_noncopyable_param_5(&g) }); - assert!(((*g.value.as_deref_mut().unwrap()) == (9))); + assert!( + ((*g.value + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + == (9)) + ); return 0; } pub unsafe fn __cpp2rust_init_globals() { diff --git a/tests/unit/unique_ptr_small.cpp b/tests/unit/unique_ptr_small.cpp index b252661e3..2b4da2626 100644 --- a/tests/unit/unique_ptr_small.cpp +++ b/tests/unit/unique_ptr_small.cpp @@ -10,5 +10,8 @@ int main() { std::unique_ptr n = std::make_unique(10); change(n); assert(*n == 20); + std::unique_ptr empty; + assert(empty == nullptr); + assert(n != nullptr); return 0; }