From 64ed654bc61cb8df5468918c95d50cd7cf7344cf Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 13:35:47 +0100 Subject: [PATCH 01/62] Make receiver of vector objects a Ptr --- cpp2rust/converter/converter.cpp | 5 +-- cpp2rust/converter/converter.h | 5 +-- .../converter/models/converter_refcount.cpp | 23 +--------- .../converter/models/converter_refcount.h | 4 +- rules/array/tgt_refcount.rs | 8 ++-- rules/deque/tgt_refcount.rs | 8 ++-- rules/string/tgt_refcount.rs | 20 ++++----- rules/vector/tgt_refcount.rs | 44 +++++++++---------- 8 files changed, 46 insertions(+), 71 deletions(-) diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index 754d3a220..de802c205 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -219,7 +219,7 @@ std::string Converter::ConvertFreshPointer( return str; } -std::string Converter::ConvertFreshObject(clang::Expr *expr, std::string_view) { +std::string Converter::ConvertFreshObject(clang::Expr *expr) { return ConvertFreshPointer(expr); } @@ -5125,8 +5125,7 @@ std::string Converter::ConvertPlaceholder(clang::Expr *expr, clang::Expr *arg, if (ph_ctx.needs_pointer_receiver()) { auto param_type = Mapper::GetParamType(*this, expr, ph_ctx.arg_idx); - return std::format("({} as {})", ConvertFreshObject(arg, param_type), - param_type); + return std::format("({} as {})", ConvertFreshObject(arg), param_type); } if (ph_ctx.needs_object_receiver()) { diff --git a/cpp2rust/converter/converter.h b/cpp2rust/converter/converter.h index cd07a0ec8..0a3afdfc7 100644 --- a/cpp2rust/converter/converter.h +++ b/cpp2rust/converter/converter.h @@ -1076,10 +1076,7 @@ class Converter : public clang::RecursiveASTVisitor { virtual std::string ConvertFreshPointer(clang::Expr *expr, std::optional implicit_convert_to = {}); - // target_ptr_type, when known (e.g. a translation rule's parameter type), - // is the Rust pointer type the result will be used as. - virtual std::string ConvertFreshObject(clang::Expr *expr, - std::string_view target_ptr_type = {}); + virtual std::string ConvertFreshObject(clang::Expr *expr); std::string ConvertPointer(clang::Expr *expr, std::optional implicit_convert_to = {}, diff --git a/cpp2rust/converter/models/converter_refcount.cpp b/cpp2rust/converter/models/converter_refcount.cpp index 9a77c44f4..96d7d7891 100644 --- a/cpp2rust/converter/models/converter_refcount.cpp +++ b/cpp2rust/converter/models/converter_refcount.cpp @@ -392,27 +392,8 @@ std::string ConverterRefCount::ConvertObject(clang::Expr *expr, return str; } -std::string -ConverterRefCount::ConvertFreshObject(clang::Expr *expr, - std::string_view target_ptr_type) { - auto shape = ObjectShape::Whole; - if (!target_ptr_type.empty()) { - auto type = expr->getType().getNonReferenceType(); - auto pointee = type->isPointerType() ? type->getPointeeType() : type; - if (IsBoxedType(ctx_, pointee) || pointee->isArrayType()) { - auto normalize = [](std::string s) { - std::erase(s, ' '); - for (size_t pos; (pos = s.find("::<")) != std::string::npos;) - s.erase(pos, 2); - return s; - }; - if (normalize(std::string(target_ptr_type)) == - normalize(ConvertPtrType(pointee))) { - shape = ObjectShape::Element; - } - } - } - auto str = ConvertObject(expr, shape); +std::string ConverterRefCount::ConvertFreshObject(clang::Expr *expr) { + auto str = ConvertObject(expr); if (isFresh()) { return str; } diff --git a/cpp2rust/converter/models/converter_refcount.h b/cpp2rust/converter/models/converter_refcount.h index 6ccd80ada..5fffcfefb 100644 --- a/cpp2rust/converter/models/converter_refcount.h +++ b/cpp2rust/converter/models/converter_refcount.h @@ -393,9 +393,7 @@ class ConverterRefCount final : public Converter { enum class ObjectShape { Whole, Element }; std::string ConvertObject(clang::Expr *expr, ObjectShape shape = ObjectShape::Whole); - std::string - ConvertFreshObject(clang::Expr *expr, - std::string_view target_ptr_type = {}) override; + std::string ConvertFreshObject(clang::Expr *expr) override; bool WantsElementPtr() const { return object_shape_ == ObjectShape::Element; } std::string ConvertFresh(clang::Expr *expr, diff --git a/rules/array/tgt_refcount.rs b/rules/array/tgt_refcount.rs index 90b46c20f..5ce4a5301 100644 --- a/rules/array/tgt_refcount.rs +++ b/rules/array/tgt_refcount.rs @@ -5,12 +5,12 @@ use libcc2rs::*; use std::cell::RefCell; use std::rc::Rc; -fn f1(a0: Ptr) -> Ptr { - a0 +fn f1(a0: Ptr>) -> Ptr { + a0.decay() } -fn f3(a0: Ptr) -> Ptr { - a0 +fn f3(a0: Ptr>) -> Ptr { + a0.decay() } fn f5(a0: Ptr>, a1: &mut Vec) { diff --git a/rules/deque/tgt_refcount.rs b/rules/deque/tgt_refcount.rs index ef1d15801..78ab8b332 100644 --- a/rules/deque/tgt_refcount.rs +++ b/rules/deque/tgt_refcount.rs @@ -5,12 +5,12 @@ use libcc2rs::*; use std::cell::RefCell; use std::rc::Rc; -fn f1(a0: Ptr) -> Ptr { - a0.to_last() +fn f1(a0: Ptr>) -> Ptr { + a0.decay().to_last() } -fn f2(a0: Ptr) -> Ptr { - a0 +fn f2(a0: Ptr>) -> Ptr { + a0.decay() } fn f10(a0: Ptr>, a1: Vec) { diff --git a/rules/string/tgt_refcount.rs b/rules/string/tgt_refcount.rs index 3b94acee5..e4e7274ee 100644 --- a/rules/string/tgt_refcount.rs +++ b/rules/string/tgt_refcount.rs @@ -33,12 +33,12 @@ fn f4(a0: Ptr>, a1: Ptr, a2: usize) -> Ptr> { a0 } -fn f5(a0: Ptr) -> Ptr { - a0 +fn f5(a0: Ptr>) -> Ptr { + a0.decay() } -fn f6(a0: Ptr) -> Ptr { - a0 +fn f6(a0: Ptr>) -> Ptr { + a0.decay() } fn f7(a0: Ptr, a1: usize) -> Vec { @@ -54,12 +54,12 @@ fn f10(a0: Ptr) -> Vec { __bytes } -fn f11(a0: Ptr) -> Ptr { - a0 +fn f11(a0: Ptr>) -> Ptr { + a0.decay() } -fn f12(a0: Ptr) -> RandomAccessIterator { - RandomAccessIterator::Vec(a0) +fn f12(a0: Ptr>) -> RandomAccessIterator { + RandomAccessIterator::Vec(a0.decay()) } fn f14(a0: Ptr>, a1: usize, a2: usize, a3: Ptr, a4: usize) -> Ptr> { @@ -76,8 +76,8 @@ fn f14(a0: Ptr>, a1: usize, a2: usize, a3: Ptr, a4: usize) -> Ptr) -> RandomAccessIterator { - RandomAccessIterator::Vec(a0.to_last()) +fn f15(a0: Ptr>) -> RandomAccessIterator { + RandomAccessIterator::Vec(a0.decay().to_last()) } fn f16(a0: Vec, a1: Ptr) -> usize { diff --git a/rules/vector/tgt_refcount.rs b/rules/vector/tgt_refcount.rs index bdb48977e..71512b122 100644 --- a/rules/vector/tgt_refcount.rs +++ b/rules/vector/tgt_refcount.rs @@ -15,28 +15,28 @@ fn f60(a0: Ptr>, a1: RandomAccessIterator) -> RandomAc RandomAccessIterator::Vec(a0.decay() + __off) } -fn f65(a0: Ptr) -> Ptr { - a0 +fn f65(a0: Ptr>) -> Ptr { + a0.decay() } -fn f66(a0: Ptr, a1: usize) -> Ptr { - a0.offset(a1 as isize) +fn f66(a0: Ptr>, a1: usize) -> Ptr { + a0.decay().offset(a1 as isize) } -fn f68(a0: Ptr) -> Ptr { - a0 +fn f68(a0: Ptr>) -> Ptr { + a0.decay() } -fn f69(a0: Ptr) -> Ptr { - a0.to_last() +fn f69(a0: Ptr>) -> Ptr { + a0.decay().to_last() } -fn f72(a0: Ptr) -> RandomAccessIterator { - a0.begin() +fn f72(a0: Ptr>) -> RandomAccessIterator { + a0.decay().begin() } -fn f76(a0: Ptr) -> RandomAccessIterator { - a0.end() +fn f76(a0: Ptr>) -> RandomAccessIterator { + a0.decay().end() } fn f77(a0: &mut Vec, a1: RandomAccessIterator, a2: T1) -> RandomAccessIterator { @@ -61,16 +61,16 @@ fn f92, T2: Clone + ByteRepr, T3: CppInputIterator>(a0: T3, __v } -fn f93(a0: Ptr) -> Ptr { - a0 +fn f93(a0: Ptr>) -> Ptr { + a0.decay() } -fn f95(a0: Ptr) -> RandomAccessIterator { - a0.begin() +fn f95(a0: Ptr>) -> RandomAccessIterator { + a0.decay().begin() } -fn f96(a0: Ptr) -> RandomAccessIterator { - a0.end() +fn f96(a0: Ptr>) -> RandomAccessIterator { + a0.decay().end() } fn f98(a0: Ptr>, a1: usize) -> Ptr> { @@ -81,8 +81,8 @@ fn f98(a0: Ptr>, a1: usize) -> Ptr> { } } -fn f99(a0: Ptr) -> Ptr { - a0.to_last() +fn f99(a0: Ptr>) -> Ptr { + a0.decay().to_last() } fn f101>( @@ -108,8 +108,8 @@ fn f103(a0: Ptr>, a1: &mut Vec) { a0.write(std::mem::take(&mut *a1)) } -fn f104(a0: Ptr) -> RandomAccessIterator { - a0.end() +fn f104(a0: Ptr>) -> RandomAccessIterator { + a0.decay().end() } fn f105(a0: Ptr>, a1: Vec) { From f41a62a5b8cdc270d6bdc34a7ec5360179741997 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 13:36:39 +0100 Subject: [PATCH 02/62] Update tests --- .../refcount/dangling-prvalue-as-lvalue.rs | 9 +- .../out/refcount/row_ptr_outlives_vector.rs | 3 +- tests/unit/out/refcount/auto.rs | 4 +- tests/unit/out/refcount/class_templates.rs | 12 +- .../unit/out/refcount/compound_assign_ref.rs | 6 +- .../refcount/elidable_iterator_copy_cxx11.rs | 47 ++++++-- tests/unit/out/refcount/find.rs | 55 ++++++--- tests/unit/out/refcount/fn_ptr_stable_sort.rs | 26 +++- tests/unit/out/refcount/foreach.rs | 4 +- .../refcount/foreach_disjoint_field_borrow.rs | 8 +- tests/unit/out/refcount/foreach_double.rs | 40 +++---- tests/unit/out/refcount/foreach_mut.rs | 32 ++--- tests/unit/out/refcount/implicit_autoref.rs | 8 +- tests/unit/out/refcount/iterator_freshness.rs | 5 +- tests/unit/out/refcount/iterators.rs | 16 +-- tests/unit/out/refcount/nested_vector.rs | 3 +- tests/unit/out/refcount/operator_traits.rs | 79 +++++++----- tests/unit/out/refcount/printfs.rs | 10 +- tests/unit/out/refcount/push_emplace_back.rs | 19 ++- .../refcount/reinterpret_cast_empty_vec.rs | 4 +- .../out/refcount/reinterpret_cast_string.rs | 4 +- .../refcount/reinterpret_cast_vec_write.rs | 4 +- tests/unit/out/refcount/sort.rs | 25 +++- .../refcount/split_binop_aliased_borrows.rs | 5 +- tests/unit/out/refcount/stdcopy_ostream.rs | 6 +- tests/unit/out/refcount/string.rs | 10 +- tests/unit/out/refcount/string2.rs | 6 +- .../refcount/unboxed_conditional_iterator.rs | 18 +-- tests/unit/out/refcount/unboxed_locals.rs | 6 +- tests/unit/out/refcount/vector.rs | 112 ++++++++++++------ tests/unit/out/refcount/vector2.rs | 4 +- tests/unit/out/refcount/vector3.rs | 24 ++-- .../unit/out/refcount/vector_addr_of_back.rs | 4 +- .../refcount/vector_deque_vector_string.rs | 98 +++++++++------ .../out/refcount/vector_iter_range_ctor.rs | 3 +- .../out/refcount/vector_with_allocator.rs | 52 ++++---- tests/unit/out/refcount/void_return.rs | 4 +- 37 files changed, 497 insertions(+), 278 deletions(-) diff --git a/tests/ub/out/refcount/dangling-prvalue-as-lvalue.rs b/tests/ub/out/refcount/dangling-prvalue-as-lvalue.rs index cff4a7e93..954331062 100644 --- a/tests/ub/out/refcount/dangling-prvalue-as-lvalue.rs +++ b/tests/ub/out/refcount/dangling-prvalue-as-lvalue.rs @@ -15,7 +15,14 @@ pub fn main() { } fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::from([1, 2]))); - let b: Ptr = ({ foo_0((v.as_pointer() as Ptr).begin().iter_deref()) }); + let b: Ptr = ({ + foo_0( + (v.as_pointer() as Ptr>) + .decay() + .begin() + .iter_deref(), + ) + }); (*v.borrow_mut()).clear(); return (b.read()); } diff --git a/tests/ub/out/refcount/row_ptr_outlives_vector.rs b/tests/ub/out/refcount/row_ptr_outlives_vector.rs index 617533b6a..31bbe9c08 100644 --- a/tests/ub/out/refcount/row_ptr_outlives_vector.rs +++ b/tests/ub/out/refcount/row_ptr_outlives_vector.rs @@ -13,7 +13,8 @@ pub fn second_row_0() -> Ptr { ]))); return ((rows.as_pointer() as Ptr>) .offset(1_usize) - .as_pointer() as Ptr); + .as_pointer() as Ptr>) + .decay(); } pub fn main() { __cpp2rust_init_globals(); diff --git a/tests/unit/out/refcount/auto.rs b/tests/unit/out/refcount/auto.rs index 7dfe2c935..20c6fbf1e 100644 --- a/tests/unit/out/refcount/auto.rs +++ b/tests/unit/out/refcount/auto.rs @@ -25,8 +25,8 @@ fn main_0() -> i32 { }; let mut sum: i32 = 0; 'loop_: for elem in IterRange::new( - (v.as_pointer() as Ptr).begin(), - (v.as_pointer() as Ptr).end(), + (v.as_pointer() as Ptr>).decay().begin(), + (v.as_pointer() as Ptr>).decay().end(), ) { let mut elem: i32 = (elem.iter_deref().read()); sum += elem; diff --git a/tests/unit/out/refcount/class_templates.rs b/tests/unit/out/refcount/class_templates.rs index f1ae3789e..b26c7bbe9 100644 --- a/tests/unit/out/refcount/class_templates.rs +++ b/tests/unit/out/refcount/class_templates.rs @@ -231,7 +231,9 @@ impl MyContainer_char_Impl for Ptr { return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { - return (field_ref!((*self), vec_).as_pointer() as Ptr).to_last(); + return (field_ref!((*self), vec_).as_pointer() as Ptr>) + .decay() + .to_last(); } fn pop_back(&self) { field!((*self), vec_).with_mut(|__v: &mut Vec| __v.pop()); @@ -262,7 +264,9 @@ impl MyContainer_float_Impl for Ptr { return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { - return (field_ref!((*self), vec_).as_pointer() as Ptr).to_last(); + return (field_ref!((*self), vec_).as_pointer() as Ptr>) + .decay() + .to_last(); } fn pop_back(&self) { field!((*self), vec_).with_mut(|__v: &mut Vec| __v.pop()); @@ -293,7 +297,9 @@ impl MyContainer_int_Impl for Ptr { return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { - return (field_ref!((*self), vec_).as_pointer() as Ptr).to_last(); + return (field_ref!((*self), vec_).as_pointer() as Ptr>) + .decay() + .to_last(); } fn pop_back(&self) { field!((*self), vec_).with_mut(|__v: &mut Vec| __v.pop()); diff --git a/tests/unit/out/refcount/compound_assign_ref.rs b/tests/unit/out/refcount/compound_assign_ref.rs index f0a3a1728..64b65eafb 100644 --- a/tests/unit/out/refcount/compound_assign_ref.rs +++ b/tests/unit/out/refcount/compound_assign_ref.rs @@ -17,9 +17,11 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; { - (v.as_pointer() as Ptr).with_mut(|__v| *__v = *__v + 5) + (v.as_pointer() as Ptr>) + .decay() + .with_mut(|__v| *__v = *__v + 5) }; - assert!((((v.as_pointer() as Ptr).read()) == 15)); + assert!((((v.as_pointer() as Ptr>).decay().read()) == 15)); return 0; } pub fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs b/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs index ae79c0e9e..7cc0ae161 100644 --- a/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs +++ b/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs @@ -21,41 +21,52 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; let it: Value> = Rc::new(RefCell::new({ - let mut __it = (v.as_pointer() as Ptr).begin(); - while __it != (v.as_pointer() as Ptr).end() && __it.iter_deref().with(|__v| *__v != 7) + let mut __it = (v.as_pointer() as Ptr>).decay().begin(); + while __it != (v.as_pointer() as Ptr>).decay().end() + && __it.iter_deref().with(|__v| *__v != 7) { __it.iter_inc(); } __it })); - assert!((*it.borrow()) != (v.as_pointer() as Ptr).end()); + assert!((*it.borrow()) != (v.as_pointer() as Ptr>).decay().end()); assert!((((*it.borrow()).iter_deref().read()) == 7)); { - let __n = (v.as_pointer() as Ptr) + let __n = (v.as_pointer() as Ptr>) + .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr).begin()); + .iter_distance(&(v.as_pointer() as Ptr>).decay().begin()); let __random = std::hash::RandomState::new(); for __i in (1..__n).rev() { let __j = (std::hash::BuildHasher::hash_one(&__random, __i) % (__i + 1) as u64) as isize; - let __x = (v.as_pointer() as Ptr).begin().iter_at(__i); - let __y = (v.as_pointer() as Ptr).begin().iter_at(__j); + let __x = (v.as_pointer() as Ptr>) + .decay() + .begin() + .iter_at(__i); + let __y = (v.as_pointer() as Ptr>) + .decay() + .begin() + .iter_at(__j); let __tmp = __x.read(); __x.write(__y.read()); __y.write(__tmp); } }; { - let __n = (v.as_pointer() as Ptr) + let __n = (v.as_pointer() as Ptr>) + .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr).begin()); + .iter_distance(&(v.as_pointer() as Ptr>).decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (v.as_pointer() as Ptr) + (v.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__x) .with(|__a| { - (v.as_pointer() as Ptr) + (v.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__y) .with(|__b| __a.cmp(__b)) @@ -63,10 +74,20 @@ fn main_0() -> i32 { }); let __values: Vec<_> = __order .iter() - .map(|&__i| (v.as_pointer() as Ptr).begin().iter_at(__i).read()) + .map(|&__i| { + (v.as_pointer() as Ptr>) + .decay() + .begin() + .iter_at(__i) + .read() + }) .collect(); for (__i, __v) in (0..__n).zip(__values) { - (v.as_pointer() as Ptr).begin().iter_at(__i).write(__v); + (v.as_pointer() as Ptr>) + .decay() + .begin() + .iter_at(__i) + .write(__v); } }; assert!(({ (*v.borrow())[0_usize] } == 4) && ({ (*v.borrow())[1_usize] } == 7)); diff --git a/tests/unit/out/refcount/find.rs b/tests/unit/out/refcount/find.rs index 314c02895..7b8a919dd 100644 --- a/tests/unit/out/refcount/find.rs +++ b/tests/unit/out/refcount/find.rs @@ -24,10 +24,12 @@ fn main_0() -> i32 { let __a1 = 3; (*v.borrow_mut()).push(__a1) }; - let v_begin: Value> = - Rc::new(RefCell::new((v.as_pointer() as Ptr).begin())); - let v_end: Value> = - Rc::new(RefCell::new((v.as_pointer() as Ptr).end())); + let v_begin: Value> = Rc::new(RefCell::new( + (v.as_pointer() as Ptr>).decay().begin(), + )); + let v_end: Value> = Rc::new(RefCell::new( + (v.as_pointer() as Ptr>).decay().end(), + )); let it: Value> = Rc::new(RefCell::new({ let mut __it = (*v_begin.borrow()).clone(); while __it != (*v_end.borrow()).clone() && __it.iter_deref().with(|__v| *__v != 2) { @@ -35,7 +37,7 @@ fn main_0() -> i32 { } __it })); - let mut v_result_true: bool = (*it.borrow()) != (v.as_pointer() as Ptr).end(); + let mut v_result_true: bool = (*it.borrow()) != (v.as_pointer() as Ptr>).decay().end(); let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); (m.as_pointer() as Ptr, Value)>>) .with_mut(|__m: &mut Map, Value)>| { @@ -88,48 +90,67 @@ fn main_0() -> i32 { assert!( ((v_result_true) && (m_result_true)) && ({ - let mut __it = (v.as_pointer() as Ptr).begin(); - while __it != (v.as_pointer() as Ptr).begin() + let mut __it = (v.as_pointer() as Ptr>).decay().begin(); + while __it != (v.as_pointer() as Ptr>).decay().begin() && __it.iter_deref().with(|__v| *__v != 2) { __it.iter_inc(); } __it - } == (v.as_pointer() as Ptr).begin()) + } == (v.as_pointer() as Ptr>).decay().begin()) ); let w: Value> = Rc::new(RefCell::new(Vec::from([1, 2, 3, 4, 5]))); assert!( { - let mut __it = (w.as_pointer() as Ptr).begin().iter_add(2_isize); - while __it != (w.as_pointer() as Ptr).end() + let mut __it = (w.as_pointer() as Ptr>) + .decay() + .begin() + .iter_add(2_isize); + while __it != (w.as_pointer() as Ptr>).decay().end() && __it.iter_deref().with(|__v| *__v != 4) { __it.iter_inc(); } __it - } == (w.as_pointer() as Ptr).begin().iter_add(3_isize) + } == (w.as_pointer() as Ptr>) + .decay() + .begin() + .iter_add(3_isize) ); assert!( { - let mut __it = (w.as_pointer() as Ptr).begin().iter_add(2_isize); - while __it != (w.as_pointer() as Ptr).end() + let mut __it = (w.as_pointer() as Ptr>) + .decay() + .begin() + .iter_add(2_isize); + while __it != (w.as_pointer() as Ptr>).decay().end() && __it.iter_deref().with(|__v| *__v != 1) { __it.iter_inc(); } __it - } == (w.as_pointer() as Ptr).end() + } == (w.as_pointer() as Ptr>).decay().end() ); assert!( { - let mut __it = (w.as_pointer() as Ptr).begin().iter_add(2_isize); - while __it != (w.as_pointer() as Ptr).begin().iter_add(4_isize) + let mut __it = (w.as_pointer() as Ptr>) + .decay() + .begin() + .iter_add(2_isize); + while __it + != (w.as_pointer() as Ptr>) + .decay() + .begin() + .iter_add(4_isize) && __it.iter_deref().with(|__v| *__v != 5) { __it.iter_inc(); } __it - } == (w.as_pointer() as Ptr).begin().iter_add(4_isize) + } == (w.as_pointer() as Ptr>) + .decay() + .begin() + .iter_add(4_isize) ); return 0; } diff --git a/tests/unit/out/refcount/fn_ptr_stable_sort.rs b/tests/unit/out/refcount/fn_ptr_stable_sort.rs index 377b0f76d..884936df6 100644 --- a/tests/unit/out/refcount/fn_ptr_stable_sort.rs +++ b/tests/unit/out/refcount/fn_ptr_stable_sort.rs @@ -36,13 +36,20 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; { - let __n = (v.as_pointer() as Ptr) + let __n = (v.as_pointer() as Ptr>) + .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr).begin()); + .iter_distance(&(v.as_pointer() as Ptr>).decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - let __a = (v.as_pointer() as Ptr).begin().iter_at(__x); - let __b = (v.as_pointer() as Ptr).begin().iter_at(__y); + let __a = (v.as_pointer() as Ptr>) + .decay() + .begin() + .iter_at(__x); + let __b = (v.as_pointer() as Ptr>) + .decay() + .begin() + .iter_at(__y); if Compare_0.call(__a.clone(), __b.clone()) { std::cmp::Ordering::Less } else if Compare_0.call(__b, __a) { @@ -53,10 +60,17 @@ fn main_0() -> i32 { }); let __values: Vec<_> = __order .iter() - .map(|&__i| (v.as_pointer() as Ptr).begin().iter_at(__i).read()) + .map(|&__i| { + (v.as_pointer() as Ptr>) + .decay() + .begin() + .iter_at(__i) + .read() + }) .collect(); for (__i, __v) in (0..__n).zip(__values) { - (v.as_pointer() as Ptr) + (v.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__i) .write(__v); diff --git a/tests/unit/out/refcount/foreach.rs b/tests/unit/out/refcount/foreach.rs index 06fc3977f..c215d9509 100644 --- a/tests/unit/out/refcount/foreach.rs +++ b/tests/unit/out/refcount/foreach.rs @@ -22,8 +22,8 @@ fn main_0() -> i32 { } let mut sum: i32 = 0; 'loop_: for x in IterRange::new( - (v.as_pointer() as Ptr).begin(), - (v.as_pointer() as Ptr).end(), + (v.as_pointer() as Ptr>).decay().begin(), + (v.as_pointer() as Ptr>).decay().end(), ) { let mut x: i32 = (x.iter_deref().read()); sum += x; diff --git a/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs b/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs index 7d7a1c25f..2b9a2b930 100644 --- a/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs +++ b/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs @@ -26,8 +26,12 @@ fn main_0() -> i32 { (*s.borrow_mut()).v.push(__a1) }; 'loop_: for e in IterRange::new( - (field_ref!(s.as_pointer(), v).as_pointer() as Ptr).begin(), - (field_ref!(s.as_pointer(), v).as_pointer() as Ptr).end(), + (field_ref!(s.as_pointer(), v).as_pointer() as Ptr>) + .decay() + .begin(), + (field_ref!(s.as_pointer(), v).as_pointer() as Ptr>) + .decay() + .end(), ) { let mut e: i32 = (e.iter_deref().read()); (*s.borrow_mut()).a.postfix_inc(); diff --git a/tests/unit/out/refcount/foreach_double.rs b/tests/unit/out/refcount/foreach_double.rs index b4122174c..ca45c74b8 100644 --- a/tests/unit/out/refcount/foreach_double.rs +++ b/tests/unit/out/refcount/foreach_double.rs @@ -26,52 +26,52 @@ fn main_0() -> i32 { }; let mut square: i32 = 0; 'loop_: for e1 in IterRange::new( - (v.as_pointer() as Ptr).begin(), - (v.as_pointer() as Ptr).end(), + (v.as_pointer() as Ptr>).decay().begin(), + (v.as_pointer() as Ptr>).decay().end(), ) { let mut e1: i32 = (e1.iter_deref().read()); 'loop_: for e2 in IterRange::new( - (v.as_pointer() as Ptr).begin(), - (v.as_pointer() as Ptr).end(), + (v.as_pointer() as Ptr>).decay().begin(), + (v.as_pointer() as Ptr>).decay().end(), ) { let mut e2: i32 = (e2.iter_deref().read()); square += (e1 * e2); } } 'loop_: for e1 in IterRange::new( - (v.as_pointer() as Ptr).begin(), - (v.as_pointer() as Ptr).end(), + (v.as_pointer() as Ptr>).decay().begin(), + (v.as_pointer() as Ptr>).decay().end(), ) { let e1: Ptr = e1.iter_deref(); 'loop_: for e2 in IterRange::new( - (v.as_pointer() as Ptr).begin(), - (v.as_pointer() as Ptr).end(), + (v.as_pointer() as Ptr>).decay().begin(), + (v.as_pointer() as Ptr>).decay().end(), ) { let e2: Ptr = e2.iter_deref(); square += { ({ (e1.read()) } * { (e2.read()) }) }; } } 'loop_: for e1 in IterRange::new( - (v.as_pointer() as Ptr).begin(), - (v.as_pointer() as Ptr).end(), + (v.as_pointer() as Ptr>).decay().begin(), + (v.as_pointer() as Ptr>).decay().end(), ) { let e1: Ptr = e1.iter_deref(); 'loop_: for e2 in IterRange::new( - (v.as_pointer() as Ptr).begin(), - (v.as_pointer() as Ptr).end(), + (v.as_pointer() as Ptr>).decay().begin(), + (v.as_pointer() as Ptr>).decay().end(), ) { let e2: Ptr = e2.iter_deref(); square += { ({ (e1.read()) } * { (e2.read()) }) }; } } 'loop_: for e1 in IterRange::new( - (v.as_pointer() as Ptr).begin(), - (v.as_pointer() as Ptr).end(), + (v.as_pointer() as Ptr>).decay().begin(), + (v.as_pointer() as Ptr>).decay().end(), ) { let e1: Ptr = e1.iter_deref(); 'loop_: for e2 in IterRange::new( - (v.as_pointer() as Ptr).begin(), - (v.as_pointer() as Ptr).end(), + (v.as_pointer() as Ptr>).decay().begin(), + (v.as_pointer() as Ptr>).decay().end(), ) { let e2: Ptr = e2.iter_deref(); square += { ({ (e1.read()) } * { (e2.read()) }) }; @@ -94,13 +94,13 @@ fn main_0() -> i32 { (*m.borrow_mut()).push(__a1) }; 'loop_: for row in IterRange::new( - (m.as_pointer() as Ptr>).begin(), - (m.as_pointer() as Ptr>).end(), + (m.as_pointer() as Ptr>>).decay().begin(), + (m.as_pointer() as Ptr>>).decay().end(), ) { let row: Ptr> = row.iter_deref(); 'loop_: for col in IterRange::new( - (Ptr::>::decay(&(row)) as Ptr).begin(), - (Ptr::>::decay(&(row)) as Ptr).end(), + ((row).clone() as Ptr>).decay().begin(), + ((row).clone() as Ptr>).decay().end(), ) { let col: Ptr = col.iter_deref(); square += { (col.read()) }; diff --git a/tests/unit/out/refcount/foreach_mut.rs b/tests/unit/out/refcount/foreach_mut.rs index 92f66396b..fe4209aab 100644 --- a/tests/unit/out/refcount/foreach_mut.rs +++ b/tests/unit/out/refcount/foreach_mut.rs @@ -26,22 +26,22 @@ fn main_0() -> i32 { }; let mut sum: i32 = 0; 'loop_: for x in IterRange::new( - (v1.as_pointer() as Ptr).begin(), - (v1.as_pointer() as Ptr).end(), + (v1.as_pointer() as Ptr>).decay().begin(), + (v1.as_pointer() as Ptr>).decay().end(), ) { let mut x: i32 = (x.iter_deref().read()); sum += x.prefix_inc(); } 'loop_: for x in IterRange::new( - (v1.as_pointer() as Ptr).begin(), - (v1.as_pointer() as Ptr).end(), + (v1.as_pointer() as Ptr>).decay().begin(), + (v1.as_pointer() as Ptr>).decay().end(), ) { let mut x: i32 = (x.iter_deref().read()); sum += x; } 'loop_: for x in IterRange::new( - (v1.as_pointer() as Ptr).begin(), - (v1.as_pointer() as Ptr).end(), + (v1.as_pointer() as Ptr>).decay().begin(), + (v1.as_pointer() as Ptr>).decay().end(), ) { let x: Ptr = x.iter_deref(); { @@ -49,8 +49,8 @@ fn main_0() -> i32 { }; } 'loop_: for x in IterRange::new( - (v1.as_pointer() as Ptr).begin(), - (v1.as_pointer() as Ptr).end(), + (v1.as_pointer() as Ptr>).decay().begin(), + (v1.as_pointer() as Ptr>).decay().end(), ) { let x: Ptr = x.iter_deref(); sum += { (x.read()) }; @@ -69,8 +69,8 @@ fn main_0() -> i32 { (*v2.borrow_mut()).push(__a1) }; 'loop_: for p in IterRange::new( - (v2.as_pointer() as Ptr>).begin(), - (v2.as_pointer() as Ptr>).end(), + (v2.as_pointer() as Ptr>>).decay().begin(), + (v2.as_pointer() as Ptr>>).decay().end(), ) { let mut p: Ptr = (p.iter_deref().read()); { @@ -78,15 +78,15 @@ fn main_0() -> i32 { }; } 'loop_: for p in IterRange::new( - (v2.as_pointer() as Ptr>).begin(), - (v2.as_pointer() as Ptr>).end(), + (v2.as_pointer() as Ptr>>).decay().begin(), + (v2.as_pointer() as Ptr>>).decay().end(), ) { let mut p: Ptr = (p.iter_deref().read()); sum += { (p.read()) }; } 'loop_: for p in IterRange::new( - (v2.as_pointer() as Ptr>).begin(), - (v2.as_pointer() as Ptr>).end(), + (v2.as_pointer() as Ptr>>).decay().begin(), + (v2.as_pointer() as Ptr>>).decay().end(), ) { let mut p: Ptr = (p.iter_deref().read()); { @@ -94,8 +94,8 @@ fn main_0() -> i32 { }; } 'loop_: for p in IterRange::new( - (v2.as_pointer() as Ptr>).begin(), - (v2.as_pointer() as Ptr>).end(), + (v2.as_pointer() as Ptr>>).decay().begin(), + (v2.as_pointer() as Ptr>>).decay().end(), ) { let mut p: Ptr = (p.iter_deref().read()); sum += { (p.read()) }; diff --git a/tests/unit/out/refcount/implicit_autoref.rs b/tests/unit/out/refcount/implicit_autoref.rs index 6376c26c5..22b3a4a95 100644 --- a/tests/unit/out/refcount/implicit_autoref.rs +++ b/tests/unit/out/refcount/implicit_autoref.rs @@ -49,7 +49,13 @@ fn main_0() -> i32 { assert!(((index!(p, 1_usize).read()) == 30)); assert!((b == 40)); assert!(((vec_elem!((hp), v, 1_usize).read()) == 60)); - ({ write_through_0(((Ptr::>::decay(&(p)) as Ptr).offset(0_usize as isize))) }); + ({ + write_through_0( + (((p).clone() as Ptr>) + .decay() + .offset(0_usize as isize)), + ) + }); assert!(((index!(p, 0_usize).read()) == 42)); return 0; } diff --git a/tests/unit/out/refcount/iterator_freshness.rs b/tests/unit/out/refcount/iterator_freshness.rs index f84b4b162..f0c0544f0 100644 --- a/tests/unit/out/refcount/iterator_freshness.rs +++ b/tests/unit/out/refcount/iterator_freshness.rs @@ -19,8 +19,9 @@ fn main_0() -> i32 { .map(|_| ::default()) .collect::>(), )); - let it: Value> = - Rc::new(RefCell::new((vec_.as_pointer() as Ptr).begin())); + let it: Value> = Rc::new(RefCell::new( + (vec_.as_pointer() as Ptr>).decay().begin(), + )); ({ foo_0((*it.borrow()).clone()) }); return 0; } diff --git a/tests/unit/out/refcount/iterators.rs b/tests/unit/out/refcount/iterators.rs index cba5c33a1..3a1622d17 100644 --- a/tests/unit/out/refcount/iterators.rs +++ b/tests/unit/out/refcount/iterators.rs @@ -17,22 +17,22 @@ fn main_0() -> i32 { __bytes })); 'loop_: for c in IterRange::new( - RandomAccessIterator::Vec((x.as_pointer() as Ptr)), - RandomAccessIterator::Vec((x.as_pointer() as Ptr).to_last()), + RandomAccessIterator::Vec((x.as_pointer() as Ptr>).decay()), + RandomAccessIterator::Vec((x.as_pointer() as Ptr>).decay().to_last()), ) { let c: Ptr = c.iter_deref(); c.with_mut(|__v| __v.prefix_inc()); } 'loop_: for c in IterRange::new( - RandomAccessIterator::Vec((x.as_pointer() as Ptr)), - RandomAccessIterator::Vec((x.as_pointer() as Ptr).to_last()), + RandomAccessIterator::Vec((x.as_pointer() as Ptr>).decay()), + RandomAccessIterator::Vec((x.as_pointer() as Ptr>).decay().to_last()), ) { let c: Ptr = c.iter_deref(); println!("{}", ((c.read()) as i32) as u8 as char); } 'loop_: for c in IterRange::new( - RandomAccessIterator::Vec((x.as_pointer() as Ptr)), - RandomAccessIterator::Vec((x.as_pointer() as Ptr).to_last()), + RandomAccessIterator::Vec((x.as_pointer() as Ptr>).decay()), + RandomAccessIterator::Vec((x.as_pointer() as Ptr>).decay().to_last()), ) { let mut c: i8 = (c.iter_deref().read()); println!("{}", (c as i32) as u8 as char); @@ -47,8 +47,8 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; 'loop_: for p in IterRange::new( - (v.as_pointer() as Ptr>).begin(), - (v.as_pointer() as Ptr>).end(), + (v.as_pointer() as Ptr>>).decay().begin(), + (v.as_pointer() as Ptr>>).decay().end(), ) { let mut p: Ptr = (p.iter_deref().read()); println!("{}", (p.read())); diff --git a/tests/unit/out/refcount/nested_vector.rs b/tests/unit/out/refcount/nested_vector.rs index 5b5a6bb47..270c13c28 100644 --- a/tests/unit/out/refcount/nested_vector.rs +++ b/tests/unit/out/refcount/nested_vector.rs @@ -18,7 +18,8 @@ fn main_0() -> i32 { (*v1.borrow_mut()).push(a0_clone) }; assert!( - (((Ptr::>::decay(&((v1.as_pointer() as Ptr>).to_last())) as Ptr) + ((((v1.as_pointer() as Ptr>>).decay().to_last() as Ptr>) + .decay() .offset(0_usize as isize) .read()) == 1) diff --git a/tests/unit/out/refcount/operator_traits.rs b/tests/unit/out/refcount/operator_traits.rs index 1c69bd9c9..185ffb878 100644 --- a/tests/unit/out/refcount/operator_traits.rs +++ b/tests/unit/out/refcount/operator_traits.rs @@ -165,16 +165,19 @@ fn main_0() -> i32 { Lt { v: 2 }, ]))); { - let __n = (lts.as_pointer() as Ptr) + let __n = (lts.as_pointer() as Ptr>) + .decay() .end() - .iter_distance(&(lts.as_pointer() as Ptr).begin()); + .iter_distance(&(lts.as_pointer() as Ptr>).decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (lts.as_pointer() as Ptr) + (lts.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__x) .with(|__a| { - (lts.as_pointer() as Ptr) + (lts.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__y) .with(|__b| __a.cmp(__b)) @@ -182,10 +185,17 @@ fn main_0() -> i32 { }); let __values: Vec<_> = __order .iter() - .map(|&__i| (lts.as_pointer() as Ptr).begin().iter_at(__i).read()) + .map(|&__i| { + (lts.as_pointer() as Ptr>) + .decay() + .begin() + .iter_at(__i) + .read() + }) .collect(); for (__i, __v) in (0..__n).zip(__values) { - (lts.as_pointer() as Ptr) + (lts.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__i) .write(__v); @@ -204,8 +214,8 @@ fn main_0() -> i32 { let mut nine: Eq = Eq { v: 9 }; assert!( ({ - let mut __it = (eqs.as_pointer() as Ptr).begin(); - while __it != (eqs.as_pointer() as Ptr).end() + let mut __it = (eqs.as_pointer() as Ptr>).decay().begin(); + while __it != (eqs.as_pointer() as Ptr>).decay().end() && __it.iter_deref().with(|__v| *__v != two) { __it.iter_inc(); @@ -218,14 +228,14 @@ fn main_0() -> i32 { ); assert!( { - let mut __it = (eqs.as_pointer() as Ptr).begin(); - while __it != (eqs.as_pointer() as Ptr).end() + let mut __it = (eqs.as_pointer() as Ptr>).decay().begin(); + while __it != (eqs.as_pointer() as Ptr>).decay().end() && __it.iter_deref().with(|__v| *__v != nine) { __it.iter_inc(); } __it - } == (eqs.as_pointer() as Ptr).end() + } == (eqs.as_pointer() as Ptr>).decay().end() ); let cmps: Value> = Rc::new(RefCell::new(Vec::from([ Cmp { v: 3 }, @@ -233,16 +243,19 @@ fn main_0() -> i32 { Cmp { v: 2 }, ]))); { - let __n = (cmps.as_pointer() as Ptr) + let __n = (cmps.as_pointer() as Ptr>) + .decay() .end() - .iter_distance(&(cmps.as_pointer() as Ptr).begin()); + .iter_distance(&(cmps.as_pointer() as Ptr>).decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (cmps.as_pointer() as Ptr) + (cmps.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__x) .with(|__a| { - (cmps.as_pointer() as Ptr) + (cmps.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__y) .with(|__b| __a.cmp(__b)) @@ -250,10 +263,17 @@ fn main_0() -> i32 { }); let __values: Vec<_> = __order .iter() - .map(|&__i| (cmps.as_pointer() as Ptr).begin().iter_at(__i).read()) + .map(|&__i| { + (cmps.as_pointer() as Ptr>) + .decay() + .begin() + .iter_at(__i) + .read() + }) .collect(); for (__i, __v) in (0..__n).zip(__values) { - (cmps.as_pointer() as Ptr) + (cmps.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__i) .write(__v); @@ -263,8 +283,8 @@ fn main_0() -> i32 { let mut three: Cmp = Cmp { v: 3 }; assert!( ({ - let mut __it = (cmps.as_pointer() as Ptr).begin(); - while __it != (cmps.as_pointer() as Ptr).end() + let mut __it = (cmps.as_pointer() as Ptr>).decay().begin(); + while __it != (cmps.as_pointer() as Ptr>).decay().end() && __it.iter_deref().with(|__v| *__v != three) { __it.iter_inc(); @@ -277,16 +297,19 @@ fn main_0() -> i32 { ); let frees: Value> = Rc::new(RefCell::new(Vec::from([Free { v: 2 }, Free { v: 1 }]))); { - let __n = (frees.as_pointer() as Ptr) + let __n = (frees.as_pointer() as Ptr>) + .decay() .end() - .iter_distance(&(frees.as_pointer() as Ptr).begin()); + .iter_distance(&(frees.as_pointer() as Ptr>).decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (frees.as_pointer() as Ptr) + (frees.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__x) .with(|__a| { - (frees.as_pointer() as Ptr) + (frees.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__y) .with(|__b| __a.cmp(__b)) @@ -295,14 +318,16 @@ fn main_0() -> i32 { let __values: Vec<_> = __order .iter() .map(|&__i| { - (frees.as_pointer() as Ptr) + (frees.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__i) .read() }) .collect(); for (__i, __v) in (0..__n).zip(__values) { - (frees.as_pointer() as Ptr) + (frees.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__i) .write(__v); @@ -312,8 +337,8 @@ fn main_0() -> i32 { let mut ftwo: Free = Free { v: 2 }; assert!( ({ - let mut __it = (frees.as_pointer() as Ptr).begin(); - while __it != (frees.as_pointer() as Ptr).end() + let mut __it = (frees.as_pointer() as Ptr>).decay().begin(); + while __it != (frees.as_pointer() as Ptr>).decay().end() && __it.iter_deref().with(|__v| *__v != ftwo) { __it.iter_inc(); diff --git a/tests/unit/out/refcount/printfs.rs b/tests/unit/out/refcount/printfs.rs index fec81bd86..5d9976763 100644 --- a/tests/unit/out/refcount/printfs.rs +++ b/tests/unit/out/refcount/printfs.rs @@ -59,7 +59,7 @@ fn main_0() -> i32 { __bytes.push(0); __bytes })); - println!("{}", (s.as_pointer() as Ptr)); + println!("{}", (s.as_pointer() as Ptr>).decay()); println!( "{}", (Rc::new(RefCell::new( @@ -71,12 +71,10 @@ fn main_0() -> i32 { }) }) )) - .as_pointer() as Ptr) - ); - println!( - "{}", - (Ptr::>::decay(&({ fn2_1(s.as_pointer(),) })) as Ptr) + .as_pointer() as Ptr>) + .decay() ); + println!("{}", (({ fn2_1(s.as_pointer(),) }) as Ptr>).decay()); ({ log_to_2( libcc2rs::c_stdout(), diff --git a/tests/unit/out/refcount/push_emplace_back.rs b/tests/unit/out/refcount/push_emplace_back.rs index b5904e411..9f8428f1b 100644 --- a/tests/unit/out/refcount/push_emplace_back.rs +++ b/tests/unit/out/refcount/push_emplace_back.rs @@ -99,7 +99,8 @@ pub fn nested_emplace_move_5(mut bw: Ptr) { } pub fn self_ref_push_6(mut comps: Ptr>) { { - let a0_clone = (*(Ptr::>::decay(&(comps)) as Ptr) + let a0_clone = (*((comps).clone() as Ptr>) + .decay() .upgrade() .deref()) .clone(); @@ -264,15 +265,23 @@ fn main_0() -> i32 { let queue: Value> = Rc::new(RefCell::new(Vec::new())); ({ emplace_deque_8((queue.as_pointer())) }); assert!( - ((queue.as_pointer() as Ptr).with(|__s| __s.first) == 6) - && ((queue.as_pointer() as Ptr).with(|__s| __s.second) == 14) + ((queue.as_pointer() as Ptr>) + .decay() + .with(|__s| __s.first) + == 6) + && ((queue.as_pointer() as Ptr>) + .decay() + .with(|__s| __s.second) + == 14) ); assert!( - ((queue.as_pointer() as Ptr) + ((queue.as_pointer() as Ptr>) + .decay() .to_last() .with(|__s| __s.first) == -1_i32) - && ((queue.as_pointer() as Ptr) + && ((queue.as_pointer() as Ptr>) + .decay() .to_last() .with(|__s| __s.second) == -1_i32) diff --git a/tests/unit/out/refcount/reinterpret_cast_empty_vec.rs b/tests/unit/out/refcount/reinterpret_cast_empty_vec.rs index 975c38ada..c13d2cc22 100644 --- a/tests/unit/out/refcount/reinterpret_cast_empty_vec.rs +++ b/tests/unit/out/refcount/reinterpret_cast_empty_vec.rs @@ -12,7 +12,9 @@ pub fn main() { } fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::new())); - let mut bytes: Ptr = (v.as_pointer() as Ptr).reinterpret_cast::(); + let mut bytes: Ptr = (v.as_pointer() as Ptr>) + .decay() + .reinterpret_cast::(); return 0; } pub fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/refcount/reinterpret_cast_string.rs b/tests/unit/out/refcount/reinterpret_cast_string.rs index ffc37f8c0..0bd2a15ed 100644 --- a/tests/unit/out/refcount/reinterpret_cast_string.rs +++ b/tests/unit/out/refcount/reinterpret_cast_string.rs @@ -16,7 +16,9 @@ fn main_0() -> i32 { __bytes.push(0); __bytes })); - let mut bytes: Ptr = (s.as_pointer() as Ptr).reinterpret_cast::(); + let mut bytes: Ptr = (s.as_pointer() as Ptr>) + .decay() + .reinterpret_cast::(); assert!((((elem!(bytes, 0).read()) as i32) == (('A' as i8) as i32))); assert!((((elem!(bytes, 1).read()) as i32) == (('B' as i8) as i32))); assert!((((elem!(bytes, 2).read()) as i32) == (('C' as i8) as i32))); diff --git a/tests/unit/out/refcount/reinterpret_cast_vec_write.rs b/tests/unit/out/refcount/reinterpret_cast_vec_write.rs index 2250b7499..e8efabb7a 100644 --- a/tests/unit/out/refcount/reinterpret_cast_vec_write.rs +++ b/tests/unit/out/refcount/reinterpret_cast_vec_write.rs @@ -20,7 +20,9 @@ fn main_0() -> i32 { let __a1 = 134678021_u32; (*vec_.borrow_mut()).push(__a1) }; - let mut bytes: Ptr = (vec_.as_pointer() as Ptr).reinterpret_cast::(); + let mut bytes: Ptr = (vec_.as_pointer() as Ptr>) + .decay() + .reinterpret_cast::(); assert!((((elem!(bytes, 0).read()) as i32) == 1)); assert!((((elem!(bytes, 1).read()) as i32) == 2)); assert!((((elem!(bytes, 2).read()) as i32) == 3)); diff --git a/tests/unit/out/refcount/sort.rs b/tests/unit/out/refcount/sort.rs index e04700c5c..5f300a2f4 100644 --- a/tests/unit/out/refcount/sort.rs +++ b/tests/unit/out/refcount/sort.rs @@ -53,16 +53,19 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; { - let __n = (v.as_pointer() as Ptr) + let __n = (v.as_pointer() as Ptr>) + .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr).begin()); + .iter_distance(&(v.as_pointer() as Ptr>).decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (v.as_pointer() as Ptr) + (v.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__x) .with(|__a| { - (v.as_pointer() as Ptr) + (v.as_pointer() as Ptr>) + .decay() .begin() .iter_at(__y) .with(|__b| __a.cmp(__b)) @@ -70,10 +73,20 @@ fn main_0() -> i32 { }); let __values: Vec<_> = __order .iter() - .map(|&__i| (v.as_pointer() as Ptr).begin().iter_at(__i).read()) + .map(|&__i| { + (v.as_pointer() as Ptr>) + .decay() + .begin() + .iter_at(__i) + .read() + }) .collect(); for (__i, __v) in (0..__n).zip(__values) { - (v.as_pointer() as Ptr).begin().iter_at(__i).write(__v); + (v.as_pointer() as Ptr>) + .decay() + .begin() + .iter_at(__i) + .write(__v); } }; let mut i: u32 = 0_u32; diff --git a/tests/unit/out/refcount/split_binop_aliased_borrows.rs b/tests/unit/out/refcount/split_binop_aliased_borrows.rs index a748791e4..452ed2165 100644 --- a/tests/unit/out/refcount/split_binop_aliased_borrows.rs +++ b/tests/unit/out/refcount/split_binop_aliased_borrows.rs @@ -12,8 +12,9 @@ pub fn main() { } fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::from([1, 2]))); - let p: Value> = - Rc::new(RefCell::new((v.as_pointer() as Ptr).begin())); + let p: Value> = Rc::new(RefCell::new( + (v.as_pointer() as Ptr>).decay().begin(), + )); let r: Ptr = (v.as_pointer() as Ptr).offset(1_usize); let __rhs = (r.read()); (*p.borrow()).iter_deref().write(__rhs); diff --git a/tests/unit/out/refcount/stdcopy_ostream.rs b/tests/unit/out/refcount/stdcopy_ostream.rs index 4ba7ca44a..961bed973 100644 --- a/tests/unit/out/refcount/stdcopy_ostream.rs +++ b/tests/unit/out/refcount/stdcopy_ostream.rs @@ -26,8 +26,10 @@ fn main_0() -> i32 { )); { let mut __bytes: Vec = Vec::new(); - let mut __it = RandomAccessIterator::Vec((str.as_pointer() as Ptr)); - while __it != RandomAccessIterator::Vec((str.as_pointer() as Ptr).to_last()) { + let mut __it = RandomAccessIterator::Vec((str.as_pointer() as Ptr>).decay()); + while __it + != RandomAccessIterator::Vec((str.as_pointer() as Ptr>).decay().to_last()) + { __bytes.push(__it.iter_deref().read() as u8); __it.iter_inc(); } diff --git a/tests/unit/out/refcount/string.rs b/tests/unit/out/refcount/string.rs index 69da8da79..b28440cd7 100644 --- a/tests/unit/out/refcount/string.rs +++ b/tests/unit/out/refcount/string.rs @@ -37,7 +37,7 @@ fn main_0() -> i32 { !(Ptr::::from_string_literal(b"hello") .with_c_str(|__s| (*s1.borrow())[..(*s1.borrow()).len().saturating_sub(1)] != *__s)) ); - let mut p1: Ptr = (s1.as_pointer() as Ptr); + let mut p1: Ptr = (s1.as_pointer() as Ptr>).decay(); assert!((((elem!(p1, 0).read()) as i32) == (('h' as i8) as i32))); assert!((((elem!(p1, 1).read()) as i32) == (('e' as i8) as i32))); assert!((((elem!(p1, 2).read()) as i32) == (('l' as i8) as i32))); @@ -50,7 +50,7 @@ fn main_0() -> i32 { .chain(std::iter::once(0)) .collect(), )); - let mut p2: Ptr = (s2.as_pointer() as Ptr); + let mut p2: Ptr = (s2.as_pointer() as Ptr>).decay(); let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < ((*s2.borrow()).len() - 1)) { assert!( @@ -85,7 +85,7 @@ fn main_0() -> i32 { })); assert!((((*s3.borrow()).len() - 1) == 5_usize)); assert!((((*s3.borrow()).len() - 1) == ((*s3.borrow()).len() - 1))); - let mut p3: Ptr = (s3.as_pointer() as Ptr); + let mut p3: Ptr = (s3.as_pointer() as Ptr>).decay(); let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < ((*s3.borrow()).len() - 1)) { assert!( @@ -112,7 +112,7 @@ fn main_0() -> i32 { })); assert!((((*s4.borrow()).len() - 1) == 3_usize)); assert!((((*s4.borrow()).len() - 1) == ((*s4.borrow()).len() - 1))); - let mut p4: Ptr = (s4.as_pointer() as Ptr); + let mut p4: Ptr = (s4.as_pointer() as Ptr>).decay(); let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < ((*s4.borrow()).len() - 1)) { assert!( @@ -129,7 +129,7 @@ fn main_0() -> i32 { })); assert!((((*s5.borrow()).len() - 1) == 12_usize)); assert!((((*s5.borrow()).len() - 1) == ((*s5.borrow()).len() - 1))); - let mut p5: Ptr = (s5.as_pointer() as Ptr); + let mut p5: Ptr = (s5.as_pointer() as Ptr>).decay(); let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < ((*s5.borrow()).len() - 1)) { assert!( diff --git a/tests/unit/out/refcount/string2.rs b/tests/unit/out/refcount/string2.rs index 912706f8c..a19845bb9 100644 --- a/tests/unit/out/refcount/string2.rs +++ b/tests/unit/out/refcount/string2.rs @@ -17,13 +17,15 @@ fn main_0() -> i32 { __bytes })); (*arr.borrow_mut())[1_usize] = ('b' as i8); - let mut p: Ptr = (arr.as_pointer() as Ptr).offset((1) as isize); + let mut p: Ptr = (arr.as_pointer() as Ptr>) + .decay() + .offset((1) as isize); assert!((((p.read()) as i32) == (('b' as i8) as i32))); assert!( Ptr::::from_string_literal(b"fbo") .with_c_str(|__s| (*arr.borrow())[..(*arr.borrow()).len().saturating_sub(1)] == *__s) ); - let mut names: [Ptr; 1] = [(arr.as_pointer() as Ptr)]; + let mut names: [Ptr; 1] = [(arr.as_pointer() as Ptr>).decay()]; let mut copy: Vec = { let mut __bytes = names[(0) as usize].to_c_bytes(); __bytes.push(0); diff --git a/tests/unit/out/refcount/unboxed_conditional_iterator.rs b/tests/unit/out/refcount/unboxed_conditional_iterator.rs index b1876680e..6f555f3e0 100644 --- a/tests/unit/out/refcount/unboxed_conditional_iterator.rs +++ b/tests/unit/out/refcount/unboxed_conditional_iterator.rs @@ -48,8 +48,8 @@ pub fn lehmer_2(mut sigma: Ptr, mut len: u32, mut code: Ptr) { let mut i: u32 = 0_u32; 'loop_: while (i < len) { let it: Value> = Rc::new(RefCell::new({ - let mut __it = (items.as_pointer() as Ptr).begin(); - while __it != (items.as_pointer() as Ptr).end() + let mut __it = (items.as_pointer() as Ptr>).decay().begin(); + while __it != (items.as_pointer() as Ptr>).decay().end() && __it .iter_deref() .with(|__v| *__v != (elem!(sigma, i).read())) @@ -58,9 +58,10 @@ pub fn lehmer_2(mut sigma: Ptr, mut len: u32, mut code: Ptr) { } __it })); - assert!((*it.borrow()) != (items.as_pointer() as Ptr).end()); - let __rhs = - ((*it.borrow()).iter_distance(&(items.as_pointer() as Ptr).begin()) as u32); + assert!((*it.borrow()) != (items.as_pointer() as Ptr>).decay().end()); + let __rhs = ((*it.borrow()) + .iter_distance(&(items.as_pointer() as Ptr>).decay().begin()) + as u32); elem!(code, i).write(__rhs); { let __off = >::from((*it.borrow()).clone()).index(); @@ -72,10 +73,9 @@ pub fn lehmer_2(mut sigma: Ptr, mut len: u32, mut code: Ptr) { } pub fn sum_3(v: Ptr>) -> i32 { let mut s: i32 = 0; - let it: Value> = Rc::new(RefCell::new( - (Ptr::>::decay(&(v)) as Ptr).begin(), - )); - 'loop_: while (*it.borrow()) != (Ptr::>::decay(&(v)) as Ptr).end() { + let it: Value> = + Rc::new(RefCell::new(((v).clone() as Ptr>).decay().begin())); + 'loop_: while (*it.borrow()) != ((v).clone() as Ptr>).decay().end() { s += ((*it.borrow()).iter_deref().read()); (*it.borrow_mut()).iter_inc(); } diff --git a/tests/unit/out/refcount/unboxed_locals.rs b/tests/unit/out/refcount/unboxed_locals.rs index 94e5196c4..e5fc6348a 100644 --- a/tests/unit/out/refcount/unboxed_locals.rs +++ b/tests/unit/out/refcount/unboxed_locals.rs @@ -23,8 +23,8 @@ pub struct Pair { pub fn total_2(v: Ptr>) -> i32 { let mut s: i32 = 0; 'loop_: for x in IterRange::new( - (Ptr::>::decay(&(v)) as Ptr).begin(), - (Ptr::>::decay(&(v)) as Ptr).end(), + ((v).clone() as Ptr>).decay().begin(), + ((v).clone() as Ptr>).decay().end(), ) { let mut x: i32 = (x.iter_deref().read()); s += x; @@ -160,7 +160,7 @@ fn main_0() -> i32 { ({ set_0(((elem_ptr.as_pointer() as Ptr).offset(1_usize)), 7) }); assert!(({ (*elem_ptr.borrow())[1_usize] } == 7)); let data: Value> = Rc::new(RefCell::new(vec![0; 2_usize as usize])); - ({ set_0((data.as_pointer() as Ptr), 8) }); + ({ set_0((data.as_pointer() as Ptr>).decay(), 8) }); assert!(({ (*data.borrow())[0_usize] } == 8)); let square: Value = Rc::new(RefCell::new(::default())); let mut shape: PtrDyn = (square.as_pointer()).to_dyn::(|w| w); diff --git a/tests/unit/out/refcount/vector.rs b/tests/unit/out/refcount/vector.rs index abe0cac47..5b8bf1e7f 100644 --- a/tests/unit/out/refcount/vector.rs +++ b/tests/unit/out/refcount/vector.rs @@ -56,7 +56,8 @@ fn main_0() -> i32 { assert!(((*v2.borrow()).len() == 3_usize)); { let __off = - >::from((v2.as_pointer() as Ptr).begin()).index(); + >::from((v2.as_pointer() as Ptr>).decay().begin()) + .index(); (v2.as_pointer() as Ptr>).with_mut(|__v: &mut Vec| __v.remove(__off)); RandomAccessIterator::Vec((v2.as_pointer() as Ptr>).decay() + __off) }; @@ -65,9 +66,10 @@ fn main_0() -> i32 { assert!(({ (*v2.borrow())[1_usize] } == 3)); { let __off = - >::from((v2.as_pointer() as Ptr).begin()).index(); + >::from((v2.as_pointer() as Ptr>).decay().begin()) + .index(); (*v2.borrow_mut()).insert(__off, 100); - >::from((v2.as_pointer() as Ptr).begin()) + >::from((v2.as_pointer() as Ptr>).decay().begin()) }; ({ copy_0((*v2.borrow()).clone()) }); assert!(((*v2.borrow()).len() == 3_usize)); @@ -77,31 +79,49 @@ fn main_0() -> i32 { let mut x: i32 = 7; { let __off = >::from( - (v2.as_pointer() as Ptr).begin().iter_add(1_isize), + (v2.as_pointer() as Ptr>) + .decay() + .begin() + .iter_add(1_isize), ) .index(); (*v2.borrow_mut()).insert(__off, x); - >::from((v2.as_pointer() as Ptr).begin().iter_add(1_isize)) + >::from( + (v2.as_pointer() as Ptr>) + .decay() + .begin() + .iter_add(1_isize), + ) }; assert!(((*v2.borrow()).len() == 4_usize)); assert!(({ (*v2.borrow())[0_usize] } == 100)); assert!(({ (*v2.borrow())[1_usize] } == 7)); assert!(({ (*v2.borrow())[2_usize] } == 2)); { - let __off = >::from((v2.as_pointer() as Ptr).end()).index(); + let __off = + >::from((v2.as_pointer() as Ptr>).decay().end()) + .index(); (*v2.borrow_mut()).splice(__off..__off, std::iter::repeat_n(9, 2_usize)); - >::from((v2.as_pointer() as Ptr).end()) + >::from((v2.as_pointer() as Ptr>).decay().end()) }; assert!(((*v2.borrow()).len() == 6_usize)); assert!(({ (*v2.borrow())[4_usize] } == 9)); assert!(({ (*v2.borrow())[5_usize] } == 9)); { let __off = >::from( - (v2.as_pointer() as Ptr).begin().iter_add(2_isize), + (v2.as_pointer() as Ptr>) + .decay() + .begin() + .iter_add(2_isize), ) .index(); (*v2.borrow_mut()).splice(__off..__off, Vec::from([11, 12, 13])); - >::from((v2.as_pointer() as Ptr).begin().iter_add(2_isize)) + >::from( + (v2.as_pointer() as Ptr>) + .decay() + .begin() + .iter_add(2_isize), + ) }; assert!(((*v2.borrow()).len() == 9_usize)); assert!(({ (*v2.borrow())[1_usize] } == 7)); @@ -113,10 +133,11 @@ fn main_0() -> i32 { let src: Value> = Rc::new(RefCell::new(Vec::from([21, 22]))); { let start_idx = - >::from((v2.as_pointer() as Ptr).begin()).index(); + >::from((v2.as_pointer() as Ptr>).decay().begin()) + .index(); let mut temp_vec: Vec = Vec::new(); - let mut __it = (src.as_pointer() as Ptr).begin(); - while __it != (src.as_pointer() as Ptr).end() { + let mut __it = (src.as_pointer() as Ptr>).decay().begin(); + while __it != (src.as_pointer() as Ptr>).decay().end() { temp_vec.push(__it.iter_deref().read()); __it.iter_inc(); } @@ -131,13 +152,15 @@ fn main_0() -> i32 { assert!(({ (*v2.borrow())[2_usize] } == 100)); { let __off = - >::from((v2.as_pointer() as Ptr).begin()).index(); + >::from((v2.as_pointer() as Ptr>).decay().begin()) + .index(); (v2.as_pointer() as Ptr>).with_mut(|__v: &mut Vec| __v.remove(__off)); RandomAccessIterator::Vec((v2.as_pointer() as Ptr>).decay() + __off) }; { let __off = - >::from((v2.as_pointer() as Ptr).begin()).index(); + >::from((v2.as_pointer() as Ptr>).decay().begin()) + .index(); (v2.as_pointer() as Ptr>).with_mut(|__v: &mut Vec| __v.remove(__off)); RandomAccessIterator::Vec((v2.as_pointer() as Ptr>).decay() + __off) }; @@ -145,7 +168,10 @@ fn main_0() -> i32 { 'loop_: while (i < 4) { { let __off = >::from( - (v2.as_pointer() as Ptr).begin().iter_add(1_isize), + (v2.as_pointer() as Ptr>) + .decay() + .begin() + .iter_add(1_isize), ) .index(); (v2.as_pointer() as Ptr>).with_mut(|__v: &mut Vec| __v.remove(__off)); @@ -210,9 +236,9 @@ fn main_0() -> i32 { ); i.prefix_inc(); } - let mut p1: Ptr = (v6.as_pointer() as Ptr); + let mut p1: Ptr = (v6.as_pointer() as Ptr>).decay(); assert!(((p1.read()) == 2_f64)); - let mut p2: Ptr = (v3.as_pointer() as Ptr); + let mut p2: Ptr = (v3.as_pointer() as Ptr>).decay(); assert!(((p2.read()) == 1)); assert!(({ (*v3.borrow())[0_usize] } == 1)); assert!(({ (*v3.borrow())[1_usize] } == 1)); @@ -250,55 +276,75 @@ fn main_0() -> i32 { }; assert!(((*v3.borrow()).capacity() == 201_usize)); assert!(((*v3.borrow()).len() == 100_usize)); - assert!((((v2.as_pointer() as Ptr).to_last().read()) == 3)); - assert!((((v3.as_pointer() as Ptr).to_last().read()) == 1)); - assert!(((v4.as_pointer() as Ptr>).to_last().read()).is_null()); - assert!(((v5.as_pointer() as Ptr>).to_last().read()).is_null()); - assert!((((v6.as_pointer() as Ptr).to_last().read()) == 2_f64)); - let ref0: Ptr = (v6.as_pointer() as Ptr).to_last(); + assert!((((v2.as_pointer() as Ptr>).decay().to_last().read()) == 3)); + assert!((((v3.as_pointer() as Ptr>).decay().to_last().read()) == 1)); + assert!( + ((v4.as_pointer() as Ptr>>) + .decay() + .to_last() + .read()) + .is_null() + ); + assert!( + ((v5.as_pointer() as Ptr>>) + .decay() + .to_last() + .read()) + .is_null() + ); + assert!((((v6.as_pointer() as Ptr>).decay().to_last().read()) == 2_f64)); + let ref0: Ptr = (v6.as_pointer() as Ptr>).decay().to_last(); ref0.write(5_f64); - assert!((((v6.as_pointer() as Ptr).to_last().read()) == 5_f64)); - let mut x0: f64 = ((v6.as_pointer() as Ptr).to_last().read()); + assert!((((v6.as_pointer() as Ptr>).decay().to_last().read()) == 5_f64)); + let mut x0: f64 = ((v6.as_pointer() as Ptr>).decay().to_last().read()); assert!((x0 == 5_f64)); x0 = 6_f64; - assert!((((v6.as_pointer() as Ptr).to_last().read()) == 5_f64)); + assert!((((v6.as_pointer() as Ptr>).decay().to_last().read()) == 5_f64)); let mut idx: i32 = 0; assert!( - (((v6.as_pointer() as Ptr) + (((v6.as_pointer() as Ptr>) + .decay() .offset((idx as usize) as isize) .read()) == 2_f64) ); assert!( - (((v6.as_pointer() as Ptr) + (((v6.as_pointer() as Ptr>) + .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()) == 5_f64) ); - let ref1: Ptr = (v6.as_pointer() as Ptr).offset((s2).wrapping_sub(1_usize) as isize); + let ref1: Ptr = (v6.as_pointer() as Ptr>) + .decay() + .offset((s2).wrapping_sub(1_usize) as isize); { ref1.with_mut(|__v| *__v = *__v + 1.5_f64) }; assert!( - (((v6.as_pointer() as Ptr) + (((v6.as_pointer() as Ptr>) + .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()) == 6.5_f64) ); - let mut x1: f64 = ((v6.as_pointer() as Ptr) + let mut x1: f64 = ((v6.as_pointer() as Ptr>) + .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()); assert!((x1 == 6.5_f64)); x1 -= 1.5_f64; assert!( - (((v6.as_pointer() as Ptr) + (((v6.as_pointer() as Ptr>) + .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()) == 6.5_f64) ); assert!( (((s1).wrapping_add(s2)).wrapping_add( - (((v2.as_pointer() as Ptr) + (((v2.as_pointer() as Ptr>) + .decay() .offset(0_usize as isize) .read()) as usize) ) == 103_usize) diff --git a/tests/unit/out/refcount/vector2.rs b/tests/unit/out/refcount/vector2.rs index 06cc6d01b..208b4465d 100644 --- a/tests/unit/out/refcount/vector2.rs +++ b/tests/unit/out/refcount/vector2.rs @@ -41,10 +41,10 @@ pub fn fn_0(v: Ptr>, v3: Vec) { (v2.as_pointer() as Ptr>).write((*v.upgrade().deref()).clone()); index!(v4, 1_usize).write(13); assert!((x == 6)); - assert!((((Ptr::>::decay(&(v)) as Ptr).read()) == 4)); + assert!(((((v).clone() as Ptr>).decay().read()) == 4)); assert!(((index!(v, 1_usize).read()) == 5)); assert!(((index!(v, 2_usize).read()) == 6)); - assert!((((Ptr::>::decay(&(v)) as Ptr).to_last().read()) == 20)); + assert!(((((v).clone() as Ptr>).decay().to_last().read()) == 20)); assert!(({ (*v2.borrow())[0_usize] } == 4)); assert!(({ (*v2.borrow())[1_usize] } == 5)); assert!(({ (*v2.borrow())[2_usize] } == 6)); diff --git a/tests/unit/out/refcount/vector3.rs b/tests/unit/out/refcount/vector3.rs index f29da1f9a..ae30e3550 100644 --- a/tests/unit/out/refcount/vector3.rs +++ b/tests/unit/out/refcount/vector3.rs @@ -30,40 +30,40 @@ fn main_0() -> i32 { index!(elem!((v.as_pointer() as Ptr>), 0_usize), 1_usize).write(5); index!(elem!((v.as_pointer() as Ptr>), 1_usize), 0_usize).write(6); 'loop_: for v2 in IterRange::new( - (v.as_pointer() as Ptr>).begin(), - (v.as_pointer() as Ptr>).end(), + (v.as_pointer() as Ptr>>).decay().begin(), + (v.as_pointer() as Ptr>>).decay().end(), ) { let v2: Ptr> = v2.iter_deref(); 'loop_: for i in IterRange::new( - (Ptr::>::decay(&(v2)) as Ptr).begin(), - (Ptr::>::decay(&(v2)) as Ptr).end(), + ((v2).clone() as Ptr>).decay().begin(), + ((v2).clone() as Ptr>).decay().end(), ) { let i: Ptr = i.iter_deref(); i.with_mut(|__v| __v.prefix_inc()); } } 'loop_: for v2 in IterRange::new( - (v.as_pointer() as Ptr>).begin(), - (v.as_pointer() as Ptr>).end(), + (v.as_pointer() as Ptr>>).decay().begin(), + (v.as_pointer() as Ptr>>).decay().end(), ) { let v2: Ptr> = v2.iter_deref(); 'loop_: for i in IterRange::new( - (Ptr::>::decay(&(v2)) as Ptr).begin(), - (Ptr::>::decay(&(v2)) as Ptr).end(), + ((v2).clone() as Ptr>).decay().begin(), + ((v2).clone() as Ptr>).decay().end(), ) { let mut i: i32 = (i.iter_deref().read()); println!("{}", (i + 3)); } } 'loop_: for v2 in IterRange::new( - (v.as_pointer() as Ptr>).begin(), - (v.as_pointer() as Ptr>).end(), + (v.as_pointer() as Ptr>>).decay().begin(), + (v.as_pointer() as Ptr>>).decay().end(), ) { let v2: Value> = Rc::new(RefCell::new((*v2.iter_deref().upgrade().deref()).clone())); 'loop_: for i in IterRange::new( - (v2.as_pointer() as Ptr).begin(), - (v2.as_pointer() as Ptr).end(), + (v2.as_pointer() as Ptr>).decay().begin(), + (v2.as_pointer() as Ptr>).decay().end(), ) { let mut i: i32 = (i.iter_deref().read()); println!("{}", i); diff --git a/tests/unit/out/refcount/vector_addr_of_back.rs b/tests/unit/out/refcount/vector_addr_of_back.rs index 3a8c6b25a..850298298 100644 --- a/tests/unit/out/refcount/vector_addr_of_back.rs +++ b/tests/unit/out/refcount/vector_addr_of_back.rs @@ -17,10 +17,10 @@ fn main_0() -> i32 { let a0_clone = inner.clone(); (*outer.borrow_mut()).push(a0_clone) }; - let mut sink: Ptr> = ((outer.as_pointer() as Ptr>).to_last()); + let mut sink: Ptr> = ((outer.as_pointer() as Ptr>>).decay().to_last()); assert!(((*sink.upgrade().deref()).len() == 0_usize)); let mut p: Ptr>> = (outer.as_pointer()); - sink = ((Ptr::>>::decay(&(p)) as Ptr>).to_last()); + sink = (((p).clone() as Ptr>>).decay().to_last()); assert!(((*sink.upgrade().deref()).len() == 0_usize)); return 0; } diff --git a/tests/unit/out/refcount/vector_deque_vector_string.rs b/tests/unit/out/refcount/vector_deque_vector_string.rs index ee5cda203..1257e7cbe 100644 --- a/tests/unit/out/refcount/vector_deque_vector_string.rs +++ b/tests/unit/out/refcount/vector_deque_vector_string.rs @@ -57,9 +57,10 @@ fn main_0() -> i32 { { let __a1 = { let mut r = (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) + &(((v.as_pointer() as Ptr>>>) .offset(0_usize) - .as_pointer() as Ptr>>), + .as_pointer() as Ptr>>>) + .decay()), ) as Ptr>) .offset(1_usize) .as_pointer() as Ptr>) @@ -73,14 +74,16 @@ fn main_0() -> i32 { }; ((v.as_pointer() as Ptr>>>) .offset(1_usize) - .as_pointer() as Ptr>>) + .as_pointer() as Ptr>>>) + .decay() .to_last() .with_mut(|__v: &mut Vec>| __v.push(__a1)) }; assert!( ((*((v.as_pointer() as Ptr>>>) .offset(0_usize) - .as_pointer() as Ptr>>) + .as_pointer() as Ptr>>>) + .decay() .upgrade() .deref()) .len() @@ -89,24 +92,27 @@ fn main_0() -> i32 { assert!( ((*((v.as_pointer() as Ptr>>>) .offset(1_usize) - .as_pointer() as Ptr>>) + .as_pointer() as Ptr>>>) + .decay() .upgrade() .deref()) .len() == 3_usize) && (Ptr::::from_string_literal(b"def").with_c_str(|__s| { (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) + &(((v.as_pointer() as Ptr>>>) .offset(1_usize) - .as_pointer() as Ptr>>), + .as_pointer() as Ptr>>>) + .decay()), ) as Ptr>) .offset(2_usize) .as_pointer() as Ptr>) .upgrade() .deref())[..(*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) + &(((v.as_pointer() as Ptr>>>) .offset(1_usize) - .as_pointer() as Ptr>>), + .as_pointer() as Ptr>>>) + .decay()), ) as Ptr>) .offset(2_usize) .as_pointer() as Ptr>) @@ -121,7 +127,8 @@ fn main_0() -> i32 { (*((Ptr::>>::decay( &(((v.as_pointer() as Ptr>>>) .offset(1_usize) - .as_pointer() as Ptr>>) + .as_pointer() as Ptr>>>) + .decay() .to_last()), ) as Ptr>) .offset(0_usize) @@ -130,7 +137,8 @@ fn main_0() -> i32 { .deref())[..(*((Ptr::>>::decay( &(((v.as_pointer() as Ptr>>>) .offset(1_usize) - .as_pointer() as Ptr>>) + .as_pointer() as Ptr>>>) + .decay() .to_last()), ) as Ptr>) .offset(0_usize) @@ -143,9 +151,10 @@ fn main_0() -> i32 { })); let copy: Value>>>> = Rc::new(RefCell::new((*v.borrow()).clone())); ((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) + &(((copy.as_pointer() as Ptr>>>) .offset(0_usize) - .as_pointer() as Ptr>>), + .as_pointer() as Ptr>>>) + .decay()), ) as Ptr>) .offset(0_usize) .as_pointer() as Ptr>) @@ -156,9 +165,10 @@ fn main_0() -> i32 { }); if 0_usize as usize >= (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) + &(((v.as_pointer() as Ptr>>>) .offset(0_usize) - .as_pointer() as Ptr>>), + .as_pointer() as Ptr>>>) + .decay()), ) as Ptr>) .offset(1_usize) .as_pointer() as Ptr>) @@ -170,9 +180,10 @@ fn main_0() -> i32 { panic!("out of bounds access") } else { ((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) + &(((v.as_pointer() as Ptr>>>) .offset(0_usize) - .as_pointer() as Ptr>>), + .as_pointer() as Ptr>>>) + .decay()), ) as Ptr>) .offset(1_usize) .as_pointer() as Ptr>) @@ -182,18 +193,20 @@ fn main_0() -> i32 { .write(('B' as i8)); assert!( (Ptr::::from_string_literal(b"a").with_c_str(|__s| (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) + &(((v.as_pointer() as Ptr>>>) .offset(0_usize) - .as_pointer() as Ptr>>) + .as_pointer() as Ptr>>>) + .decay()) ) as Ptr>) .offset(0_usize) .as_pointer() as Ptr>) .upgrade() .deref())[..(*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) + &(((v.as_pointer() as Ptr>>>) .offset(0_usize) - .as_pointer() as Ptr>>) + .as_pointer() as Ptr>>>) + .decay()) ) as Ptr>) .offset(0_usize) .as_pointer() as Ptr>) @@ -204,17 +217,19 @@ fn main_0() -> i32 { == *__s)) && (Ptr::::from_string_literal(b"z").with_c_str(|__s| { (*((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) + &(((copy.as_pointer() as Ptr>>>) .offset(0_usize) - .as_pointer() as Ptr>>), + .as_pointer() as Ptr>>>) + .decay()), ) as Ptr>) .offset(0_usize) .as_pointer() as Ptr>) .upgrade() .deref())[..(*((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) + &(((copy.as_pointer() as Ptr>>>) .offset(0_usize) - .as_pointer() as Ptr>>), + .as_pointer() as Ptr>>>) + .decay()), ) as Ptr>) .offset(0_usize) .as_pointer() as Ptr>) @@ -227,18 +242,20 @@ fn main_0() -> i32 { ); assert!( (Ptr::::from_string_literal(b"Bc").with_c_str(|__s| (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) + &(((v.as_pointer() as Ptr>>>) .offset(0_usize) - .as_pointer() as Ptr>>) + .as_pointer() as Ptr>>>) + .decay()) ) as Ptr>) .offset(1_usize) .as_pointer() as Ptr>) .upgrade() .deref())[..(*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) + &(((v.as_pointer() as Ptr>>>) .offset(0_usize) - .as_pointer() as Ptr>>) + .as_pointer() as Ptr>>>) + .decay()) ) as Ptr>) .offset(1_usize) .as_pointer() as Ptr>) @@ -249,17 +266,19 @@ fn main_0() -> i32 { == *__s)) && (Ptr::::from_string_literal(b"bc").with_c_str(|__s| { (*((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) + &(((copy.as_pointer() as Ptr>>>) .offset(0_usize) - .as_pointer() as Ptr>>), + .as_pointer() as Ptr>>>) + .decay()), ) as Ptr>) .offset(1_usize) .as_pointer() as Ptr>) .upgrade() .deref())[..(*((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) + &(((copy.as_pointer() as Ptr>>>) .offset(0_usize) - .as_pointer() as Ptr>>), + .as_pointer() as Ptr>>>) + .decay()), ) as Ptr>) .offset(1_usize) .as_pointer() as Ptr>) @@ -274,17 +293,19 @@ fn main_0() -> i32 { .with_mut(|__v: &mut Vec>>| __v.remove(0)); assert!(Ptr::::from_string_literal(b"bcx").with_c_str(|__s| { (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) + &(((v.as_pointer() as Ptr>>>) .offset(1_usize) - .as_pointer() as Ptr>>), + .as_pointer() as Ptr>>>) + .decay()), ) as Ptr>) .offset(0_usize) .as_pointer() as Ptr>) .upgrade() .deref())[..(*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) + &(((v.as_pointer() as Ptr>>>) .offset(1_usize) - .as_pointer() as Ptr>>), + .as_pointer() as Ptr>>>) + .decay()), ) as Ptr>) .offset(0_usize) .as_pointer() as Ptr>) @@ -297,7 +318,8 @@ fn main_0() -> i32 { assert!( ((*((copy.as_pointer() as Ptr>>>) .offset(1_usize) - .as_pointer() as Ptr>>) + .as_pointer() as Ptr>>>) + .decay() .upgrade() .deref()) .len() diff --git a/tests/unit/out/refcount/vector_iter_range_ctor.rs b/tests/unit/out/refcount/vector_iter_range_ctor.rs index 0ed61aa43..c25155822 100644 --- a/tests/unit/out/refcount/vector_iter_range_ctor.rs +++ b/tests/unit/out/refcount/vector_iter_range_ctor.rs @@ -140,7 +140,8 @@ fn main_0() -> i32 { ); { let start_idx = , Value)>>::from( - (v6.as_pointer() as Ptr<(Value, Value)>) + (v6.as_pointer() as Ptr, Value)>>) + .decay() .begin() .iter_add(1_isize), ) diff --git a/tests/unit/out/refcount/vector_with_allocator.rs b/tests/unit/out/refcount/vector_with_allocator.rs index 51daeadb8..9fa53a67a 100644 --- a/tests/unit/out/refcount/vector_with_allocator.rs +++ b/tests/unit/out/refcount/vector_with_allocator.rs @@ -47,10 +47,10 @@ pub fn fn_1(v: Ptr>, v3: Vec) { .write(7); index!(v4, 1_usize).write(13); assert!((x == 6)); - assert!((((Ptr::>::decay(&(v)) as Ptr).read()) == 4)); + assert!(((((v).clone() as Ptr>).decay().read()) == 4)); assert!(((index!(v, 1_usize).read()) == 5)); assert!(((index!(v, 2_usize).read()) == 6)); - assert!((((Ptr::>::decay(&(v)) as Ptr).to_last().read()) == 20)); + assert!(((((v).clone() as Ptr>).decay().to_last().read()) == 20)); assert!(({ (*v3.borrow())[0_usize] } == 7)); assert!(({ (*v3.borrow())[1_usize] } == 13)); { @@ -101,7 +101,8 @@ fn main_0() -> i32 { assert!(((*v2.borrow()).len() == 3_usize)); { let __off = - >::from((v2.as_pointer() as Ptr).begin()).index(); + >::from((v2.as_pointer() as Ptr>).decay().begin()) + .index(); (v2.as_pointer() as Ptr>).with_mut(|__v: &mut Vec| __v.remove(__off)); RandomAccessIterator::Vec((v2.as_pointer() as Ptr>).decay() + __off) }; @@ -110,9 +111,10 @@ fn main_0() -> i32 { assert!(({ (*v2.borrow())[1_usize] } == 3)); { let __off = - >::from((v2.as_pointer() as Ptr).begin()).index(); + >::from((v2.as_pointer() as Ptr>).decay().begin()) + .index(); (*v2.borrow_mut()).insert(__off, 100); - >::from((v2.as_pointer() as Ptr).begin()) + >::from((v2.as_pointer() as Ptr>).decay().begin()) }; ({ copy_0((*v2.borrow()).clone()) }); assert!(((*v2.borrow()).len() == 3_usize)); @@ -134,9 +136,9 @@ fn main_0() -> i32 { assert!(({ (*v6.borrow())[(i as usize)] } == 2_f64)); i.prefix_inc(); } - let mut p1: Ptr = (v6.as_pointer() as Ptr); + let mut p1: Ptr = (v6.as_pointer() as Ptr>).decay(); assert!(((p1.read()) == 2_f64)); - let mut p2: Ptr = (v3.as_pointer() as Ptr); + let mut p2: Ptr = (v3.as_pointer() as Ptr>).decay(); assert!(((p2.read()) == 1)); assert!(({ (*v3.borrow())[0_usize] } == 1)); assert!(({ (*v3.borrow())[1_usize] } == 1)); @@ -174,46 +176,53 @@ fn main_0() -> i32 { }; assert!(((*v3.borrow()).capacity() == 201_usize)); assert!(((*v3.borrow()).len() == 100_usize)); - assert!((((v2.as_pointer() as Ptr).to_last().read()) == 3)); - assert!((((v3.as_pointer() as Ptr).to_last().read()) == 1)); - assert!((((v6.as_pointer() as Ptr).to_last().read()) == 2_f64)); - let ref0: Ptr = (v6.as_pointer() as Ptr).to_last(); + assert!((((v2.as_pointer() as Ptr>).decay().to_last().read()) == 3)); + assert!((((v3.as_pointer() as Ptr>).decay().to_last().read()) == 1)); + assert!((((v6.as_pointer() as Ptr>).decay().to_last().read()) == 2_f64)); + let ref0: Ptr = (v6.as_pointer() as Ptr>).decay().to_last(); ref0.write(5_f64); - assert!((((v6.as_pointer() as Ptr).to_last().read()) == 5_f64)); - let mut x0: f64 = ((v6.as_pointer() as Ptr).to_last().read()); + assert!((((v6.as_pointer() as Ptr>).decay().to_last().read()) == 5_f64)); + let mut x0: f64 = ((v6.as_pointer() as Ptr>).decay().to_last().read()); assert!((x0 == 5_f64)); x0 = 6_f64; - assert!((((v6.as_pointer() as Ptr).to_last().read()) == 5_f64)); + assert!((((v6.as_pointer() as Ptr>).decay().to_last().read()) == 5_f64)); let mut idx: i32 = 0; assert!( - (((v6.as_pointer() as Ptr) + (((v6.as_pointer() as Ptr>) + .decay() .offset((idx as usize) as isize) .read()) == 2_f64) ); assert!( - (((v6.as_pointer() as Ptr) + (((v6.as_pointer() as Ptr>) + .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()) == 5_f64) ); - let ref1: Ptr = (v6.as_pointer() as Ptr).offset((s2).wrapping_sub(1_usize) as isize); + let ref1: Ptr = (v6.as_pointer() as Ptr>) + .decay() + .offset((s2).wrapping_sub(1_usize) as isize); { ref1.with_mut(|__v| *__v = *__v + 1.5_f64) }; assert!( - (((v6.as_pointer() as Ptr) + (((v6.as_pointer() as Ptr>) + .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()) == 6.5_f64) ); - let mut x1: f64 = ((v6.as_pointer() as Ptr) + let mut x1: f64 = ((v6.as_pointer() as Ptr>) + .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()); assert!((x1 == 6.5_f64)); x1 -= 1.5_f64; assert!( - (((v6.as_pointer() as Ptr) + (((v6.as_pointer() as Ptr>) + .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()) == 6.5_f64) @@ -304,7 +313,8 @@ fn main_0() -> i32 { assert!(((v13[0_usize] as i32) == 10) && ((v13[4_usize] as i32) == 50)); assert!( (((s1).wrapping_add(s2)).wrapping_add( - (((v2.as_pointer() as Ptr) + (((v2.as_pointer() as Ptr>) + .decay() .offset(0_usize as isize) .read()) as usize) ) == 103_usize) diff --git a/tests/unit/out/refcount/void_return.rs b/tests/unit/out/refcount/void_return.rs index 7a852ca37..f755ba78c 100644 --- a/tests/unit/out/refcount/void_return.rs +++ b/tests/unit/out/refcount/void_return.rs @@ -58,8 +58,8 @@ pub fn main() { fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::from([1, 3, 0, 2, 8, 7]))); ({ - let _first: RandomAccessIterator = (v.as_pointer() as Ptr).begin(); - let _last: RandomAccessIterator = (v.as_pointer() as Ptr).end(); + let _first: RandomAccessIterator = (v.as_pointer() as Ptr>).decay().begin(); + let _last: RandomAccessIterator = (v.as_pointer() as Ptr>).decay().end(); f1_0(_first, _last) }); let a: Value> = Rc::new(RefCell::new(Box::new([1, 2, 3]))); From 1db740f32841c7f479dd7bef93c01f6216e806f3 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 13:53:51 +0100 Subject: [PATCH 03/62] Update tests --- .../out/refcount/defaulted_move_cross_tu.rs | 3 +- .../refcount/dangling-prvalue-as-lvalue.rs | 9 +- .../out/refcount/row_ptr_outlives_vector.rs | 6 +- tests/unit/out/refcount/07_unique.rs | 5 +- tests/unit/out/refcount/11_move.rs | 2 +- tests/unit/out/refcount/alloc_array.rs | 2 +- tests/unit/out/refcount/auto.rs | 6 +- tests/unit/out/refcount/class_templates.rs | 12 +- tests/unit/out/refcount/clone_vs_move.rs | 66 ++-- .../unit/out/refcount/compound_assign_ref.rs | 6 +- .../unit/out/refcount/copy_move_defaulted.rs | 23 +- .../refcount/elidable_iterator_copy_cxx11.rs | 60 ++-- tests/unit/out/refcount/find.rs | 69 ++--- tests/unit/out/refcount/fn_ptr_stable_sort.rs | 29 +- tests/unit/out/refcount/foreach.rs | 5 +- .../refcount/foreach_disjoint_field_borrow.rs | 8 +- tests/unit/out/refcount/foreach_double.rs | 61 ++-- tests/unit/out/refcount/foreach_map.rs | 18 +- tests/unit/out/refcount/foreach_mut.rs | 38 +-- tests/unit/out/refcount/huffman.rs | 4 +- tests/unit/out/refcount/implicit_autoref.rs | 8 +- tests/unit/out/refcount/inet_pton_ntop.rs | 87 ++---- .../out/refcount/inline_container_fields.rs | 29 +- tests/unit/out/refcount/iterator_freshness.rs | 5 +- tests/unit/out/refcount/iterators.rs | 17 +- tests/unit/out/refcount/kruskal.rs | 6 +- tests/unit/out/refcount/map-reallocation.rs | 14 +- tests/unit/out/refcount/map.rs | 130 ++++---- tests/unit/out/refcount/map_copy.rs | 12 +- tests/unit/out/refcount/map_key_identity.rs | 289 ++++++++++-------- tests/unit/out/refcount/matmul.rs | 4 +- tests/unit/out/refcount/move_assign.rs | 7 +- tests/unit/out/refcount/nested_vector.rs | 4 +- tests/unit/out/refcount/operator_traits.rs | 139 ++++----- tests/unit/out/refcount/printfs.rs | 10 +- tests/unit/out/refcount/push_emplace_back.rs | 40 +-- .../refcount/redundant_copy_in_conversion.rs | 6 +- tests/unit/out/refcount/references2.rs | 2 +- .../refcount/reinterpret_cast_empty_vec.rs | 4 +- .../out/refcount/reinterpret_cast_string.rs | 4 +- .../refcount/reinterpret_cast_vec_write.rs | 4 +- tests/unit/out/refcount/sort.rs | 37 +-- .../refcount/split_binop_aliased_borrows.rs | 6 +- tests/unit/out/refcount/stdcopy_ostream.rs | 6 +- tests/unit/out/refcount/string.rs | 12 +- tests/unit/out/refcount/string2.rs | 6 +- .../refcount/structured_binding_move_ctor.rs | 4 +- tests/unit/out/refcount/sys_stat.rs | 46 ++- .../refcount/unboxed_conditional_iterator.rs | 21 +- tests/unit/out/refcount/unboxed_locals.rs | 9 +- tests/unit/out/refcount/unique_ptr.rs | 13 +- .../out/refcount/unique_ptr_const_deref.rs | 5 +- .../out/refcount/unique_ptr_field_reset.rs | 6 +- tests/unit/out/refcount/unique_ptr_nested.rs | 2 +- tests/unit/out/refcount/unique_ptr_small.rs | 2 +- tests/unit/out/refcount/vector.rs | 152 ++++----- tests/unit/out/refcount/vector2.rs | 10 +- tests/unit/out/refcount/vector3.rs | 39 +-- .../unit/out/refcount/vector_addr_of_back.rs | 4 +- .../refcount/vector_deque_vector_string.rs | 279 ++++++++--------- .../out/refcount/vector_iter_range_ctor.rs | 32 +- .../out/refcount/vector_subscript_borrow.rs | 10 +- .../out/refcount/vector_subscript_direct.rs | 74 ++--- .../out/refcount/vector_with_allocator.rs | 64 ++-- tests/unit/out/refcount/void_cast.rs | 2 +- tests/unit/out/refcount/void_return.rs | 4 +- 66 files changed, 871 insertions(+), 1227 deletions(-) diff --git a/tests/multi-file/defaulted_move_cross_tu/out/refcount/defaulted_move_cross_tu.rs b/tests/multi-file/defaulted_move_cross_tu/out/refcount/defaulted_move_cross_tu.rs index eb7112d27..158702ba8 100644 --- a/tests/multi-file/defaulted_move_cross_tu/out/refcount/defaulted_move_cross_tu.rs +++ b/tests/multi-file/defaulted_move_cross_tu/out/refcount/defaulted_move_cross_tu.rs @@ -70,7 +70,8 @@ pub trait SImpl { } impl SImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ref!((*self), v).as_pointer() as Ptr>) + field_ref!((*self), v) + .as_pointer() .write(field!(_a0, v).with_mut(std::mem::take)); { ((array_field_ptr!((*self), n)) as Ptr) diff --git a/tests/ub/out/refcount/dangling-prvalue-as-lvalue.rs b/tests/ub/out/refcount/dangling-prvalue-as-lvalue.rs index 954331062..99e76cf95 100644 --- a/tests/ub/out/refcount/dangling-prvalue-as-lvalue.rs +++ b/tests/ub/out/refcount/dangling-prvalue-as-lvalue.rs @@ -15,14 +15,7 @@ pub fn main() { } fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::from([1, 2]))); - let b: Ptr = ({ - foo_0( - (v.as_pointer() as Ptr>) - .decay() - .begin() - .iter_deref(), - ) - }); + let b: Ptr = ({ foo_0(v.as_pointer().decay().begin().iter_deref()) }); (*v.borrow_mut()).clear(); return (b.read()); } diff --git a/tests/ub/out/refcount/row_ptr_outlives_vector.rs b/tests/ub/out/refcount/row_ptr_outlives_vector.rs index 31bbe9c08..6c953df4c 100644 --- a/tests/ub/out/refcount/row_ptr_outlives_vector.rs +++ b/tests/ub/out/refcount/row_ptr_outlives_vector.rs @@ -11,9 +11,11 @@ pub fn second_row_0() -> Ptr { Vec::from([1, 2, 3]), Vec::from([4, 5, 6]), ]))); - return ((rows.as_pointer() as Ptr>) + return rows + .as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr>) + .as_pointer() .decay(); } pub fn main() { diff --git a/tests/unit/out/refcount/07_unique.rs b/tests/unit/out/refcount/07_unique.rs index 0a5cee656..86a855182 100644 --- a/tests/unit/out/refcount/07_unique.rs +++ b/tests/unit/out/refcount/07_unique.rs @@ -21,8 +21,9 @@ fn main_0() -> i32 { 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()); + f.as_pointer().write(Some(Rc::new(RefCell::new(9))).take()); + f.as_pointer() + .write(({ fn_0((*f.borrow_mut()).take()) }).take()); assert!((((*f.borrow()).as_pointer().read()) == 10)); return 0; } diff --git a/tests/unit/out/refcount/11_move.rs b/tests/unit/out/refcount/11_move.rs index 18219cb7f..e4f6d18f9 100644 --- a/tests/unit/out/refcount/11_move.rs +++ b/tests/unit/out/refcount/11_move.rs @@ -8,7 +8,7 @@ use std::os::fd::AsFd; use std::rc::{Rc, Weak}; pub fn change_0(n: Ptr>>) { let m: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(20))))); - ((n).clone() as Ptr>>).write((*m.borrow_mut()).take()); + (n).clone().write((*m.borrow_mut()).take()); assert!(((*m.borrow()).as_pointer()).is_null()); } pub fn main() { diff --git a/tests/unit/out/refcount/alloc_array.rs b/tests/unit/out/refcount/alloc_array.rs index 6e42ca74e..7db2e87ce 100644 --- a/tests/unit/out/refcount/alloc_array.rs +++ b/tests/unit/out/refcount/alloc_array.rs @@ -19,7 +19,7 @@ pub fn All_0(arr: Ptr>>>, mut N: i32, mut element: i32) .write(element); i.prefix_inc(); } - ((arr).clone() as Ptr>>>).write((*all.borrow_mut()).take()); + (arr).clone().write((*all.borrow_mut()).take()); } pub fn Consume_1(mut arr: Option>>, mut N: i32) -> i32 { let mut sum: i32 = 0; diff --git a/tests/unit/out/refcount/auto.rs b/tests/unit/out/refcount/auto.rs index 20c6fbf1e..8358e2952 100644 --- a/tests/unit/out/refcount/auto.rs +++ b/tests/unit/out/refcount/auto.rs @@ -24,10 +24,8 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; let mut sum: i32 = 0; - 'loop_: for elem in IterRange::new( - (v.as_pointer() as Ptr>).decay().begin(), - (v.as_pointer() as Ptr>).decay().end(), - ) { + 'loop_: for elem in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) + { let mut elem: i32 = (elem.iter_deref().read()); sum += elem; } diff --git a/tests/unit/out/refcount/class_templates.rs b/tests/unit/out/refcount/class_templates.rs index b26c7bbe9..03f32dca7 100644 --- a/tests/unit/out/refcount/class_templates.rs +++ b/tests/unit/out/refcount/class_templates.rs @@ -231,9 +231,7 @@ impl MyContainer_char_Impl for Ptr { return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { - return (field_ref!((*self), vec_).as_pointer() as Ptr>) - .decay() - .to_last(); + return field_ref!((*self), vec_).as_pointer().decay().to_last(); } fn pop_back(&self) { field!((*self), vec_).with_mut(|__v: &mut Vec| __v.pop()); @@ -264,9 +262,7 @@ impl MyContainer_float_Impl for Ptr { return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { - return (field_ref!((*self), vec_).as_pointer() as Ptr>) - .decay() - .to_last(); + return field_ref!((*self), vec_).as_pointer().decay().to_last(); } fn pop_back(&self) { field!((*self), vec_).with_mut(|__v: &mut Vec| __v.pop()); @@ -297,9 +293,7 @@ impl MyContainer_int_Impl for Ptr { return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { - return (field_ref!((*self), vec_).as_pointer() as Ptr>) - .decay() - .to_last(); + return field_ref!((*self), vec_).as_pointer().decay().to_last(); } fn pop_back(&self) { field!((*self), vec_).with_mut(|__v: &mut Vec| __v.pop()); diff --git a/tests/unit/out/refcount/clone_vs_move.rs b/tests/unit/out/refcount/clone_vs_move.rs index 56bae56d0..b6ee1a62e 100644 --- a/tests/unit/out/refcount/clone_vs_move.rs +++ b/tests/unit/out/refcount/clone_vs_move.rs @@ -161,18 +161,14 @@ fn main_0() -> i32 { let mut i: i32 = 0; 'loop_: while (i < N) { assert!( - ((*((m1.as_pointer() as Ptr>) - .offset((i as usize)) - .as_pointer() as Ptr>) + ((*(m1.as_pointer().decay().offset((i as usize)).as_pointer() as Ptr>) .upgrade() .deref()) .len() == 10_usize) ); assert!( - ((*((m2.as_pointer() as Ptr>) - .offset((i as usize)) - .as_pointer() as Ptr>) + ((*(m2.as_pointer().decay().offset((i as usize)).as_pointer() as Ptr>) .upgrade() .deref()) .len() @@ -181,20 +177,10 @@ fn main_0() -> i32 { let mut j: i32 = 0; 'loop_: while (j < 10) { assert!( - ((index!( - elem!((m1.as_pointer() as Ptr>), (i as usize)), - (j as usize) - ) - .read()) - == 0) + ((index!(elem!(m1.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 0) ); assert!( - ((index!( - elem!((m2.as_pointer() as Ptr>), (i as usize)), - (j as usize) - ) - .read()) - == 0) + ((index!(elem!(m2.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 0) ); j.prefix_inc(); } @@ -204,11 +190,8 @@ fn main_0() -> i32 { 'loop_: while (i < N) { let mut j: i32 = 0; 'loop_: while (j < 10) { - index!( - elem!((m2.as_pointer() as Ptr>), (i as usize)), - (j as usize) - ) - .with_mut(|__v| __v.postfix_inc()); + index!(elem!(m2.as_pointer().decay(), (i as usize)), (j as usize)) + .with_mut(|__v| __v.postfix_inc()); j.prefix_inc(); } i.prefix_inc(); @@ -216,18 +199,14 @@ fn main_0() -> i32 { let mut i: i32 = 0; 'loop_: while (i < N) { assert!( - ((*((m1.as_pointer() as Ptr>) - .offset((i as usize)) - .as_pointer() as Ptr>) + ((*(m1.as_pointer().decay().offset((i as usize)).as_pointer() as Ptr>) .upgrade() .deref()) .len() == 10_usize) ); assert!( - ((*((m2.as_pointer() as Ptr>) - .offset((i as usize)) - .as_pointer() as Ptr>) + ((*(m2.as_pointer().decay().offset((i as usize)).as_pointer() as Ptr>) .upgrade() .deref()) .len() @@ -236,20 +215,10 @@ fn main_0() -> i32 { let mut j: i32 = 0; 'loop_: while (j < 10) { assert!( - ((index!( - elem!((m1.as_pointer() as Ptr>), (i as usize)), - (j as usize) - ) - .read()) - == 0) + ((index!(elem!(m1.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 0) ); assert!( - ((index!( - elem!((m2.as_pointer() as Ptr>), (i as usize)), - (j as usize) - ) - .read()) - == 1) + ((index!(elem!(m2.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 1) ); j.prefix_inc(); } @@ -259,7 +228,7 @@ fn main_0() -> i32 { let mut i: i32 = 0; 'loop_: while (i < N) { let __rhs = i; - (map1.as_pointer() as Ptr, Value)>>) + map1.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(i.clone(), || { ( @@ -279,7 +248,8 @@ fn main_0() -> i32 { let mut i: i32 = 0; 'loop_: while (i < N) { assert!( - (((map2.as_pointer() as Ptr, Value)>>) + ((map2 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(i.clone(), || { ( @@ -294,7 +264,7 @@ fn main_0() -> i32 { .read()) == i) ); - (map2.as_pointer() as Ptr, Value)>>) + map2.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(i.clone(), || { ( @@ -312,7 +282,8 @@ fn main_0() -> i32 { let mut i: i32 = 0; 'loop_: while (i < N) { assert!( - (((map1.as_pointer() as Ptr, Value)>>) + ((map1 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(i.clone(), || { ( @@ -328,7 +299,8 @@ fn main_0() -> i32 { == i) ); assert!( - (((map2.as_pointer() as Ptr, Value)>>) + ((map2 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(i.clone(), || { ( @@ -404,7 +376,7 @@ fn main_0() -> i32 { assert!((b1.w == 1)); assert!((b2.w == 2)); let v4: Value> = Rc::new(RefCell::new(Vec::new())); - (v4.as_pointer() as Ptr>).write((v2).clone()); + v4.as_pointer().write((v2).clone()); let mut i: i32 = 0; 'loop_: while (i < N) { assert!(({ (*v4.borrow())[(i as usize)] } == (i + 1))); diff --git a/tests/unit/out/refcount/compound_assign_ref.rs b/tests/unit/out/refcount/compound_assign_ref.rs index 64b65eafb..c00bc8aba 100644 --- a/tests/unit/out/refcount/compound_assign_ref.rs +++ b/tests/unit/out/refcount/compound_assign_ref.rs @@ -17,11 +17,9 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; { - (v.as_pointer() as Ptr>) - .decay() - .with_mut(|__v| *__v = *__v + 5) + v.as_pointer().decay().with_mut(|__v| *__v = *__v + 5) }; - assert!((((v.as_pointer() as Ptr>).decay().read()) == 15)); + assert!(((v.as_pointer().decay().read()) == 15)); return 0; } pub fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/refcount/copy_move_defaulted.rs b/tests/unit/out/refcount/copy_move_defaulted.rs index 087a0e844..6bdaff3dc 100644 --- a/tests/unit/out/refcount/copy_move_defaulted.rs +++ b/tests/unit/out/refcount/copy_move_defaulted.rs @@ -340,7 +340,9 @@ fn main_0() -> i32 { ); assert!( (((*r.borrow()).rows.len() == 1_usize) - && ((*((field_ref!(r.as_pointer(), rows).as_pointer() as Ptr>) + && ((*(field_ref!(r.as_pointer(), rows) + .as_pointer() + .decay() .offset(0_usize) .as_pointer() as Ptr>) .upgrade() @@ -355,7 +357,7 @@ fn main_0() -> i32 { (*bufs.borrow_mut()).push(__a1) }; { - let __init = Buffer::move_from({ (bufs.as_pointer() as Ptr).offset(0_usize) }); + let __init = Buffer::move_from({ bufs.as_pointer().decay().offset(0_usize) }); (*bufs.borrow_mut()).push(__init) }; assert!( @@ -373,7 +375,7 @@ fn main_0() -> i32 { array_elem!(o1.as_pointer(), arr, 1).write(6); { let _p: Ptr<_> = Ptr::alloc(7); - (field_ptr!(o1.as_pointer(), p) as Ptr>>).write(_p.to_owned_opt()) + field_ptr!(o1.as_pointer(), p).write(_p.to_owned_opt()) }; let o2: Value = Rc::new(RefCell::new(Owner::move_from({ o1.as_pointer() }))); assert!( @@ -399,7 +401,7 @@ fn main_0() -> i32 { let _dtor_h1 = ScopedDestructor::new(&h1, |__p| __p.destructor()); { let _p: Ptr<_> = Ptr::alloc(9); - (field_ptr!(h1.as_pointer(), p) as Ptr>>).write(_p.to_owned_opt()) + field_ptr!(h1.as_pointer(), p).write(_p.to_owned_opt()) }; let h2: Value = Rc::new(RefCell::new(Holder::move_from({ h1.as_pointer() }))); let _dtor_h2 = ScopedDestructor::new(&h2, |__p| __p.destructor()); @@ -424,9 +426,11 @@ pub trait BufferImpl { } impl BufferImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ref!((*self), data).as_pointer() as Ptr>) + field_ref!((*self), data) + .as_pointer() .write(field!(_a0, data).with_mut(std::mem::take)); - (field_ref!((*self), rows).as_pointer() as Ptr>>) + field_ref!((*self), rows) + .as_pointer() .write(field!(_a0, rows).with_mut(std::mem::take)); field!((*self), n).write({ { (*_a0.upgrade().deref()).n } }); { @@ -465,7 +469,7 @@ impl HolderImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { field!((*self), inner).write({ { (*_a0.upgrade().deref()).inner.clone() } }); field!((*self), e).write({ { (*_a0.upgrade().deref()).e.clone() } }); - (field_ptr!((*self), p) as Ptr>>) + field_ptr!((*self), p) .write(field!(_a0, p).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } @@ -478,7 +482,8 @@ pub trait OwnerImpl { } impl OwnerImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ref!((*self), data).as_pointer() as Ptr>) + field_ref!((*self), data) + .as_pointer() .write(field!(_a0, data).with_mut(std::mem::take)); field!((*self), n).write({ { (*_a0.upgrade().deref()).n } }); { @@ -490,7 +495,7 @@ impl OwnerImpl for Ptr { ); ((array_field_ptr!((*self), arr)) as Ptr).to_any() }; - (field_ptr!((*self), p) as Ptr>>) + field_ptr!((*self), p) .write(field!(_a0, p).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs b/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs index 7cc0ae161..f456817fe 100644 --- a/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs +++ b/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs @@ -21,73 +21,53 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; let it: Value> = Rc::new(RefCell::new({ - let mut __it = (v.as_pointer() as Ptr>).decay().begin(); - while __it != (v.as_pointer() as Ptr>).decay().end() - && __it.iter_deref().with(|__v| *__v != 7) - { + let mut __it = v.as_pointer().decay().begin(); + while __it != v.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != 7) { __it.iter_inc(); } __it })); - assert!((*it.borrow()) != (v.as_pointer() as Ptr>).decay().end()); + assert!((*it.borrow()) != v.as_pointer().decay().end()); assert!((((*it.borrow()).iter_deref().read()) == 7)); { - let __n = (v.as_pointer() as Ptr>) + let __n = v + .as_pointer() .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr>).decay().begin()); + .iter_distance(&v.as_pointer().decay().begin()); let __random = std::hash::RandomState::new(); for __i in (1..__n).rev() { let __j = (std::hash::BuildHasher::hash_one(&__random, __i) % (__i + 1) as u64) as isize; - let __x = (v.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__i); - let __y = (v.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__j); + let __x = v.as_pointer().decay().begin().iter_at(__i); + let __y = v.as_pointer().decay().begin().iter_at(__j); let __tmp = __x.read(); __x.write(__y.read()); __y.write(__tmp); } }; { - let __n = (v.as_pointer() as Ptr>) + let __n = v + .as_pointer() .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr>).decay().begin()); + .iter_distance(&v.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (v.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__x) - .with(|__a| { - (v.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) - }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| { - (v.as_pointer() as Ptr>) + v.as_pointer().decay().begin().iter_at(__x).with(|__a| { + v.as_pointer() .decay() .begin() - .iter_at(__i) - .read() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) }) + }); + let __values: Vec<_> = __order + .iter() + .map(|&__i| v.as_pointer().decay().begin().iter_at(__i).read()) .collect(); for (__i, __v) in (0..__n).zip(__values) { - (v.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__i) - .write(__v); + v.as_pointer().decay().begin().iter_at(__i).write(__v); } }; assert!(({ (*v.borrow())[0_usize] } == 4) && ({ (*v.borrow())[1_usize] } == 7)); diff --git a/tests/unit/out/refcount/find.rs b/tests/unit/out/refcount/find.rs index 7b8a919dd..1a9f868e3 100644 --- a/tests/unit/out/refcount/find.rs +++ b/tests/unit/out/refcount/find.rs @@ -24,12 +24,10 @@ fn main_0() -> i32 { let __a1 = 3; (*v.borrow_mut()).push(__a1) }; - let v_begin: Value> = Rc::new(RefCell::new( - (v.as_pointer() as Ptr>).decay().begin(), - )); - let v_end: Value> = Rc::new(RefCell::new( - (v.as_pointer() as Ptr>).decay().end(), - )); + let v_begin: Value> = + Rc::new(RefCell::new(v.as_pointer().decay().begin())); + let v_end: Value> = + Rc::new(RefCell::new(v.as_pointer().decay().end())); let it: Value> = Rc::new(RefCell::new({ let mut __it = (*v_begin.borrow()).clone(); while __it != (*v_end.borrow()).clone() && __it.iter_deref().with(|__v| *__v != 2) { @@ -37,9 +35,9 @@ fn main_0() -> i32 { } __it })); - let mut v_result_true: bool = (*it.borrow()) != (v.as_pointer() as Ptr>).decay().end(); + let mut v_result_true: bool = (*it.borrow()) != v.as_pointer().decay().end(); let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -52,7 +50,7 @@ fn main_0() -> i32 { .as_pointer() }) .write(1_f64); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -65,7 +63,7 @@ fn main_0() -> i32 { .as_pointer() }) .write(2_f64); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(3.clone(), || { ( @@ -79,78 +77,55 @@ fn main_0() -> i32 { }) .write(3_f64); let m_begin: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), )); let m_end: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), )); let mut m_result_true: bool = (*m_begin.borrow()) != (*m_end.borrow()); assert!( ((v_result_true) && (m_result_true)) && ({ - let mut __it = (v.as_pointer() as Ptr>).decay().begin(); - while __it != (v.as_pointer() as Ptr>).decay().begin() + let mut __it = v.as_pointer().decay().begin(); + while __it != v.as_pointer().decay().begin() && __it.iter_deref().with(|__v| *__v != 2) { __it.iter_inc(); } __it - } == (v.as_pointer() as Ptr>).decay().begin()) + } == v.as_pointer().decay().begin()) ); let w: Value> = Rc::new(RefCell::new(Vec::from([1, 2, 3, 4, 5]))); assert!( { - let mut __it = (w.as_pointer() as Ptr>) - .decay() - .begin() - .iter_add(2_isize); - while __it != (w.as_pointer() as Ptr>).decay().end() - && __it.iter_deref().with(|__v| *__v != 4) - { + let mut __it = w.as_pointer().decay().begin().iter_add(2_isize); + while __it != w.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != 4) { __it.iter_inc(); } __it - } == (w.as_pointer() as Ptr>) - .decay() - .begin() - .iter_add(3_isize) + } == w.as_pointer().decay().begin().iter_add(3_isize) ); assert!( { - let mut __it = (w.as_pointer() as Ptr>) - .decay() - .begin() - .iter_add(2_isize); - while __it != (w.as_pointer() as Ptr>).decay().end() - && __it.iter_deref().with(|__v| *__v != 1) - { + let mut __it = w.as_pointer().decay().begin().iter_add(2_isize); + while __it != w.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != 1) { __it.iter_inc(); } __it - } == (w.as_pointer() as Ptr>).decay().end() + } == w.as_pointer().decay().end() ); assert!( { - let mut __it = (w.as_pointer() as Ptr>) - .decay() - .begin() - .iter_add(2_isize); - while __it - != (w.as_pointer() as Ptr>) - .decay() - .begin() - .iter_add(4_isize) + let mut __it = w.as_pointer().decay().begin().iter_add(2_isize); + while __it != w.as_pointer().decay().begin().iter_add(4_isize) && __it.iter_deref().with(|__v| *__v != 5) { __it.iter_inc(); } __it - } == (w.as_pointer() as Ptr>) - .decay() - .begin() - .iter_add(4_isize) + } == w.as_pointer().decay().begin().iter_add(4_isize) ); return 0; } diff --git a/tests/unit/out/refcount/fn_ptr_stable_sort.rs b/tests/unit/out/refcount/fn_ptr_stable_sort.rs index 884936df6..c03cdeeb6 100644 --- a/tests/unit/out/refcount/fn_ptr_stable_sort.rs +++ b/tests/unit/out/refcount/fn_ptr_stable_sort.rs @@ -36,20 +36,15 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; { - let __n = (v.as_pointer() as Ptr>) + let __n = v + .as_pointer() .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr>).decay().begin()); + .iter_distance(&v.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - let __a = (v.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__x); - let __b = (v.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__y); + let __a = v.as_pointer().decay().begin().iter_at(__x); + let __b = v.as_pointer().decay().begin().iter_at(__y); if Compare_0.call(__a.clone(), __b.clone()) { std::cmp::Ordering::Less } else if Compare_0.call(__b, __a) { @@ -60,20 +55,10 @@ fn main_0() -> i32 { }); let __values: Vec<_> = __order .iter() - .map(|&__i| { - (v.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__i) - .read() - }) + .map(|&__i| v.as_pointer().decay().begin().iter_at(__i).read()) .collect(); for (__i, __v) in (0..__n).zip(__values) { - (v.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__i) - .write(__v); + v.as_pointer().decay().begin().iter_at(__i).write(__v); } }; assert!(({ (*v.borrow())[0_usize].key } == 1)); diff --git a/tests/unit/out/refcount/foreach.rs b/tests/unit/out/refcount/foreach.rs index c215d9509..77a834b88 100644 --- a/tests/unit/out/refcount/foreach.rs +++ b/tests/unit/out/refcount/foreach.rs @@ -21,10 +21,7 @@ fn main_0() -> i32 { i.prefix_inc(); } let mut sum: i32 = 0; - 'loop_: for x in IterRange::new( - (v.as_pointer() as Ptr>).decay().begin(), - (v.as_pointer() as Ptr>).decay().end(), - ) { + 'loop_: for x in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) { let mut x: i32 = (x.iter_deref().read()); sum += x; } diff --git a/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs b/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs index 2b9a2b930..5df20e2b1 100644 --- a/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs +++ b/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs @@ -26,12 +26,8 @@ fn main_0() -> i32 { (*s.borrow_mut()).v.push(__a1) }; 'loop_: for e in IterRange::new( - (field_ref!(s.as_pointer(), v).as_pointer() as Ptr>) - .decay() - .begin(), - (field_ref!(s.as_pointer(), v).as_pointer() as Ptr>) - .decay() - .end(), + field_ref!(s.as_pointer(), v).as_pointer().decay().begin(), + field_ref!(s.as_pointer(), v).as_pointer().decay().end(), ) { let mut e: i32 = (e.iter_deref().read()); (*s.borrow_mut()).a.postfix_inc(); diff --git a/tests/unit/out/refcount/foreach_double.rs b/tests/unit/out/refcount/foreach_double.rs index ca45c74b8..a98d9eae3 100644 --- a/tests/unit/out/refcount/foreach_double.rs +++ b/tests/unit/out/refcount/foreach_double.rs @@ -25,54 +25,38 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; let mut square: i32 = 0; - 'loop_: for e1 in IterRange::new( - (v.as_pointer() as Ptr>).decay().begin(), - (v.as_pointer() as Ptr>).decay().end(), - ) { + 'loop_: for e1 in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) { let mut e1: i32 = (e1.iter_deref().read()); - 'loop_: for e2 in IterRange::new( - (v.as_pointer() as Ptr>).decay().begin(), - (v.as_pointer() as Ptr>).decay().end(), - ) { + 'loop_: for e2 in + IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) + { let mut e2: i32 = (e2.iter_deref().read()); square += (e1 * e2); } } - 'loop_: for e1 in IterRange::new( - (v.as_pointer() as Ptr>).decay().begin(), - (v.as_pointer() as Ptr>).decay().end(), - ) { + 'loop_: for e1 in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) { let e1: Ptr = e1.iter_deref(); - 'loop_: for e2 in IterRange::new( - (v.as_pointer() as Ptr>).decay().begin(), - (v.as_pointer() as Ptr>).decay().end(), - ) { + 'loop_: for e2 in + IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) + { let e2: Ptr = e2.iter_deref(); square += { ({ (e1.read()) } * { (e2.read()) }) }; } } - 'loop_: for e1 in IterRange::new( - (v.as_pointer() as Ptr>).decay().begin(), - (v.as_pointer() as Ptr>).decay().end(), - ) { + 'loop_: for e1 in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) { let e1: Ptr = e1.iter_deref(); - 'loop_: for e2 in IterRange::new( - (v.as_pointer() as Ptr>).decay().begin(), - (v.as_pointer() as Ptr>).decay().end(), - ) { + 'loop_: for e2 in + IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) + { let e2: Ptr = e2.iter_deref(); square += { ({ (e1.read()) } * { (e2.read()) }) }; } } - 'loop_: for e1 in IterRange::new( - (v.as_pointer() as Ptr>).decay().begin(), - (v.as_pointer() as Ptr>).decay().end(), - ) { + 'loop_: for e1 in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) { let e1: Ptr = e1.iter_deref(); - 'loop_: for e2 in IterRange::new( - (v.as_pointer() as Ptr>).decay().begin(), - (v.as_pointer() as Ptr>).decay().end(), - ) { + 'loop_: for e2 in + IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) + { let e2: Ptr = e2.iter_deref(); square += { ({ (e1.read()) } * { (e2.read()) }) }; } @@ -93,15 +77,12 @@ fn main_0() -> i32 { let __a1 = std::mem::take(&mut (*v3.borrow_mut())); (*m.borrow_mut()).push(__a1) }; - 'loop_: for row in IterRange::new( - (m.as_pointer() as Ptr>>).decay().begin(), - (m.as_pointer() as Ptr>>).decay().end(), - ) { + 'loop_: for row in IterRange::new(m.as_pointer().decay().begin(), m.as_pointer().decay().end()) + { let row: Ptr> = row.iter_deref(); - 'loop_: for col in IterRange::new( - ((row).clone() as Ptr>).decay().begin(), - ((row).clone() as Ptr>).decay().end(), - ) { + 'loop_: for col in + IterRange::new((row).clone().decay().begin(), (row).clone().decay().end()) + { let col: Ptr = col.iter_deref(); square += { (col.read()) }; } diff --git a/tests/unit/out/refcount/foreach_map.rs b/tests/unit/out/refcount/foreach_map.rs index f5a23ac6c..a32f88b97 100644 --- a/tests/unit/out/refcount/foreach_map.rs +++ b/tests/unit/out/refcount/foreach_map.rs @@ -15,7 +15,7 @@ fn main_0() -> i32 { let mut i: i32 = 0; let mut k: i32 = 100; 'loop_: while (i < 100) { - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(i.clone(), || { ( @@ -35,18 +35,18 @@ fn main_0() -> i32 { } let mut sum: f64 = 0_f64; 'loop_: for i in IterRange::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let i: Ptr<(Value, Value)> = i.iter_deref(); sum += (*(*i.upgrade().deref()).1.borrow()); } 'loop_: for i in IterRange::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let i: Value<(Value, Value)> = Rc::new(RefCell::new(( @@ -61,9 +61,9 @@ fn main_0() -> i32 { } assert!((sum == 7475_f64)); 'loop_: for i in IterRange::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let i: Value<(Value, Value)> = Rc::new(RefCell::new(( @@ -78,9 +78,9 @@ fn main_0() -> i32 { assert!(((*(*i.borrow()).1.borrow()) == (-1_i32 as f64))); } 'loop_: for i in IterRange::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let i: Ptr<(Value, Value)> = i.iter_deref(); diff --git a/tests/unit/out/refcount/foreach_mut.rs b/tests/unit/out/refcount/foreach_mut.rs index fe4209aab..bc30288a0 100644 --- a/tests/unit/out/refcount/foreach_mut.rs +++ b/tests/unit/out/refcount/foreach_mut.rs @@ -26,22 +26,22 @@ fn main_0() -> i32 { }; let mut sum: i32 = 0; 'loop_: for x in IterRange::new( - (v1.as_pointer() as Ptr>).decay().begin(), - (v1.as_pointer() as Ptr>).decay().end(), + v1.as_pointer().decay().begin(), + v1.as_pointer().decay().end(), ) { let mut x: i32 = (x.iter_deref().read()); sum += x.prefix_inc(); } 'loop_: for x in IterRange::new( - (v1.as_pointer() as Ptr>).decay().begin(), - (v1.as_pointer() as Ptr>).decay().end(), + v1.as_pointer().decay().begin(), + v1.as_pointer().decay().end(), ) { let mut x: i32 = (x.iter_deref().read()); sum += x; } 'loop_: for x in IterRange::new( - (v1.as_pointer() as Ptr>).decay().begin(), - (v1.as_pointer() as Ptr>).decay().end(), + v1.as_pointer().decay().begin(), + v1.as_pointer().decay().end(), ) { let x: Ptr = x.iter_deref(); { @@ -49,28 +49,28 @@ fn main_0() -> i32 { }; } 'loop_: for x in IterRange::new( - (v1.as_pointer() as Ptr>).decay().begin(), - (v1.as_pointer() as Ptr>).decay().end(), + v1.as_pointer().decay().begin(), + v1.as_pointer().decay().end(), ) { let x: Ptr = x.iter_deref(); sum += { (x.read()) }; } let v2: Value>> = Rc::new(RefCell::new(Vec::new())); { - let __a1 = ((v1.as_pointer() as Ptr).offset(0_usize)); + let __a1 = (v1.as_pointer().decay().offset(0_usize)); (*v2.borrow_mut()).push(__a1) }; { - let __a1 = ((v1.as_pointer() as Ptr).offset(1_usize)); + let __a1 = (v1.as_pointer().decay().offset(1_usize)); (*v2.borrow_mut()).push(__a1) }; { - let __a1 = ((v1.as_pointer() as Ptr).offset(2_usize)); + let __a1 = (v1.as_pointer().decay().offset(2_usize)); (*v2.borrow_mut()).push(__a1) }; 'loop_: for p in IterRange::new( - (v2.as_pointer() as Ptr>>).decay().begin(), - (v2.as_pointer() as Ptr>>).decay().end(), + v2.as_pointer().decay().begin(), + v2.as_pointer().decay().end(), ) { let mut p: Ptr = (p.iter_deref().read()); { @@ -78,15 +78,15 @@ fn main_0() -> i32 { }; } 'loop_: for p in IterRange::new( - (v2.as_pointer() as Ptr>>).decay().begin(), - (v2.as_pointer() as Ptr>>).decay().end(), + v2.as_pointer().decay().begin(), + v2.as_pointer().decay().end(), ) { let mut p: Ptr = (p.iter_deref().read()); sum += { (p.read()) }; } 'loop_: for p in IterRange::new( - (v2.as_pointer() as Ptr>>).decay().begin(), - (v2.as_pointer() as Ptr>>).decay().end(), + v2.as_pointer().decay().begin(), + v2.as_pointer().decay().end(), ) { let mut p: Ptr = (p.iter_deref().read()); { @@ -94,8 +94,8 @@ fn main_0() -> i32 { }; } 'loop_: for p in IterRange::new( - (v2.as_pointer() as Ptr>>).decay().begin(), - (v2.as_pointer() as Ptr>>).decay().end(), + v2.as_pointer().decay().begin(), + v2.as_pointer().decay().end(), ) { let mut p: Ptr = (p.iter_deref().read()); sum += { (p.read()) }; diff --git a/tests/unit/out/refcount/huffman.rs b/tests/unit/out/refcount/huffman.rs index 92ba55003..8ba642d07 100644 --- a/tests/unit/out/refcount/huffman.rs +++ b/tests/unit/out/refcount/huffman.rs @@ -439,12 +439,12 @@ impl MinHeapImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { field!((*self), size).write({ { (*_a0.upgrade().deref()).size } }); field!((*self), capacity).write({ { (*_a0.upgrade().deref()).capacity } }); - (field_ptr!((*self), arr) as Ptr]>>>>).write( + field_ptr!((*self), arr).write( field!(_a0, arr) .with_mut(|__v: &mut Option]>>>| __v.take()), ); field!((*self), next).write({ { (*_a0.upgrade().deref()).next } }); - (field_ptr!((*self), alloc) as Ptr>>>).write( + field_ptr!((*self), alloc).write( field!(_a0, alloc).with_mut(|__v: &mut Option>>| __v.take()), ); return (*self).clone(); diff --git a/tests/unit/out/refcount/implicit_autoref.rs b/tests/unit/out/refcount/implicit_autoref.rs index 22b3a4a95..6865f2549 100644 --- a/tests/unit/out/refcount/implicit_autoref.rs +++ b/tests/unit/out/refcount/implicit_autoref.rs @@ -49,13 +49,7 @@ fn main_0() -> i32 { assert!(((index!(p, 1_usize).read()) == 30)); assert!((b == 40)); assert!(((vec_elem!((hp), v, 1_usize).read()) == 60)); - ({ - write_through_0( - (((p).clone() as Ptr>) - .decay() - .offset(0_usize as isize)), - ) - }); + ({ write_through_0(((p).clone().decay().offset(0_usize as isize))) }); assert!(((index!(p, 0_usize).read()) == 42)); return 0; } diff --git a/tests/unit/out/refcount/inet_pton_ntop.rs b/tests/unit/out/refcount/inet_pton_ntop.rs index b8ca2ddcb..f62541cec 100644 --- a/tests/unit/out/refcount/inet_pton_ntop.rs +++ b/tests/unit/out/refcount/inet_pton_ntop.rs @@ -14,16 +14,16 @@ pub fn test_s6_addr_access_0() { let addr: Value = Rc::new(RefCell::new(Default::default())); let mut ap: Ptr = (addr.as_pointer()); { - ((In6Addr::s6_addr((addr.as_pointer() as Ptr)) as Ptr) as Ptr) + ((In6Addr::s6_addr(addr.as_pointer()) as Ptr) as Ptr) .to_any() .memcpy( &((loopback.as_pointer() as Ptr) as Ptr).to_any(), 16_usize as usize, ); - ((In6Addr::s6_addr((addr.as_pointer() as Ptr)) as Ptr) as Ptr).to_any() + ((In6Addr::s6_addr(addr.as_pointer()) as Ptr) as Ptr).to_any() }; assert!( - (((((In6Addr::s6_addr(((ap).clone() as Ptr)) as Ptr::) as Ptr) + (((((In6Addr::s6_addr((ap).clone()) as Ptr::) as Ptr) .to_any() .memcmp( &((loopback.as_pointer() as Ptr::) as Ptr).to_any(), @@ -32,93 +32,50 @@ pub fn test_s6_addr_access_0() { == 0) as i32) != 0) ); - elem!( - (In6Addr::s6_addr((addr.as_pointer() as Ptr)) as Ptr::), - 0 - ) - .write(32_u8); - elem!( - (In6Addr::s6_addr(((ap).clone() as Ptr)) as Ptr::), - 1 - ) - .write(1_u8); + elem!((In6Addr::s6_addr(addr.as_pointer()) as Ptr::), 0).write(32_u8); + elem!((In6Addr::s6_addr((ap).clone()) as Ptr::), 1).write(1_u8); assert!( - ((((((((elem!( - (In6Addr::s6_addr((addr.as_pointer() as Ptr)) as Ptr::), - 0 - ) - .read()) as i32) - == 32) as i32) + ((((((((elem!((In6Addr::s6_addr(addr.as_pointer()) as Ptr::), 0).read()) as i32) == 32) + as i32) != 0) - && (((((elem!( - (In6Addr::s6_addr(((ap).clone() as Ptr)) as Ptr::), - 1 - ) - .read()) as i32) - == 1) as i32) + && (((((elem!((In6Addr::s6_addr((ap).clone()) as Ptr::), 1).read()) as i32) == 1) + as i32) != 0)) as i32) != 0) ); - elem!( - (In6Addr::s6_addr((addr.as_pointer() as Ptr)) as Ptr::), - 15 - ) - .write({ - (((elem!( - (In6Addr::s6_addr((addr.as_pointer() as Ptr)) as Ptr::), - 15 - ) - .read()) as i32) - + 4) as u8 + elem!((In6Addr::s6_addr(addr.as_pointer()) as Ptr::), 15).write({ + (((elem!((In6Addr::s6_addr(addr.as_pointer()) as Ptr::), 15).read()) as i32) + 4) as u8 }); - elem!( - (In6Addr::s6_addr(((ap).clone() as Ptr)) as Ptr::), - 15 - ) - .with_mut(|__v| __v.postfix_inc()); + elem!((In6Addr::s6_addr((ap).clone()) as Ptr::), 15).with_mut(|__v| __v.postfix_inc()); assert!( - (((((elem!( - (In6Addr::s6_addr((addr.as_pointer() as Ptr)) as Ptr::), - 15 - ) - .read()) as i32) - == 6) as i32) + (((((elem!((In6Addr::s6_addr(addr.as_pointer()) as Ptr::), 15).read()) as i32) == 6) + as i32) != 0) ); - let mut bytes: Ptr = (In6Addr::s6_addr((addr.as_pointer() as Ptr)) as Ptr); + let mut bytes: Ptr = (In6Addr::s6_addr(addr.as_pointer()) as Ptr); elem!(bytes, 2).write(7_u8); assert!( - (((((elem!( - (In6Addr::s6_addr(((ap).clone() as Ptr)) as Ptr::), - 2 - ) - .read()) as i32) - == 7) as i32) + (((((elem!((In6Addr::s6_addr((ap).clone()) as Ptr::), 2).read()) as i32) == 7) as i32) != 0) ); - let mut fourth: Ptr = - ((In6Addr::s6_addr(((ap).clone() as Ptr)) as Ptr).offset((3) as isize)); + let mut fourth: Ptr = ((In6Addr::s6_addr((ap).clone()) as Ptr).offset((3) as isize)); fourth.write(8_u8); assert!( - (((((elem!( - (In6Addr::s6_addr((addr.as_pointer() as Ptr)) as Ptr::), - 3 - ) - .read()) as i32) - == 8) as i32) + (((((elem!((In6Addr::s6_addr(addr.as_pointer()) as Ptr::), 3).read()) as i32) == 8) + as i32) != 0) ); { - ((In6Addr::s6_addr(((ap).clone() as Ptr)) as Ptr) as Ptr) + ((In6Addr::s6_addr((ap).clone()) as Ptr) as Ptr) .to_any() .memcpy( &((loopback.as_pointer() as Ptr) as Ptr).to_any(), 16_usize as usize, ); - ((In6Addr::s6_addr(((ap).clone() as Ptr)) as Ptr) as Ptr).to_any() + ((In6Addr::s6_addr((ap).clone()) as Ptr) as Ptr).to_any() }; assert!( - (((((In6Addr::s6_addr((addr.as_pointer() as Ptr)) as Ptr::) as Ptr) + (((((In6Addr::s6_addr(addr.as_pointer()) as Ptr::) as Ptr) .to_any() .memcmp( &((loopback.as_pointer() as Ptr::) as Ptr).to_any(), diff --git a/tests/unit/out/refcount/inline_container_fields.rs b/tests/unit/out/refcount/inline_container_fields.rs index b94ff34a9..2d589974b 100644 --- a/tests/unit/out/refcount/inline_container_fields.rs +++ b/tests/unit/out/refcount/inline_container_fields.rs @@ -123,12 +123,17 @@ fn main_0() -> i32 { }) == 12) ); assert!(((vec_elem!(s.as_pointer(), arr, 1_usize).read()) == 7)); - let mut e: Ptr = - ((field_ref!(s.as_pointer(), elems).as_pointer() as Ptr).offset(2_usize)); + let mut e: Ptr = (field_ref!(s.as_pointer(), elems) + .as_pointer() + .decay() + .offset(2_usize)); let mut h: Ptr = (array_field_ptr!(e, hist) as Ptr); - let mut c: Ptr = ((field_ref!(e, coeffs).as_pointer() as Ptr).offset(1_usize)); + let mut c: Ptr = (field_ref!(e, coeffs).as_pointer().decay().offset(1_usize)); let mut id: Ptr = (field_ptr!( - (field_ref!(s.as_pointer(), elems).as_pointer() as Ptr).offset(1_usize), + field_ref!(s.as_pointer(), elems) + .as_pointer() + .decay() + .offset(1_usize), id )); let mut k: i32 = 0; @@ -146,7 +151,10 @@ fn main_0() -> i32 { (({ sum_0( (array_field_ptr!( - (field_ref!(s.as_pointer(), elems).as_pointer() as Ptr).offset(2_usize), + field_ref!(s.as_pointer(), elems) + .as_pointer() + .decay() + .offset(2_usize), hist ) as Ptr), 4, @@ -163,15 +171,20 @@ fn main_0() -> i32 { (vec_elem!(s.as_pointer(), elems, 1_usize).with(|__s| __s.id) == 11) && ({ h.offset((3) as isize) } == { ((array_field_ptr!( - (field_ref!(s.as_pointer(), elems).as_pointer() as Ptr).offset(2_usize), + field_ref!(s.as_pointer(), elems) + .as_pointer() + .decay() + .offset(2_usize), hist ) as Ptr) .offset((3) as isize)) }) ); - let mut row: Ptr = (((field_ref!(s.as_pointer(), rows).as_pointer() as Ptr>) + let mut row: Ptr = (field_ref!(s.as_pointer(), rows) + .as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr) + .as_pointer() .offset(0_usize)); elem!(row, 2).write(9); assert!(((index!(vec_elem!(s.as_pointer(), rows, 0_usize), 2_usize).read()) == 9)); diff --git a/tests/unit/out/refcount/iterator_freshness.rs b/tests/unit/out/refcount/iterator_freshness.rs index f0c0544f0..3c09ad6da 100644 --- a/tests/unit/out/refcount/iterator_freshness.rs +++ b/tests/unit/out/refcount/iterator_freshness.rs @@ -19,9 +19,8 @@ fn main_0() -> i32 { .map(|_| ::default()) .collect::>(), )); - let it: Value> = Rc::new(RefCell::new( - (vec_.as_pointer() as Ptr>).decay().begin(), - )); + let it: Value> = + Rc::new(RefCell::new(vec_.as_pointer().decay().begin())); ({ foo_0((*it.borrow()).clone()) }); return 0; } diff --git a/tests/unit/out/refcount/iterators.rs b/tests/unit/out/refcount/iterators.rs index 3a1622d17..206cb3afc 100644 --- a/tests/unit/out/refcount/iterators.rs +++ b/tests/unit/out/refcount/iterators.rs @@ -17,22 +17,22 @@ fn main_0() -> i32 { __bytes })); 'loop_: for c in IterRange::new( - RandomAccessIterator::Vec((x.as_pointer() as Ptr>).decay()), - RandomAccessIterator::Vec((x.as_pointer() as Ptr>).decay().to_last()), + RandomAccessIterator::Vec(x.as_pointer().decay()), + RandomAccessIterator::Vec(x.as_pointer().decay().to_last()), ) { let c: Ptr = c.iter_deref(); c.with_mut(|__v| __v.prefix_inc()); } 'loop_: for c in IterRange::new( - RandomAccessIterator::Vec((x.as_pointer() as Ptr>).decay()), - RandomAccessIterator::Vec((x.as_pointer() as Ptr>).decay().to_last()), + RandomAccessIterator::Vec(x.as_pointer().decay()), + RandomAccessIterator::Vec(x.as_pointer().decay().to_last()), ) { let c: Ptr = c.iter_deref(); println!("{}", ((c.read()) as i32) as u8 as char); } 'loop_: for c in IterRange::new( - RandomAccessIterator::Vec((x.as_pointer() as Ptr>).decay()), - RandomAccessIterator::Vec((x.as_pointer() as Ptr>).decay().to_last()), + RandomAccessIterator::Vec(x.as_pointer().decay()), + RandomAccessIterator::Vec(x.as_pointer().decay().to_last()), ) { let mut c: i8 = (c.iter_deref().read()); println!("{}", (c as i32) as u8 as char); @@ -46,10 +46,7 @@ fn main_0() -> i32 { let __a1 = Ptr::alloc(3); (*v.borrow_mut()).push(__a1) }; - 'loop_: for p in IterRange::new( - (v.as_pointer() as Ptr>>).decay().begin(), - (v.as_pointer() as Ptr>>).decay().end(), - ) { + 'loop_: for p in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) { let mut p: Ptr = (p.iter_deref().read()); println!("{}", (p.read())); } diff --git a/tests/unit/out/refcount/kruskal.rs b/tests/unit/out/refcount/kruskal.rs index 1c5aebeaf..9c9339f6f 100644 --- a/tests/unit/out/refcount/kruskal.rs +++ b/tests/unit/out/refcount/kruskal.rs @@ -364,9 +364,9 @@ impl DisjointSetImpl for Ptr { } } fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), rank) as Ptr>>>) + field_ptr!((*self), rank) .write(field!(_a0, rank).with_mut(|__v: &mut Option>>| __v.take())); - (field_ptr!((*self), parent) as Ptr>>>) + field_ptr!((*self), parent) .write(field!(_a0, parent).with_mut(|__v: &mut Option>>| __v.take())); field!((*self), n).write({ { (*_a0.upgrade().deref()).n } }); return (*self).clone(); @@ -377,7 +377,7 @@ pub trait GraphImpl { } impl GraphImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), edges) as Ptr>>>) + field_ptr!((*self), edges) .write(field!(_a0, edges).with_mut(|__v: &mut Option>>| __v.take())); field!((*self), V).write({ { (*_a0.upgrade().deref()).V } }); field!((*self), E).write({ { (*_a0.upgrade().deref()).E } }); diff --git a/tests/unit/out/refcount/map-reallocation.rs b/tests/unit/out/refcount/map-reallocation.rs index 5f407c2bd..eb1468d1c 100644 --- a/tests/unit/out/refcount/map-reallocation.rs +++ b/tests/unit/out/refcount/map-reallocation.rs @@ -15,7 +15,7 @@ fn main_0() -> i32 { let mut sentinel: i32 = (N / 2); let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); let __rhs = sentinel; - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(sentinel.clone(), || { ( @@ -29,7 +29,7 @@ fn main_0() -> i32 { }) .write(__rhs); let it: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&sentinel)), )); let mut p: Ptr = ((*(*it.borrow()).iter_deref().upgrade().deref()) @@ -52,7 +52,7 @@ fn main_0() -> i32 { let mut i: i32 = 0; 'loop_: while (i < sentinel) { let __rhs = i; - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(i.clone(), || { ( @@ -70,7 +70,7 @@ fn main_0() -> i32 { let mut i: i32 = (sentinel + 1); 'loop_: while (i <= N) { let __rhs = i; - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(i.clone(), || { ( @@ -110,7 +110,7 @@ fn main_0() -> i32 { .1 .borrow_mut()) = 57005; assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(sentinel.clone(), || { ( @@ -129,9 +129,9 @@ fn main_0() -> i32 { assert!(((*m.borrow()).len() == (((N + 1) as u32) as usize))); let mut prev: i32 = -1_i32; 'loop_: for pair in IterRange::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let pair: Ptr<(Value, Value)> = pair.iter_deref(); diff --git a/tests/unit/out/refcount/map.rs b/tests/unit/out/refcount/map.rs index 490a32f41..fae8aff22 100644 --- a/tests/unit/out/refcount/map.rs +++ b/tests/unit/out/refcount/map.rs @@ -18,7 +18,7 @@ pub fn main() { } fn main_0() -> i32 { let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(0_i16.clone(), || { ( @@ -31,7 +31,7 @@ fn main_0() -> i32 { .as_pointer() }) .write(1_u32); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1_i16.clone(), || { ( @@ -44,7 +44,7 @@ fn main_0() -> i32 { .as_pointer() }) .write(2_u32); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2_i16.clone(), || { ( @@ -59,7 +59,7 @@ fn main_0() -> i32 { .write(3_u32); assert!(((*m.borrow()).len() == 3_usize)); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(0_i16.clone(), || { ( @@ -75,7 +75,7 @@ fn main_0() -> i32 { == 1_u32) ); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1_i16.clone(), || { ( @@ -91,7 +91,7 @@ fn main_0() -> i32 { == 2_u32) ); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2_i16.clone(), || { ( @@ -107,7 +107,7 @@ fn main_0() -> i32 { == 3_u32) ); let mut x: i32 = 4; - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1_i16.clone(), || { ( @@ -122,7 +122,7 @@ fn main_0() -> i32 { .write((x as u32)); assert!(((*m.borrow()).len() == 3_usize)); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(0_i16.clone(), || { ( @@ -138,7 +138,7 @@ fn main_0() -> i32 { == 1_u32) ); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1_i16.clone(), || { ( @@ -154,7 +154,7 @@ fn main_0() -> i32 { == 4_u32) ); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2_i16.clone(), || { ( @@ -171,7 +171,7 @@ fn main_0() -> i32 { ); ({ foo_0( - ((m.as_pointer() as Ptr, Value)>>) + (m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(0_i16.clone(), || { ( @@ -187,7 +187,7 @@ fn main_0() -> i32 { ) }); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(0_i16.clone(), || { ( @@ -204,8 +204,8 @@ fn main_0() -> i32 { ); ({ bar_1( - (m.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + m.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2_i16.clone(), || { ( Rc::new(RefCell::new(2_i16)), @@ -215,12 +215,11 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }, - ), + }), ) }); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2_i16.clone(), || { ( @@ -235,7 +234,8 @@ fn main_0() -> i32 { .read()) == 4_u32) ); - let __rhs = ((m.as_pointer() as Ptr, Value)>>) + let __rhs = (m + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(0_i16.clone(), || { ( @@ -249,7 +249,7 @@ fn main_0() -> i32 { }) .read()) .wrapping_add( - ((m.as_pointer() as Ptr, Value)>>) + (m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2_i16.clone(), || { ( @@ -263,7 +263,7 @@ fn main_0() -> i32 { }) .read()), ); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(0_i16.clone(), || { ( @@ -277,7 +277,7 @@ fn main_0() -> i32 { }) .write(__rhs); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(0_i16.clone(), || { ( @@ -293,16 +293,16 @@ fn main_0() -> i32 { == 5_u32) ); let end: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), )); let it: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&1_i16)), )); let const_it: Value, Value)>> = Rc::new(RefCell::new( , Value)>>::from( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&10_i16)), ), )); @@ -323,7 +323,7 @@ fn main_0() -> i32 { }; assert!((x2 == 0_u32)); let mut x3: u32 = if (*it.borrow()) - == (m.as_pointer() as Ptr, Value)>>) + == m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) { 0_u32 @@ -333,7 +333,7 @@ fn main_0() -> i32 { assert!((x3 == 4_u32)); let mut x4: u32 = if (*const_it.borrow()) == , Value)>>::from( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { 0_u32 @@ -343,7 +343,7 @@ fn main_0() -> i32 { .borrow()) }; assert!((x4 == 0_u32)); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(4_i16.clone(), || { ( @@ -357,7 +357,7 @@ fn main_0() -> i32 { }) .write(5_u32); let it4: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&4_i16)), )); let mut p: Ptr = ((*(*it4.borrow()).iter_deref().upgrade().deref()) @@ -365,7 +365,7 @@ fn main_0() -> i32 { .as_pointer()); let mut x5: u32 = (p.read()); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(4_i16.clone(), || { ( @@ -385,7 +385,7 @@ fn main_0() -> i32 { assert!((x5 == 5_u32)); p.with_mut(|__v| __v.prefix_inc()); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(4_i16.clone(), || { ( @@ -405,7 +405,7 @@ fn main_0() -> i32 { assert!((x5 == 5_u32)); let const_it4: Value, Value)>> = Rc::new(RefCell::new( , Value)>>::from( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&4_i16)), ), )); @@ -418,22 +418,23 @@ fn main_0() -> i32 { let r: Ptr, Value)>> = m.as_pointer(); assert!(((*r.upgrade().deref()).len() == 4_usize)); assert!( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&4_i16)) - != (m.as_pointer() as Ptr, Value)>>) + != m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) ); - ((r).clone() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| __m.erase(&(*it4.borrow()).clone()), - ); + (r).clone() + .with_mut(|__m: &mut Map, Value)>| { + __m.erase(&(*it4.borrow()).clone()) + }); assert!(((*r.upgrade().deref()).len() == 3_usize)); assert!( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&4_i16)) - == (m.as_pointer() as Ptr, Value)>>) + == m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) ); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(7_i16.clone(), || { ( @@ -446,7 +447,7 @@ fn main_0() -> i32 { .as_pointer() }) .write(7_u32); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(8_i16.clone(), || { ( @@ -459,7 +460,7 @@ fn main_0() -> i32 { .as_pointer() }) .write(8_u32); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(9_i16.clone(), || { ( @@ -474,46 +475,47 @@ fn main_0() -> i32 { .write(9_u32); assert!(((*r.upgrade().deref()).len() == 6_usize)); assert!( - ((m.as_pointer() as Ptr, Value)>>) + (m.as_pointer() .with_mut(|__m: &mut Map, Value)>| __m.erase_key(&10_i16)) == 0_usize) ); let mut key9: i32 = 9; assert!( - ((m.as_pointer() as Ptr, Value)>>) + (m.as_pointer() .with_mut(|__m: &mut Map, Value)>| __m.erase_key(&(key9 as i16))) == 1_usize) ); assert!(((*r.upgrade().deref()).len() == 5_usize)); let cit: Value, Value)>> = Rc::new(RefCell::new( , Value)>>::from( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&7_i16)), ), )); - let next: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>).with_mut( + let next: Value, Value)>> = + Rc::new(RefCell::new(m.as_pointer().with_mut( |__m: &mut Map, Value)>| __m.erase(&(*cit.borrow()).clone()), - ), - )); + ))); assert!( (*next.borrow()) - == (m.as_pointer() as Ptr, Value)>>) + == m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&8_i16)) ); - (*next.borrow_mut()) = (m.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| __m.erase(&(*next.borrow()).clone()), - ); + (*next.borrow_mut()) = + m.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { + __m.erase(&(*next.borrow()).clone()) + }); assert!( (*next.borrow()) - == (m.as_pointer() as Ptr, Value)>>) + == m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) ); assert!(((*r.upgrade().deref()).len() == 3_usize)); assert!( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&8_i16)) - == (m.as_pointer() as Ptr, Value)>>) + == m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) ); let other_map: Value< @@ -525,8 +527,8 @@ fn main_0() -> i32 { Rc::new(RefCell::new(1.try_into().expect("failed conversion"))), ))); let mut value: f64 = 2_f64; - (other_map.as_pointer() - as Ptr, Value), (Value<(Value, Value)>, Value)>>) + other_map + .as_pointer() .with_mut( |__m: &mut Map< (Value, Value), @@ -544,8 +546,8 @@ fn main_0() -> i32 { }, ) .write(value); - value = ((other_map.as_pointer() - as Ptr, Value), (Value<(Value, Value)>, Value)>>) + value = (other_map + .as_pointer() .with_mut( |__m: &mut Map< (Value, Value), @@ -565,8 +567,8 @@ fn main_0() -> i32 { .read()); assert!(((*other_map.borrow()).len() == 1_usize)); assert!( - (((other_map.as_pointer() - as Ptr, Value), (Value<(Value, Value)>, Value)>>) + ((other_map + .as_pointer() .with_mut( |__m: &mut Map< (Value, Value), @@ -650,7 +652,7 @@ fn main_0() -> i32 { let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < indexes.len()) { let __rhs = ((i).wrapping_rem(2_u32) != 0); - (m2.as_pointer() as Ptr, Value)>>) + m2.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(indexes[(i as usize)].clone(), || { ( @@ -668,9 +670,9 @@ fn main_0() -> i32 { assert!(((*m2.borrow()).len() == indexes.len())); let mut last: i32 = -1_i32; 'loop_: for pair in IterRange::new( - (m2.as_pointer() as Ptr, Value)>>) + m2.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (m2.as_pointer() as Ptr, Value)>>) + m2.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let pair: Ptr<(Value, Value)> = pair.iter_deref(); diff --git a/tests/unit/out/refcount/map_copy.rs b/tests/unit/out/refcount/map_copy.rs index a67d174ea..a7d991eb7 100644 --- a/tests/unit/out/refcount/map_copy.rs +++ b/tests/unit/out/refcount/map_copy.rs @@ -12,7 +12,7 @@ pub fn main() { } fn main_0() -> i32 { let a: Value, Value)>> = Rc::new(RefCell::new(Map::new())); - (a.as_pointer() as Ptr, Value)>>) + a.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -26,7 +26,7 @@ fn main_0() -> i32 { }) .write(10); let b: Value, Value)>> = Rc::new(RefCell::new((*a.borrow()).clone())); - (b.as_pointer() as Ptr, Value)>>) + b.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -40,7 +40,7 @@ fn main_0() -> i32 { }) .write(20); assert!( - (((a.as_pointer() as Ptr, Value)>>) + ((a.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -56,7 +56,7 @@ fn main_0() -> i32 { == 10) ); let x: Value, Value)>> = Rc::new(RefCell::new(Map::new())); - (x.as_pointer() as Ptr, Value)>>) + x.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -70,7 +70,7 @@ fn main_0() -> i32 { }) .write(3); let y: Value, Value)>> = Rc::new(RefCell::new((*x.borrow()).clone())); - (y.as_pointer() as Ptr, Value)>>) + y.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -84,7 +84,7 @@ fn main_0() -> i32 { }) .write(4); assert!( - (((x.as_pointer() as Ptr, Value)>>) + ((x.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( diff --git a/tests/unit/out/refcount/map_key_identity.rs b/tests/unit/out/refcount/map_key_identity.rs index d6c75770b..f119e145a 100644 --- a/tests/unit/out/refcount/map_key_identity.rs +++ b/tests/unit/out/refcount/map_key_identity.rs @@ -124,44 +124,48 @@ fn main_0() -> i32 { ok = rhs_0 }; let distinct: Value, Value)>> = Rc::new(RefCell::new(Map::new())); - let a: Ptr = (distinct.as_pointer() as Ptr, Value)>>) - .with_mut(|__m: &mut Map, Value)>| { - __m.get_or_insert_with((*distinct_a.borrow()).clone(), || { - ( - Rc::new(RefCell::new((*distinct_a.borrow()).clone())), - Rc::new(RefCell::new(::default())), - ) - }) - .borrow() - .1 + let a: Ptr = + distinct .as_pointer() - }); + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with((*distinct_a.borrow()).clone(), || { + ( + Rc::new(RefCell::new((*distinct_a.borrow()).clone())), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }); field!(a, value).write(11); - let a_it: Value, Value)>> = Rc::new(RefCell::new( - (distinct.as_pointer() as Ptr, Value)>>) - .with(|__m: &Map, Value)>| __m.find(&(*distinct_a.borrow()))), - )); + let a_it: Value, Value)>> = + Rc::new(RefCell::new(distinct.as_pointer().with( + |__m: &Map, Value)>| __m.find(&(*distinct_a.borrow())), + ))); let mut a_value: Ptr = ((*(*a_it.borrow()).iter_deref().upgrade().deref()) .1 .as_pointer()); ok = { ((ok as i32) & ((default_constructions_0.with(|rc| *rc.borrow()) == 1) as i32)) != 0 }; - let b: Ptr = (distinct.as_pointer() as Ptr, Value)>>) - .with_mut(|__m: &mut Map, Value)>| { - __m.get_or_insert_with((*distinct_b.borrow()).clone(), || { - ( - Rc::new(RefCell::new((*distinct_b.borrow()).clone())), - Rc::new(RefCell::new(::default())), - ) - }) - .borrow() - .1 + let b: Ptr = + distinct .as_pointer() - }); + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with((*distinct_b.borrow()).clone(), || { + ( + Rc::new(RefCell::new((*distinct_b.borrow()).clone())), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }); field!(b, value).write(22); - let b_it: Value, Value)>> = Rc::new(RefCell::new( - (distinct.as_pointer() as Ptr, Value)>>) - .with(|__m: &Map, Value)>| __m.find(&(*distinct_b.borrow()))), - )); + let b_it: Value, Value)>> = + Rc::new(RefCell::new(distinct.as_pointer().with( + |__m: &Map, Value)>| __m.find(&(*distinct_b.borrow())), + ))); ok = { ((ok as i32) & ((default_constructions_0.with(|rc| *rc.borrow()) == 2) as i32)) != 0 }; { let rhs_0 = ((ok as i32) & (((*distinct.borrow()).len() == 2_usize) as i32)) != 0; @@ -176,25 +180,30 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (((*a_it.borrow()) - == (distinct.as_pointer() as Ptr, Value)>>).with( - |__m: &Map, Value)>| __m.find(&(*distinct_a.borrow())), - )) as i32)) + == distinct + .as_pointer() + .with(|__m: &Map, Value)>| { + __m.find(&(*distinct_a.borrow())) + })) as i32)) != 0; ok = rhs_0 }; { let rhs_0 = ((ok as i32) & (((*b_it.borrow()) - == (distinct.as_pointer() as Ptr, Value)>>).with( - |__m: &Map, Value)>| __m.find(&(*distinct_b.borrow())), - )) as i32)) + == distinct + .as_pointer() + .with(|__m: &Map, Value)>| { + __m.find(&(*distinct_b.borrow())) + })) as i32)) != 0; ok = rhs_0 }; { let rhs_0 = ((ok as i32) & (((*b_it.borrow()) - != (distinct.as_pointer() as Ptr, Value)>>) + != distinct + .as_pointer() .with(|__m: &Map, Value)>| __m.end())) as i32)) != 0; @@ -230,9 +239,11 @@ fn main_0() -> i32 { }; let mut distinct_count: usize = 0_usize; 'loop_: for entry in IterRange::new( - (distinct.as_pointer() as Ptr, Value)>>) + distinct + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (distinct.as_pointer() as Ptr, Value)>>) + distinct + .as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let entry: Ptr<(Value, Value)> = entry.iter_deref(); @@ -276,26 +287,25 @@ fn main_0() -> i32 { let equivalent: Value, Value)>> = Rc::new(RefCell::new(Map::new())); let mut before_equivalent: i32 = default_constructions_0.with(|rc| *rc.borrow()); - let first: Ptr = (equivalent.as_pointer() - as Ptr, Value)>>) - .with_mut(|__m: &mut Map, Value)>| { - __m.get_or_insert_with((*equivalent_a.borrow()).clone(), || { - ( - Rc::new(RefCell::new((*equivalent_a.borrow()).clone())), - Rc::new(RefCell::new(::default())), - ) - }) - .borrow() - .1 + let first: Ptr = + equivalent .as_pointer() - }); + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with((*equivalent_a.borrow()).clone(), || { + ( + Rc::new(RefCell::new((*equivalent_a.borrow()).clone())), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }); field!(first, value).write(31); let first_it: Value, Value)>> = - Rc::new(RefCell::new( - (equivalent.as_pointer() as Ptr, Value)>>).with( - |__m: &Map, Value)>| __m.find(&(*equivalent_a.borrow())), - ), - )); + Rc::new(RefCell::new(equivalent.as_pointer().with( + |__m: &Map, Value)>| __m.find(&(*equivalent_a.borrow())), + ))); let mut first_value: Ptr = ((*(*first_it.borrow()).iter_deref().upgrade().deref()) .1 .as_pointer()); @@ -304,19 +314,20 @@ fn main_0() -> i32 { & ((default_constructions_0.with(|rc| *rc.borrow()) == (before_equivalent + 1)) as i32)) != 0 }; - let second: Ptr = (equivalent.as_pointer() - as Ptr, Value)>>) - .with_mut(|__m: &mut Map, Value)>| { - __m.get_or_insert_with((*equivalent_b.borrow()).clone(), || { - ( - Rc::new(RefCell::new((*equivalent_b.borrow()).clone())), - Rc::new(RefCell::new(::default())), - ) - }) - .borrow() - .1 + let second: Ptr = + equivalent .as_pointer() - }); + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with((*equivalent_b.borrow()).clone(), || { + ( + Rc::new(RefCell::new((*equivalent_b.borrow()).clone())), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }); let mut reused: bool = (default_constructions_0.with(|rc| *rc.borrow()) == (before_equivalent + 1)); ok = { ((ok as i32) & (reused as i32)) != 0 }; @@ -328,7 +339,8 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (((*first_it.borrow()) - != (equivalent.as_pointer() as Ptr, Value)>>) + != equivalent + .as_pointer() .with(|__m: &Map, Value)>| __m.end())) as i32)) != 0; @@ -338,20 +350,22 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (((*first_it.borrow()) - == (equivalent.as_pointer() as Ptr, Value)>>) - .with(|__m: &Map, Value)>| { + == equivalent.as_pointer().with( + |__m: &Map, Value)>| { __m.find(&(*equivalent_a.borrow())) - })) as i32)) + }, + )) as i32)) != 0; ok = rhs_0 }; { let rhs_0 = ((ok as i32) & (((*first_it.borrow()) - == (equivalent.as_pointer() as Ptr, Value)>>) - .with(|__m: &Map, Value)>| { + == equivalent.as_pointer().with( + |__m: &Map, Value)>| { __m.find(&(*equivalent_b.borrow())) - })) as i32)) + }, + )) as i32)) != 0; ok = rhs_0 }; @@ -377,9 +391,11 @@ fn main_0() -> i32 { }; let mut equivalent_count: usize = 0_usize; 'loop_: for entry in IterRange::new( - (equivalent.as_pointer() as Ptr, Value)>>) + equivalent + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (equivalent.as_pointer() as Ptr, Value)>>) + equivalent + .as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let entry: Ptr<(Value, Value)> = entry.iter_deref(); @@ -407,19 +423,20 @@ fn main_0() -> i32 { order: 4, identity: 10, }; - let later: Ptr = (equivalent.as_pointer() - as Ptr, Value)>>) - .with_mut(|__m: &mut Map, Value)>| { - __m.get_or_insert_with(later_key.clone(), || { - ( - Rc::new(RefCell::new((later_key).clone())), - Rc::new(RefCell::new(::default())), - ) - }) - .borrow() - .1 + let later: Ptr = + equivalent .as_pointer() - }); + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with(later_key.clone(), || { + ( + Rc::new(RefCell::new((later_key).clone())), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }); field!(later, value).write(41); ok = { ((ok as i32) @@ -434,10 +451,11 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (((*first_it.borrow()) - == (equivalent.as_pointer() as Ptr, Value)>>) - .with(|__m: &Map, Value)>| { + == equivalent.as_pointer().with( + |__m: &Map, Value)>| { __m.find(&(*equivalent_a.borrow())) - })) as i32)) + }, + )) as i32)) != 0; ok = rhs_0 }; @@ -475,25 +493,25 @@ fn main_0() -> i32 { }; let mut before_matching: i32 = default_constructions_0.with(|rc| *rc.borrow()); let matching: Value, Value)>> = Rc::new(RefCell::new(Map::new())); - let matched: Ptr = (matching.as_pointer() - as Ptr, Value)>>) - .with_mut(|__m: &mut Map, Value)>| { - __m.get_or_insert_with(matching_a.clone(), || { - ( - Rc::new(RefCell::new((matching_a).clone())), - Rc::new(RefCell::new(::default())), - ) - }) - .borrow() - .1 + let matched: Ptr = + matching .as_pointer() - }); + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with(matching_a.clone(), || { + ( + Rc::new(RefCell::new((matching_a).clone())), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }); field!(matched, value).write(51); let matched_it: Value, Value)>> = - Rc::new(RefCell::new( - (matching.as_pointer() as Ptr, Value)>>) - .with(|__m: &Map, Value)>| __m.find(&matching_a)), - )); + Rc::new(RefCell::new(matching.as_pointer().with( + |__m: &Map, Value)>| __m.find(&matching_a), + ))); let mut matched_value: Ptr = ((*(*matched_it.borrow()).iter_deref().upgrade().deref()) .1 .as_pointer()); @@ -502,19 +520,20 @@ fn main_0() -> i32 { & ((default_constructions_0.with(|rc| *rc.borrow()) == (before_matching + 1)) as i32)) != 0 }; - let matched_again: Ptr = (matching.as_pointer() - as Ptr, Value)>>) - .with_mut(|__m: &mut Map, Value)>| { - __m.get_or_insert_with(matching_b.clone(), || { - ( - Rc::new(RefCell::new((matching_b).clone())), - Rc::new(RefCell::new(::default())), - ) - }) - .borrow() - .1 + let matched_again: Ptr = + matching .as_pointer() - }); + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with(matching_b.clone(), || { + ( + Rc::new(RefCell::new((matching_b).clone())), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }); ok = { ((ok as i32) & ((default_constructions_0.with(|rc| *rc.borrow()) == (before_matching + 1)) as i32)) @@ -528,7 +547,8 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (((*matched_it.borrow()) - == (matching.as_pointer() as Ptr, Value)>>) + == matching + .as_pointer() .with(|__m: &Map, Value)>| __m.find(&matching_b))) as i32)) != 0; @@ -553,18 +573,20 @@ fn main_0() -> i32 { != 0; ok = rhs_0 }; - let other: Ptr = (matching.as_pointer() as Ptr, Value)>>) - .with_mut(|__m: &mut Map, Value)>| { - __m.get_or_insert_with(matching_c.clone(), || { - ( - Rc::new(RefCell::new((matching_c).clone())), - Rc::new(RefCell::new(::default())), - ) - }) - .borrow() - .1 + let other: Ptr = + matching .as_pointer() - }); + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with(matching_c.clone(), || { + ( + Rc::new(RefCell::new((matching_c).clone())), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }); field!(other, value).write(61); ok = { ((ok as i32) @@ -578,7 +600,8 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (((*matched_it.borrow()) - == (matching.as_pointer() as Ptr, Value)>>) + == matching + .as_pointer() .with(|__m: &Map, Value)>| __m.find(&matching_a))) as i32)) != 0; diff --git a/tests/unit/out/refcount/matmul.rs b/tests/unit/out/refcount/matmul.rs index ab520533e..9d608c98d 100644 --- a/tests/unit/out/refcount/matmul.rs +++ b/tests/unit/out/refcount/matmul.rs @@ -18,8 +18,8 @@ pub fn matalloc_0( ))); let mut i: i32 = 0; 'loop_: while (i < n) { - ((m.as_pointer() as Ptr>>>).offset((i as usize) as isize) - as Ptr>>>) + (m.as_pointer() as Ptr>>>) + .offset((i as usize) as isize) .write( Some(Rc::new(RefCell::new( (0..(p as usize)) diff --git a/tests/unit/out/refcount/move_assign.rs b/tests/unit/out/refcount/move_assign.rs index 284faacb3..2de3d784d 100644 --- a/tests/unit/out/refcount/move_assign.rs +++ b/tests/unit/out/refcount/move_assign.rs @@ -89,12 +89,7 @@ fn main_0() -> i32 { (*vec_.borrow_mut()).push(__a1) }; let d: Value = Rc::new(RefCell::new(MoveOnly::new({ 8 }))); - ({ - MoveOnlyImpl::move_assign( - &(vec_.as_pointer() as Ptr).offset(0_usize), - d.as_pointer(), - ) - }); + ({ MoveOnlyImpl::move_assign(&vec_.as_pointer().decay().offset(0_usize), d.as_pointer()) }); assert!(({ (*vec_.borrow())[0_usize].v } == 8)); assert!(({ (*d.borrow()).v } == 0)); let m: Value = Rc::new(RefCell::new(ConstMoveAssign::new())); diff --git a/tests/unit/out/refcount/nested_vector.rs b/tests/unit/out/refcount/nested_vector.rs index 270c13c28..9029fd410 100644 --- a/tests/unit/out/refcount/nested_vector.rs +++ b/tests/unit/out/refcount/nested_vector.rs @@ -18,7 +18,9 @@ fn main_0() -> i32 { (*v1.borrow_mut()).push(a0_clone) }; assert!( - ((((v1.as_pointer() as Ptr>>).decay().to_last() as Ptr>) + ((v1.as_pointer() + .decay() + .to_last() .decay() .offset(0_usize as isize) .read()) diff --git a/tests/unit/out/refcount/operator_traits.rs b/tests/unit/out/refcount/operator_traits.rs index 185ffb878..edc8d7f60 100644 --- a/tests/unit/out/refcount/operator_traits.rs +++ b/tests/unit/out/refcount/operator_traits.rs @@ -165,40 +165,27 @@ fn main_0() -> i32 { Lt { v: 2 }, ]))); { - let __n = (lts.as_pointer() as Ptr>) + let __n = lts + .as_pointer() .decay() .end() - .iter_distance(&(lts.as_pointer() as Ptr>).decay().begin()); + .iter_distance(<s.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (lts.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__x) - .with(|__a| { - (lts.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) - }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| { - (lts.as_pointer() as Ptr>) + lts.as_pointer().decay().begin().iter_at(__x).with(|__a| { + lts.as_pointer() .decay() .begin() - .iter_at(__i) - .read() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) }) + }); + let __values: Vec<_> = __order + .iter() + .map(|&__i| lts.as_pointer().decay().begin().iter_at(__i).read()) .collect(); for (__i, __v) in (0..__n).zip(__values) { - (lts.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__i) - .write(__v); + lts.as_pointer().decay().begin().iter_at(__i).write(__v); } }; assert!( @@ -214,8 +201,8 @@ fn main_0() -> i32 { let mut nine: Eq = Eq { v: 9 }; assert!( ({ - let mut __it = (eqs.as_pointer() as Ptr>).decay().begin(); - while __it != (eqs.as_pointer() as Ptr>).decay().end() + let mut __it = eqs.as_pointer().decay().begin(); + while __it != eqs.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != two) { __it.iter_inc(); @@ -228,14 +215,14 @@ fn main_0() -> i32 { ); assert!( { - let mut __it = (eqs.as_pointer() as Ptr>).decay().begin(); - while __it != (eqs.as_pointer() as Ptr>).decay().end() + let mut __it = eqs.as_pointer().decay().begin(); + while __it != eqs.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != nine) { __it.iter_inc(); } __it - } == (eqs.as_pointer() as Ptr>).decay().end() + } == eqs.as_pointer().decay().end() ); let cmps: Value> = Rc::new(RefCell::new(Vec::from([ Cmp { v: 3 }, @@ -243,48 +230,35 @@ fn main_0() -> i32 { Cmp { v: 2 }, ]))); { - let __n = (cmps.as_pointer() as Ptr>) + let __n = cmps + .as_pointer() .decay() .end() - .iter_distance(&(cmps.as_pointer() as Ptr>).decay().begin()); + .iter_distance(&cmps.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (cmps.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__x) - .with(|__a| { - (cmps.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) - }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| { - (cmps.as_pointer() as Ptr>) + cmps.as_pointer().decay().begin().iter_at(__x).with(|__a| { + cmps.as_pointer() .decay() .begin() - .iter_at(__i) - .read() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) }) + }); + let __values: Vec<_> = __order + .iter() + .map(|&__i| cmps.as_pointer().decay().begin().iter_at(__i).read()) .collect(); for (__i, __v) in (0..__n).zip(__values) { - (cmps.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__i) - .write(__v); + cmps.as_pointer().decay().begin().iter_at(__i).write(__v); } }; assert!(({ (*cmps.borrow())[0_usize].v } == 1) && ({ (*cmps.borrow())[2_usize].v } == 3)); let mut three: Cmp = Cmp { v: 3 }; assert!( ({ - let mut __it = (cmps.as_pointer() as Ptr>).decay().begin(); - while __it != (cmps.as_pointer() as Ptr>).decay().end() + let mut __it = cmps.as_pointer().decay().begin(); + while __it != cmps.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != three) { __it.iter_inc(); @@ -297,48 +271,36 @@ fn main_0() -> i32 { ); let frees: Value> = Rc::new(RefCell::new(Vec::from([Free { v: 2 }, Free { v: 1 }]))); { - let __n = (frees.as_pointer() as Ptr>) + let __n = frees + .as_pointer() .decay() .end() - .iter_distance(&(frees.as_pointer() as Ptr>).decay().begin()); + .iter_distance(&frees.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (frees.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__x) - .with(|__a| { - (frees.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) - }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| { - (frees.as_pointer() as Ptr>) + frees.as_pointer().decay().begin().iter_at(__x).with(|__a| { + frees + .as_pointer() .decay() .begin() - .iter_at(__i) - .read() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) }) + }); + let __values: Vec<_> = __order + .iter() + .map(|&__i| frees.as_pointer().decay().begin().iter_at(__i).read()) .collect(); for (__i, __v) in (0..__n).zip(__values) { - (frees.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__i) - .write(__v); + frees.as_pointer().decay().begin().iter_at(__i).write(__v); } }; assert!(({ (*frees.borrow())[0_usize].v } == 1)); let mut ftwo: Free = Free { v: 2 }; assert!( ({ - let mut __it = (frees.as_pointer() as Ptr>).decay().begin(); - while __it != (frees.as_pointer() as Ptr>).decay().end() + let mut __it = frees.as_pointer().decay().begin(); + while __it != frees.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != ftwo) { __it.iter_inc(); @@ -350,7 +312,7 @@ fn main_0() -> i32 { == 2) ); let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(Lt { v: 2 }.clone(), || { ( @@ -363,7 +325,7 @@ fn main_0() -> i32 { .as_pointer() }) .write(20); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(Lt { v: 1 }.clone(), || { ( @@ -377,7 +339,8 @@ fn main_0() -> i32 { }) .write(10); assert!( - ((*(*(m.as_pointer() as Ptr, Value)>>) + ((*(*m + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()) .iter_deref() .upgrade() @@ -387,7 +350,7 @@ fn main_0() -> i32 { == 10) ); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(Lt { v: 2 }.clone(), || { ( diff --git a/tests/unit/out/refcount/printfs.rs b/tests/unit/out/refcount/printfs.rs index 5d9976763..df60baaad 100644 --- a/tests/unit/out/refcount/printfs.rs +++ b/tests/unit/out/refcount/printfs.rs @@ -59,10 +59,10 @@ fn main_0() -> i32 { __bytes.push(0); __bytes })); - println!("{}", (s.as_pointer() as Ptr>).decay()); + println!("{}", s.as_pointer().decay()); println!( "{}", - (Rc::new(RefCell::new( + Rc::new(RefCell::new( ({ fn_0({ let mut __bytes = Ptr::::from_string_literal(b"foo").to_c_bytes(); @@ -71,10 +71,10 @@ fn main_0() -> i32 { }) }) )) - .as_pointer() as Ptr>) - .decay() + .as_pointer() + .decay() ); - println!("{}", (({ fn2_1(s.as_pointer(),) }) as Ptr>).decay()); + println!("{}", ({ fn2_1(s.as_pointer(),) }).decay()); ({ log_to_2( libcc2rs::c_stdout(), diff --git a/tests/unit/out/refcount/push_emplace_back.rs b/tests/unit/out/refcount/push_emplace_back.rs index 9f8428f1b..5e7c65300 100644 --- a/tests/unit/out/refcount/push_emplace_back.rs +++ b/tests/unit/out/refcount/push_emplace_back.rs @@ -99,11 +99,7 @@ pub fn nested_emplace_move_5(mut bw: Ptr) { } pub fn self_ref_push_6(mut comps: Ptr>) { { - let a0_clone = (*((comps).clone() as Ptr>) - .decay() - .upgrade() - .deref()) - .clone(); + let a0_clone = (*(comps).clone().decay().upgrade().deref()).clone(); comps.with_mut(|__v: &mut Vec| __v.push(a0_clone)) }; } @@ -184,9 +180,7 @@ fn main_0() -> i32 { ({ push_param_0((vecs.as_pointer())) }); assert!(((*vecs.borrow()).len() == 1_usize)); assert!( - (*((vecs.as_pointer() as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) + (*(vecs.as_pointer().decay().offset(0_usize).as_pointer() as Ptr>) .upgrade() .deref()) .is_empty() @@ -195,7 +189,9 @@ fn main_0() -> i32 { ({ push_local_from_field_1((jpg.as_pointer()), true) }); assert!(((*jpg.borrow()).com_data.len() == 1_usize)); assert!( - ((*((field_ref!(jpg.as_pointer(), com_data).as_pointer() as Ptr>) + ((*(field_ref!(jpg.as_pointer(), com_data) + .as_pointer() + .decay() .offset(0_usize) .as_pointer() as Ptr>) .upgrade() @@ -225,7 +221,9 @@ fn main_0() -> i32 { ({ emplace_local_from_field_4((jpg.as_pointer()), false) }); assert!(((*jpg.borrow()).app_data.len() == 1_usize)); assert!( - ((*((field_ref!(jpg.as_pointer(), app_data).as_pointer() as Ptr>) + ((*(field_ref!(jpg.as_pointer(), app_data) + .as_pointer() + .decay() .offset(0_usize) .as_pointer() as Ptr>) .upgrade() @@ -265,26 +263,12 @@ fn main_0() -> i32 { let queue: Value> = Rc::new(RefCell::new(Vec::new())); ({ emplace_deque_8((queue.as_pointer())) }); assert!( - ((queue.as_pointer() as Ptr>) - .decay() - .with(|__s| __s.first) - == 6) - && ((queue.as_pointer() as Ptr>) - .decay() - .with(|__s| __s.second) - == 14) + (queue.as_pointer().decay().with(|__s| __s.first) == 6) + && (queue.as_pointer().decay().with(|__s| __s.second) == 14) ); assert!( - ((queue.as_pointer() as Ptr>) - .decay() - .to_last() - .with(|__s| __s.first) - == -1_i32) - && ((queue.as_pointer() as Ptr>) - .decay() - .to_last() - .with(|__s| __s.second) - == -1_i32) + (queue.as_pointer().decay().to_last().with(|__s| __s.first) == -1_i32) + && (queue.as_pointer().decay().to_last().with(|__s| __s.second) == -1_i32) ); let values: Value> = Rc::new(RefCell::new(Vec::new())); ({ emplace_scalar_9((values.as_pointer()), 7) }); diff --git a/tests/unit/out/refcount/redundant_copy_in_conversion.rs b/tests/unit/out/refcount/redundant_copy_in_conversion.rs index 4fcafd8d3..87e87a765 100644 --- a/tests/unit/out/refcount/redundant_copy_in_conversion.rs +++ b/tests/unit/out/refcount/redundant_copy_in_conversion.rs @@ -25,7 +25,7 @@ pub fn main() { } fn main_0() -> i32 { let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(0.clone(), || { ( @@ -39,11 +39,11 @@ fn main_0() -> i32 { }) .write(1); let end: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), )); let it0: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&0)), )); let const_it: Value, Value)>> = Rc::new(RefCell::new( diff --git a/tests/unit/out/refcount/references2.rs b/tests/unit/out/refcount/references2.rs index 6012a885e..ec8cc4078 100644 --- a/tests/unit/out/refcount/references2.rs +++ b/tests/unit/out/refcount/references2.rs @@ -8,7 +8,7 @@ use std::os::fd::AsFd; use std::rc::{Rc, Weak}; pub fn change_0(p: Ptr>>) { let q: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(7))))); - ((p).clone() as Ptr>>).write((*q.borrow_mut()).take()); + (p).clone().write((*q.borrow_mut()).take()); } pub fn main() { __cpp2rust_init_globals(); diff --git a/tests/unit/out/refcount/reinterpret_cast_empty_vec.rs b/tests/unit/out/refcount/reinterpret_cast_empty_vec.rs index c13d2cc22..e5b35bd20 100644 --- a/tests/unit/out/refcount/reinterpret_cast_empty_vec.rs +++ b/tests/unit/out/refcount/reinterpret_cast_empty_vec.rs @@ -12,9 +12,7 @@ pub fn main() { } fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::new())); - let mut bytes: Ptr = (v.as_pointer() as Ptr>) - .decay() - .reinterpret_cast::(); + let mut bytes: Ptr = v.as_pointer().decay().reinterpret_cast::(); return 0; } pub fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/refcount/reinterpret_cast_string.rs b/tests/unit/out/refcount/reinterpret_cast_string.rs index 0bd2a15ed..702e1de36 100644 --- a/tests/unit/out/refcount/reinterpret_cast_string.rs +++ b/tests/unit/out/refcount/reinterpret_cast_string.rs @@ -16,9 +16,7 @@ fn main_0() -> i32 { __bytes.push(0); __bytes })); - let mut bytes: Ptr = (s.as_pointer() as Ptr>) - .decay() - .reinterpret_cast::(); + let mut bytes: Ptr = s.as_pointer().decay().reinterpret_cast::(); assert!((((elem!(bytes, 0).read()) as i32) == (('A' as i8) as i32))); assert!((((elem!(bytes, 1).read()) as i32) == (('B' as i8) as i32))); assert!((((elem!(bytes, 2).read()) as i32) == (('C' as i8) as i32))); diff --git a/tests/unit/out/refcount/reinterpret_cast_vec_write.rs b/tests/unit/out/refcount/reinterpret_cast_vec_write.rs index e8efabb7a..b83990551 100644 --- a/tests/unit/out/refcount/reinterpret_cast_vec_write.rs +++ b/tests/unit/out/refcount/reinterpret_cast_vec_write.rs @@ -20,9 +20,7 @@ fn main_0() -> i32 { let __a1 = 134678021_u32; (*vec_.borrow_mut()).push(__a1) }; - let mut bytes: Ptr = (vec_.as_pointer() as Ptr>) - .decay() - .reinterpret_cast::(); + let mut bytes: Ptr = vec_.as_pointer().decay().reinterpret_cast::(); assert!((((elem!(bytes, 0).read()) as i32) == 1)); assert!((((elem!(bytes, 1).read()) as i32) == 2)); assert!((((elem!(bytes, 2).read()) as i32) == 3)); diff --git a/tests/unit/out/refcount/sort.rs b/tests/unit/out/refcount/sort.rs index 5f300a2f4..c065f8ea2 100644 --- a/tests/unit/out/refcount/sort.rs +++ b/tests/unit/out/refcount/sort.rs @@ -53,40 +53,27 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; { - let __n = (v.as_pointer() as Ptr>) + let __n = v + .as_pointer() .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr>).decay().begin()); + .iter_distance(&v.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (v.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__x) - .with(|__a| { - (v.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) - }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| { - (v.as_pointer() as Ptr>) + v.as_pointer().decay().begin().iter_at(__x).with(|__a| { + v.as_pointer() .decay() .begin() - .iter_at(__i) - .read() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) }) + }); + let __values: Vec<_> = __order + .iter() + .map(|&__i| v.as_pointer().decay().begin().iter_at(__i).read()) .collect(); for (__i, __v) in (0..__n).zip(__values) { - (v.as_pointer() as Ptr>) - .decay() - .begin() - .iter_at(__i) - .write(__v); + v.as_pointer().decay().begin().iter_at(__i).write(__v); } }; let mut i: u32 = 0_u32; diff --git a/tests/unit/out/refcount/split_binop_aliased_borrows.rs b/tests/unit/out/refcount/split_binop_aliased_borrows.rs index 452ed2165..dff87f776 100644 --- a/tests/unit/out/refcount/split_binop_aliased_borrows.rs +++ b/tests/unit/out/refcount/split_binop_aliased_borrows.rs @@ -12,10 +12,8 @@ pub fn main() { } fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::from([1, 2]))); - let p: Value> = Rc::new(RefCell::new( - (v.as_pointer() as Ptr>).decay().begin(), - )); - let r: Ptr = (v.as_pointer() as Ptr).offset(1_usize); + let p: Value> = Rc::new(RefCell::new(v.as_pointer().decay().begin())); + let r: Ptr = v.as_pointer().decay().offset(1_usize); let __rhs = (r.read()); (*p.borrow()).iter_deref().write(__rhs); assert!(({ (*v.borrow())[0_usize] } == 2)); diff --git a/tests/unit/out/refcount/stdcopy_ostream.rs b/tests/unit/out/refcount/stdcopy_ostream.rs index 961bed973..476343928 100644 --- a/tests/unit/out/refcount/stdcopy_ostream.rs +++ b/tests/unit/out/refcount/stdcopy_ostream.rs @@ -26,10 +26,8 @@ fn main_0() -> i32 { )); { let mut __bytes: Vec = Vec::new(); - let mut __it = RandomAccessIterator::Vec((str.as_pointer() as Ptr>).decay()); - while __it - != RandomAccessIterator::Vec((str.as_pointer() as Ptr>).decay().to_last()) - { + let mut __it = RandomAccessIterator::Vec(str.as_pointer().decay()); + while __it != RandomAccessIterator::Vec(str.as_pointer().decay().to_last()) { __bytes.push(__it.iter_deref().read() as u8); __it.iter_inc(); } diff --git a/tests/unit/out/refcount/string.rs b/tests/unit/out/refcount/string.rs index b28440cd7..dd9392010 100644 --- a/tests/unit/out/refcount/string.rs +++ b/tests/unit/out/refcount/string.rs @@ -37,7 +37,7 @@ fn main_0() -> i32 { !(Ptr::::from_string_literal(b"hello") .with_c_str(|__s| (*s1.borrow())[..(*s1.borrow()).len().saturating_sub(1)] != *__s)) ); - let mut p1: Ptr = (s1.as_pointer() as Ptr>).decay(); + let mut p1: Ptr = s1.as_pointer().decay(); assert!((((elem!(p1, 0).read()) as i32) == (('h' as i8) as i32))); assert!((((elem!(p1, 1).read()) as i32) == (('e' as i8) as i32))); assert!((((elem!(p1, 2).read()) as i32) == (('l' as i8) as i32))); @@ -50,7 +50,7 @@ fn main_0() -> i32 { .chain(std::iter::once(0)) .collect(), )); - let mut p2: Ptr = (s2.as_pointer() as Ptr>).decay(); + let mut p2: Ptr = s2.as_pointer().decay(); let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < ((*s2.borrow()).len() - 1)) { assert!( @@ -85,7 +85,7 @@ fn main_0() -> i32 { })); assert!((((*s3.borrow()).len() - 1) == 5_usize)); assert!((((*s3.borrow()).len() - 1) == ((*s3.borrow()).len() - 1))); - let mut p3: Ptr = (s3.as_pointer() as Ptr>).decay(); + let mut p3: Ptr = s3.as_pointer().decay(); let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < ((*s3.borrow()).len() - 1)) { assert!( @@ -112,7 +112,7 @@ fn main_0() -> i32 { })); assert!((((*s4.borrow()).len() - 1) == 3_usize)); assert!((((*s4.borrow()).len() - 1) == ((*s4.borrow()).len() - 1))); - let mut p4: Ptr = (s4.as_pointer() as Ptr>).decay(); + let mut p4: Ptr = s4.as_pointer().decay(); let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < ((*s4.borrow()).len() - 1)) { assert!( @@ -129,7 +129,7 @@ fn main_0() -> i32 { })); assert!((((*s5.borrow()).len() - 1) == 12_usize)); assert!((((*s5.borrow()).len() - 1) == ((*s5.borrow()).len() - 1))); - let mut p5: Ptr = (s5.as_pointer() as Ptr>).decay(); + let mut p5: Ptr = s5.as_pointer().decay(); let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < ((*s5.borrow()).len() - 1)) { assert!( @@ -298,7 +298,7 @@ fn main_0() -> i32 { __bytes })); let mut output_data: Ptr = - ((string_to_cast.as_pointer() as Ptr).offset(0_usize)).reinterpret_cast::(); + (string_to_cast.as_pointer().decay().offset(0_usize)).reinterpret_cast::(); assert!((((output_data.read()) as i32) == (('c' as i8) as i32))); assert!((((elem!(output_data, 1).read()) as i32) == (('a' as i8) as i32))); assert!((((elem!(output_data, 2).read()) as i32) == (('s' as i8) as i32))); diff --git a/tests/unit/out/refcount/string2.rs b/tests/unit/out/refcount/string2.rs index a19845bb9..c712c9d97 100644 --- a/tests/unit/out/refcount/string2.rs +++ b/tests/unit/out/refcount/string2.rs @@ -17,15 +17,13 @@ fn main_0() -> i32 { __bytes })); (*arr.borrow_mut())[1_usize] = ('b' as i8); - let mut p: Ptr = (arr.as_pointer() as Ptr>) - .decay() - .offset((1) as isize); + let mut p: Ptr = arr.as_pointer().decay().offset((1) as isize); assert!((((p.read()) as i32) == (('b' as i8) as i32))); assert!( Ptr::::from_string_literal(b"fbo") .with_c_str(|__s| (*arr.borrow())[..(*arr.borrow()).len().saturating_sub(1)] == *__s) ); - let mut names: [Ptr; 1] = [(arr.as_pointer() as Ptr>).decay()]; + let mut names: [Ptr; 1] = [arr.as_pointer().decay()]; let mut copy: Vec = { let mut __bytes = names[(0) as usize].to_c_bytes(); __bytes.push(0); diff --git a/tests/unit/out/refcount/structured_binding_move_ctor.rs b/tests/unit/out/refcount/structured_binding_move_ctor.rs index 31d62f788..3694df503 100644 --- a/tests/unit/out/refcount/structured_binding_move_ctor.rs +++ b/tests/unit/out/refcount/structured_binding_move_ctor.rs @@ -85,7 +85,7 @@ fn main_0() -> i32 { assert!(((*__decomp_3.borrow()).ys.len() == 2_usize)); assert!( ((elem!( - (field_ref!(__decomp_3.as_pointer(), xs).as_pointer() as Ptr), + field_ref!(__decomp_3.as_pointer(), xs).as_pointer().decay(), 2_usize ) .read()) @@ -93,7 +93,7 @@ fn main_0() -> i32 { ); assert!( ((elem!( - (field_ref!(__decomp_3.as_pointer(), ys).as_pointer() as Ptr), + field_ref!(__decomp_3.as_pointer(), ys).as_pointer().decay(), 0_usize ) .read()) diff --git a/tests/unit/out/refcount/sys_stat.rs b/tests/unit/out/refcount/sys_stat.rs index 4f8e92c3c..5d8ebde46 100644 --- a/tests/unit/out/refcount/sys_stat.rs +++ b/tests/unit/out/refcount/sys_stat.rs @@ -45,9 +45,7 @@ pub fn test_stat_0() { != 0) ); assert!(((({ (*st.borrow()).st_size } == 5_i64) as i32) != 0)); - assert!( - ((((field_ptr!((st.as_pointer() as Ptr), st_mtime).read()) > 0_i64) as i32) != 0) - ); + assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) > 0_i64) as i32) != 0)); match nix::unistd::unlink(path.to_rust_string().as_str()) { Ok(()) => 0, Err(__e) => { @@ -89,9 +87,7 @@ pub fn test_fstat_1() { != 0) ); assert!(((({ (*st.borrow()).st_size } == 11_i64) as i32) != 0)); - assert!( - ((((field_ptr!((st.as_pointer() as Ptr), st_mtime).read()) > 0_i64) as i32) != 0) - ); + assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) > 0_i64) as i32) != 0)); assert!( ((({ let __r = fp.with(|__f| __f.close()); @@ -111,36 +107,28 @@ pub fn test_fstat_1() { pub fn test_st_mtime_access_2() { let st: Value = Rc::new(RefCell::new(Default::default())); let mut sp: Ptr = (st.as_pointer()); - field_ptr!((st.as_pointer() as Ptr), st_mtime).write(5_i64); - assert!( - ((((field_ptr!((st.as_pointer() as Ptr), st_mtime).read()) == 5_i64) as i32) != 0) - ); - field_ptr!(((sp).clone() as Ptr), st_mtime).write(6_i64); - assert!(((((field_ptr!(((sp).clone() as Ptr), st_mtime).read()) == 6_i64) as i32) != 0)); + field_ptr!(st.as_pointer(), st_mtime).write(5_i64); + assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 5_i64) as i32) != 0)); + field_ptr!((sp).clone(), st_mtime).write(6_i64); + assert!(((((field_ptr!((sp).clone(), st_mtime).read()) == 6_i64) as i32) != 0)); { - field_ptr!((st.as_pointer() as Ptr), st_mtime).with_mut(|__v| *__v = *__v + 2_i64) + field_ptr!(st.as_pointer(), st_mtime).with_mut(|__v| *__v = *__v + 2_i64) }; - assert!( - ((((field_ptr!((st.as_pointer() as Ptr), st_mtime).read()) == 8_i64) as i32) != 0) - ); + assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 8_i64) as i32) != 0)); { - field_ptr!(((sp).clone() as Ptr), st_mtime).with_mut(|__v| *__v = *__v - 1_i64) + field_ptr!((sp).clone(), st_mtime).with_mut(|__v| *__v = *__v - 1_i64) }; - assert!(((((field_ptr!(((sp).clone() as Ptr), st_mtime).read()) == 7_i64) as i32) != 0)); - field_ptr!((st.as_pointer() as Ptr), st_mtime).with_mut(|__v| __v.postfix_inc()); - field_ptr!(((sp).clone() as Ptr), st_mtime).with_mut(|__v| __v.prefix_inc()); - assert!( - ((((field_ptr!((st.as_pointer() as Ptr), st_mtime).read()) == 9_i64) as i32) != 0) - ); - let mut mtime: Ptr = (field_ptr!((st.as_pointer() as Ptr), st_mtime)); + assert!(((((field_ptr!((sp).clone(), st_mtime).read()) == 7_i64) as i32) != 0)); + field_ptr!(st.as_pointer(), st_mtime).with_mut(|__v| __v.postfix_inc()); + field_ptr!((sp).clone(), st_mtime).with_mut(|__v| __v.prefix_inc()); + assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 9_i64) as i32) != 0)); + let mut mtime: Ptr = (field_ptr!(st.as_pointer(), st_mtime)); mtime.write(10_i64); - assert!( - ((((field_ptr!((st.as_pointer() as Ptr), st_mtime).read()) == 10_i64) as i32) != 0) - ); - let mut mtime_via_ptr: Ptr = (field_ptr!(((sp).clone() as Ptr), st_mtime)); + assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 10_i64) as i32) != 0)); + let mut mtime_via_ptr: Ptr = (field_ptr!((sp).clone(), st_mtime)); mtime_via_ptr.write(11_i64); assert!(((((mtime.read()) == 11_i64) as i32) != 0)); - let mut copy: i64 = (field_ptr!(((sp).clone() as Ptr), st_mtime).read()); + let mut copy: i64 = (field_ptr!((sp).clone(), st_mtime).read()); assert!((((copy == 11_i64) as i32) != 0)); } pub fn main() { diff --git a/tests/unit/out/refcount/unboxed_conditional_iterator.rs b/tests/unit/out/refcount/unboxed_conditional_iterator.rs index 6f555f3e0..b1bd73fe2 100644 --- a/tests/unit/out/refcount/unboxed_conditional_iterator.rs +++ b/tests/unit/out/refcount/unboxed_conditional_iterator.rs @@ -48,8 +48,8 @@ pub fn lehmer_2(mut sigma: Ptr, mut len: u32, mut code: Ptr) { let mut i: u32 = 0_u32; 'loop_: while (i < len) { let it: Value> = Rc::new(RefCell::new({ - let mut __it = (items.as_pointer() as Ptr>).decay().begin(); - while __it != (items.as_pointer() as Ptr>).decay().end() + let mut __it = items.as_pointer().decay().begin(); + while __it != items.as_pointer().decay().end() && __it .iter_deref() .with(|__v| *__v != (elem!(sigma, i).read())) @@ -58,24 +58,23 @@ pub fn lehmer_2(mut sigma: Ptr, mut len: u32, mut code: Ptr) { } __it })); - assert!((*it.borrow()) != (items.as_pointer() as Ptr>).decay().end()); - let __rhs = ((*it.borrow()) - .iter_distance(&(items.as_pointer() as Ptr>).decay().begin()) - as u32); + assert!((*it.borrow()) != items.as_pointer().decay().end()); + let __rhs = ((*it.borrow()).iter_distance(&items.as_pointer().decay().begin()) as u32); elem!(code, i).write(__rhs); { let __off = >::from((*it.borrow()).clone()).index(); - (items.as_pointer() as Ptr>).with_mut(|__v: &mut Vec| __v.remove(__off)); - RandomAccessIterator::Vec((items.as_pointer() as Ptr>).decay() + __off) + items + .as_pointer() + .with_mut(|__v: &mut Vec| __v.remove(__off)); + RandomAccessIterator::Vec(items.as_pointer().decay() + __off) }; i.prefix_inc(); } } pub fn sum_3(v: Ptr>) -> i32 { let mut s: i32 = 0; - let it: Value> = - Rc::new(RefCell::new(((v).clone() as Ptr>).decay().begin())); - 'loop_: while (*it.borrow()) != ((v).clone() as Ptr>).decay().end() { + let it: Value> = Rc::new(RefCell::new((v).clone().decay().begin())); + 'loop_: while (*it.borrow()) != (v).clone().decay().end() { s += ((*it.borrow()).iter_deref().read()); (*it.borrow_mut()).iter_inc(); } diff --git a/tests/unit/out/refcount/unboxed_locals.rs b/tests/unit/out/refcount/unboxed_locals.rs index e5fc6348a..a2f7e957e 100644 --- a/tests/unit/out/refcount/unboxed_locals.rs +++ b/tests/unit/out/refcount/unboxed_locals.rs @@ -22,10 +22,7 @@ pub struct Pair { } pub fn total_2(v: Ptr>) -> i32 { let mut s: i32 = 0; - 'loop_: for x in IterRange::new( - ((v).clone() as Ptr>).decay().begin(), - ((v).clone() as Ptr>).decay().end(), - ) { + 'loop_: for x in IterRange::new((v).clone().decay().begin(), (v).clone().decay().end()) { let mut x: i32 = (x.iter_deref().read()); s += x; } @@ -157,10 +154,10 @@ fn main_0() -> i32 { let by_ref: Value> = Rc::new(RefCell::new(vec![3; 2_usize as usize])); assert!((({ total_2(by_ref.as_pointer(),) }) == 6)); let elem_ptr: Value> = Rc::new(RefCell::new(vec![0; 2_usize as usize])); - ({ set_0(((elem_ptr.as_pointer() as Ptr).offset(1_usize)), 7) }); + ({ set_0((elem_ptr.as_pointer().decay().offset(1_usize)), 7) }); assert!(({ (*elem_ptr.borrow())[1_usize] } == 7)); let data: Value> = Rc::new(RefCell::new(vec![0; 2_usize as usize])); - ({ set_0((data.as_pointer() as Ptr>).decay(), 8) }); + ({ set_0(data.as_pointer().decay(), 8) }); assert!(({ (*data.borrow())[0_usize] } == 8)); let square: Value = Rc::new(RefCell::new(::default())); let mut shape: PtrDyn = (square.as_pointer()).to_dyn::(|w| w); diff --git a/tests/unit/out/refcount/unique_ptr.rs b/tests/unit/out/refcount/unique_ptr.rs index c24143f43..b9a35a73d 100644 --- a/tests/unit/out/refcount/unique_ptr.rs +++ b/tests/unit/out/refcount/unique_ptr.rs @@ -32,18 +32,17 @@ 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_pointer().write(1); - (x1.as_pointer() as Ptr>>).write((*x2.borrow_mut()).take()); + x1.as_pointer().write((*x2.borrow_mut()).take()); let mut raw_ptr1: Ptr = ((*x1.borrow()).as_pointer()); raw_ptr1.with_mut(|__v| __v.prefix_inc()); - (field_ptr!(((*safe_ptr.upgrade().deref()).as_pointer()), ptr) as Ptr>>) - .write((*x1.borrow_mut()).take()); + field_ptr!(((*safe_ptr.upgrade().deref()).as_pointer()), ptr).write((*x1.borrow_mut()).take()); ({ SafePointerImpl::inc(&((*safe_ptr.upgrade().deref()).as_pointer())) }); ({ 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_pointer().read()) + ((*x4.borrow()).as_pointer().read())); (*x3.borrow()).as_pointer().write(__rhs); - (x4.as_pointer() as Ptr>>).write((*x3.borrow_mut()).take()); + x4.as_pointer().write((*x3.borrow_mut()).take()); let mut raw_ptr2: Ptr = ((*x4.borrow()).as_pointer()); { raw_ptr2.with_mut(|__v| *__v = *__v + 1) @@ -91,7 +90,7 @@ pub fn RndStuff_2() { .write(1); i.prefix_inc(); } - (x2.as_pointer() as Ptr>>>).write( + x2.as_pointer().write( Ptr::alloc_array((0..200_usize).map(|_| 0_i32).collect::>()).to_owned_opt(), ); let mut i: i32 = 0; @@ -134,7 +133,7 @@ pub fn RndStuff_2() { assert!((elem!(p3_0, i).with(|__s| __s.y) == 12)); i.prefix_inc(); } - (x3.as_pointer() as Ptr>>>).write( + x3.as_pointer().write( Ptr::alloc_array( (0..50_usize) .map(|_| ::default()) @@ -210,7 +209,7 @@ impl SafePointerImpl for Ptr { .with_mut(|__v| __v.prefix_inc()); } fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), ptr) as Ptr>>) + field_ptr!((*self), ptr) .write(field!(_a0, ptr).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/unique_ptr_const_deref.rs b/tests/unit/out/refcount/unique_ptr_const_deref.rs index 9ad07cc00..6989ed101 100644 --- a/tests/unit/out/refcount/unique_ptr_const_deref.rs +++ b/tests/unit/out/refcount/unique_ptr_const_deref.rs @@ -32,8 +32,7 @@ pub fn main() { } fn main_0() -> i32 { let h: Value = Rc::new(RefCell::new(::default())); - (field_ptr!(h.as_pointer(), val) as Ptr>>) - .write(Some(Rc::new(RefCell::new(10))).take()); + field_ptr!(h.as_pointer(), val).write(Some(Rc::new(RefCell::new(10))).take()); ({ write_val_1((h.as_pointer()), 42) }); assert!((({ read_val_0((h.as_pointer()),) }) == 42)); return 0; @@ -43,7 +42,7 @@ pub trait HolderImpl { } impl HolderImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), val) as Ptr>>) + field_ptr!((*self), val) .write(field!(_a0, val).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/unique_ptr_field_reset.rs b/tests/unit/out/refcount/unique_ptr_field_reset.rs index 6db12088d..b880e4ffb 100644 --- a/tests/unit/out/refcount/unique_ptr_field_reset.rs +++ b/tests/unit/out/refcount/unique_ptr_field_reset.rs @@ -39,7 +39,7 @@ fn main_0() -> i32 { let mut hp: Ptr = (h.as_pointer()); { let _p: Ptr<_> = Ptr::alloc(Data { v: 3 }); - (field_ptr!(hp, data) as Ptr>>).write(_p.to_owned_opt()) + field_ptr!(hp, data).write(_p.to_owned_opt()) }; assert!( ({ (*h.borrow()).data.clone() } @@ -74,11 +74,11 @@ impl HolderImpl for Ptr { fn set(&self, mut p: Ptr) { { let _p: Ptr<_> = (p).clone(); - (field_ptr!((*self), data) as Ptr>>).write(_p.to_owned_opt()) + field_ptr!((*self), data).write(_p.to_owned_opt()) }; } fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), data) as Ptr>>) + field_ptr!((*self), data) .write(field!(_a0, data).with_mut(|__v: &mut Option>| __v.take())); field!((*self), n).write({ { (*_a0.upgrade().deref()).n } }); return (*self).clone(); diff --git a/tests/unit/out/refcount/unique_ptr_nested.rs b/tests/unit/out/refcount/unique_ptr_nested.rs index 6969fc19a..6e867ab1b 100644 --- a/tests/unit/out/refcount/unique_ptr_nested.rs +++ b/tests/unit/out/refcount/unique_ptr_nested.rs @@ -61,7 +61,7 @@ pub trait OuterImpl { } impl OuterImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), inner) as Ptr>>) + field_ptr!((*self), inner) .write(field!(_a0, inner).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/unique_ptr_small.rs b/tests/unit/out/refcount/unique_ptr_small.rs index 1898f63bb..23fd513da 100644 --- a/tests/unit/out/refcount/unique_ptr_small.rs +++ b/tests/unit/out/refcount/unique_ptr_small.rs @@ -8,7 +8,7 @@ use std::os::fd::AsFd; use std::rc::{Rc, Weak}; pub fn change_0(n: Ptr>>) { let m: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(20))))); - ((n).clone() as Ptr>>).write((*m.borrow_mut()).take()); + (n).clone().write((*m.borrow_mut()).take()); } pub fn main() { __cpp2rust_init_globals(); diff --git a/tests/unit/out/refcount/vector.rs b/tests/unit/out/refcount/vector.rs index 5b8bf1e7f..3a981103c 100644 --- a/tests/unit/out/refcount/vector.rs +++ b/tests/unit/out/refcount/vector.rs @@ -55,21 +55,18 @@ fn main_0() -> i32 { }; assert!(((*v2.borrow()).len() == 3_usize)); { - let __off = - >::from((v2.as_pointer() as Ptr>).decay().begin()) - .index(); - (v2.as_pointer() as Ptr>).with_mut(|__v: &mut Vec| __v.remove(__off)); - RandomAccessIterator::Vec((v2.as_pointer() as Ptr>).decay() + __off) + let __off = >::from(v2.as_pointer().decay().begin()).index(); + v2.as_pointer() + .with_mut(|__v: &mut Vec| __v.remove(__off)); + RandomAccessIterator::Vec(v2.as_pointer().decay() + __off) }; assert!(((*v2.borrow()).len() == 2_usize)); assert!(({ (*v2.borrow())[0_usize] } == 2)); assert!(({ (*v2.borrow())[1_usize] } == 3)); { - let __off = - >::from((v2.as_pointer() as Ptr>).decay().begin()) - .index(); + let __off = >::from(v2.as_pointer().decay().begin()).index(); (*v2.borrow_mut()).insert(__off, 100); - >::from((v2.as_pointer() as Ptr>).decay().begin()) + >::from(v2.as_pointer().decay().begin()) }; ({ copy_0((*v2.borrow()).clone()) }); assert!(((*v2.borrow()).len() == 3_usize)); @@ -78,50 +75,30 @@ fn main_0() -> i32 { assert!(({ (*v2.borrow())[2_usize] } == 3)); let mut x: i32 = 7; { - let __off = >::from( - (v2.as_pointer() as Ptr>) - .decay() - .begin() - .iter_add(1_isize), - ) - .index(); + let __off = + >::from(v2.as_pointer().decay().begin().iter_add(1_isize)) + .index(); (*v2.borrow_mut()).insert(__off, x); - >::from( - (v2.as_pointer() as Ptr>) - .decay() - .begin() - .iter_add(1_isize), - ) + >::from(v2.as_pointer().decay().begin().iter_add(1_isize)) }; assert!(((*v2.borrow()).len() == 4_usize)); assert!(({ (*v2.borrow())[0_usize] } == 100)); assert!(({ (*v2.borrow())[1_usize] } == 7)); assert!(({ (*v2.borrow())[2_usize] } == 2)); { - let __off = - >::from((v2.as_pointer() as Ptr>).decay().end()) - .index(); + let __off = >::from(v2.as_pointer().decay().end()).index(); (*v2.borrow_mut()).splice(__off..__off, std::iter::repeat_n(9, 2_usize)); - >::from((v2.as_pointer() as Ptr>).decay().end()) + >::from(v2.as_pointer().decay().end()) }; assert!(((*v2.borrow()).len() == 6_usize)); assert!(({ (*v2.borrow())[4_usize] } == 9)); assert!(({ (*v2.borrow())[5_usize] } == 9)); { - let __off = >::from( - (v2.as_pointer() as Ptr>) - .decay() - .begin() - .iter_add(2_isize), - ) - .index(); + let __off = + >::from(v2.as_pointer().decay().begin().iter_add(2_isize)) + .index(); (*v2.borrow_mut()).splice(__off..__off, Vec::from([11, 12, 13])); - >::from( - (v2.as_pointer() as Ptr>) - .decay() - .begin() - .iter_add(2_isize), - ) + >::from(v2.as_pointer().decay().begin().iter_add(2_isize)) }; assert!(((*v2.borrow()).len() == 9_usize)); assert!(({ (*v2.borrow())[1_usize] } == 7)); @@ -132,50 +109,44 @@ fn main_0() -> i32 { assert!(({ (*v2.borrow())[8_usize] } == 9)); let src: Value> = Rc::new(RefCell::new(Vec::from([21, 22]))); { - let start_idx = - >::from((v2.as_pointer() as Ptr>).decay().begin()) - .index(); + let start_idx = >::from(v2.as_pointer().decay().begin()).index(); let mut temp_vec: Vec = Vec::new(); - let mut __it = (src.as_pointer() as Ptr>).decay().begin(); - while __it != (src.as_pointer() as Ptr>).decay().end() { + let mut __it = src.as_pointer().decay().begin(); + while __it != src.as_pointer().decay().end() { temp_vec.push(__it.iter_deref().read()); __it.iter_inc(); } - (v2.as_pointer() as Ptr>).with_mut(|v: &mut Vec| { + v2.as_pointer().with_mut(|v: &mut Vec| { v.splice(start_idx..start_idx, temp_vec); }); - RandomAccessIterator::Vec((v2.as_pointer() as Ptr>).decay() + start_idx) + RandomAccessIterator::Vec(v2.as_pointer().decay() + start_idx) }; assert!(((*v2.borrow()).len() == 11_usize)); assert!(({ (*v2.borrow())[0_usize] } == 21)); assert!(({ (*v2.borrow())[1_usize] } == 22)); assert!(({ (*v2.borrow())[2_usize] } == 100)); { - let __off = - >::from((v2.as_pointer() as Ptr>).decay().begin()) - .index(); - (v2.as_pointer() as Ptr>).with_mut(|__v: &mut Vec| __v.remove(__off)); - RandomAccessIterator::Vec((v2.as_pointer() as Ptr>).decay() + __off) + let __off = >::from(v2.as_pointer().decay().begin()).index(); + v2.as_pointer() + .with_mut(|__v: &mut Vec| __v.remove(__off)); + RandomAccessIterator::Vec(v2.as_pointer().decay() + __off) }; { - let __off = - >::from((v2.as_pointer() as Ptr>).decay().begin()) - .index(); - (v2.as_pointer() as Ptr>).with_mut(|__v: &mut Vec| __v.remove(__off)); - RandomAccessIterator::Vec((v2.as_pointer() as Ptr>).decay() + __off) + let __off = >::from(v2.as_pointer().decay().begin()).index(); + v2.as_pointer() + .with_mut(|__v: &mut Vec| __v.remove(__off)); + RandomAccessIterator::Vec(v2.as_pointer().decay() + __off) }; let mut i: i32 = 0; 'loop_: while (i < 4) { { let __off = >::from( - (v2.as_pointer() as Ptr>) - .decay() - .begin() - .iter_add(1_isize), + v2.as_pointer().decay().begin().iter_add(1_isize), ) .index(); - (v2.as_pointer() as Ptr>).with_mut(|__v: &mut Vec| __v.remove(__off)); - RandomAccessIterator::Vec((v2.as_pointer() as Ptr>).decay() + __off) + v2.as_pointer() + .with_mut(|__v: &mut Vec| __v.remove(__off)); + RandomAccessIterator::Vec(v2.as_pointer().decay() + __off) }; i.prefix_inc(); } @@ -236,9 +207,9 @@ fn main_0() -> i32 { ); i.prefix_inc(); } - let mut p1: Ptr = (v6.as_pointer() as Ptr>).decay(); + let mut p1: Ptr = v6.as_pointer().decay(); assert!(((p1.read()) == 2_f64)); - let mut p2: Ptr = (v3.as_pointer() as Ptr>).decay(); + let mut p2: Ptr = v3.as_pointer().decay(); assert!(((p2.read()) == 1)); assert!(({ (*v3.borrow())[0_usize] } == 1)); assert!(({ (*v3.borrow())[1_usize] } == 1)); @@ -276,78 +247,65 @@ fn main_0() -> i32 { }; assert!(((*v3.borrow()).capacity() == 201_usize)); assert!(((*v3.borrow()).len() == 100_usize)); - assert!((((v2.as_pointer() as Ptr>).decay().to_last().read()) == 3)); - assert!((((v3.as_pointer() as Ptr>).decay().to_last().read()) == 1)); - assert!( - ((v4.as_pointer() as Ptr>>) - .decay() - .to_last() - .read()) - .is_null() - ); - assert!( - ((v5.as_pointer() as Ptr>>) - .decay() - .to_last() - .read()) - .is_null() - ); - assert!((((v6.as_pointer() as Ptr>).decay().to_last().read()) == 2_f64)); - let ref0: Ptr = (v6.as_pointer() as Ptr>).decay().to_last(); + assert!(((v2.as_pointer().decay().to_last().read()) == 3)); + assert!(((v3.as_pointer().decay().to_last().read()) == 1)); + assert!((v4.as_pointer().decay().to_last().read()).is_null()); + assert!((v5.as_pointer().decay().to_last().read()).is_null()); + assert!(((v6.as_pointer().decay().to_last().read()) == 2_f64)); + let ref0: Ptr = v6.as_pointer().decay().to_last(); ref0.write(5_f64); - assert!((((v6.as_pointer() as Ptr>).decay().to_last().read()) == 5_f64)); - let mut x0: f64 = ((v6.as_pointer() as Ptr>).decay().to_last().read()); + assert!(((v6.as_pointer().decay().to_last().read()) == 5_f64)); + let mut x0: f64 = (v6.as_pointer().decay().to_last().read()); assert!((x0 == 5_f64)); x0 = 6_f64; - assert!((((v6.as_pointer() as Ptr>).decay().to_last().read()) == 5_f64)); + assert!(((v6.as_pointer().decay().to_last().read()) == 5_f64)); let mut idx: i32 = 0; assert!( - (((v6.as_pointer() as Ptr>) + ((v6.as_pointer() .decay() .offset((idx as usize) as isize) .read()) == 2_f64) ); assert!( - (((v6.as_pointer() as Ptr>) + ((v6.as_pointer() .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()) == 5_f64) ); - let ref1: Ptr = (v6.as_pointer() as Ptr>) + let ref1: Ptr = v6 + .as_pointer() .decay() .offset((s2).wrapping_sub(1_usize) as isize); { ref1.with_mut(|__v| *__v = *__v + 1.5_f64) }; assert!( - (((v6.as_pointer() as Ptr>) + ((v6.as_pointer() .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()) == 6.5_f64) ); - let mut x1: f64 = ((v6.as_pointer() as Ptr>) + let mut x1: f64 = (v6 + .as_pointer() .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()); assert!((x1 == 6.5_f64)); x1 -= 1.5_f64; assert!( - (((v6.as_pointer() as Ptr>) + ((v6.as_pointer() .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()) == 6.5_f64) ); assert!( - (((s1).wrapping_add(s2)).wrapping_add( - (((v2.as_pointer() as Ptr>) - .decay() - .offset(0_usize as isize) - .read()) as usize) - ) == 103_usize) + (((s1).wrapping_add(s2)) + .wrapping_add(((v2.as_pointer().decay().offset(0_usize as isize).read()) as usize)) + == 103_usize) ); let a: Value = Rc::new(RefCell::new(S { x: 1 })); let pa: Value> = Rc::new(RefCell::new((a.as_pointer()))); diff --git a/tests/unit/out/refcount/vector2.rs b/tests/unit/out/refcount/vector2.rs index 208b4465d..d1f430268 100644 --- a/tests/unit/out/refcount/vector2.rs +++ b/tests/unit/out/refcount/vector2.rs @@ -30,21 +30,21 @@ pub fn fn_0(v: Ptr>, v3: Vec) { x = (index!(v, 2_usize).read()); (*v2.borrow_mut())[0_usize] = 1; elem!( - ((if true { + (if true { (Ptr::>::decay(&(v3.as_pointer()))) } else { (Ptr::>::decay(&(v))) - }) as Ptr), + }), 0_usize ) .write(7); - (v2.as_pointer() as Ptr>).write((*v.upgrade().deref()).clone()); + v2.as_pointer().write((*v.upgrade().deref()).clone()); index!(v4, 1_usize).write(13); assert!((x == 6)); - assert!(((((v).clone() as Ptr>).decay().read()) == 4)); + assert!((((v).clone().decay().read()) == 4)); assert!(((index!(v, 1_usize).read()) == 5)); assert!(((index!(v, 2_usize).read()) == 6)); - assert!(((((v).clone() as Ptr>).decay().to_last().read()) == 20)); + assert!((((v).clone().decay().to_last().read()) == 20)); assert!(({ (*v2.borrow())[0_usize] } == 4)); assert!(({ (*v2.borrow())[1_usize] } == 5)); assert!(({ (*v2.borrow())[2_usize] } == 6)); diff --git a/tests/unit/out/refcount/vector3.rs b/tests/unit/out/refcount/vector3.rs index ae30e3550..e20d9a2a8 100644 --- a/tests/unit/out/refcount/vector3.rs +++ b/tests/unit/out/refcount/vector3.rs @@ -18,52 +18,37 @@ fn main_0() -> i32 { }; { let __a0 = 2_usize as usize; - elem!((v.as_pointer() as Ptr>), 0_usize) + elem!(v.as_pointer().decay(), 0_usize) .with_mut(|__v: &mut Vec| __v.resize_with(__a0, || ::default())) }; { let __a0 = 1_usize as usize; - elem!((v.as_pointer() as Ptr>), 1_usize) + elem!(v.as_pointer().decay(), 1_usize) .with_mut(|__v: &mut Vec| __v.resize_with(__a0, || ::default())) }; - index!(elem!((v.as_pointer() as Ptr>), 0_usize), 0_usize).write(1); - index!(elem!((v.as_pointer() as Ptr>), 0_usize), 1_usize).write(5); - index!(elem!((v.as_pointer() as Ptr>), 1_usize), 0_usize).write(6); - 'loop_: for v2 in IterRange::new( - (v.as_pointer() as Ptr>>).decay().begin(), - (v.as_pointer() as Ptr>>).decay().end(), - ) { + index!(elem!(v.as_pointer().decay(), 0_usize), 0_usize).write(1); + index!(elem!(v.as_pointer().decay(), 0_usize), 1_usize).write(5); + index!(elem!(v.as_pointer().decay(), 1_usize), 0_usize).write(6); + 'loop_: for v2 in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) { let v2: Ptr> = v2.iter_deref(); - 'loop_: for i in IterRange::new( - ((v2).clone() as Ptr>).decay().begin(), - ((v2).clone() as Ptr>).decay().end(), - ) { + 'loop_: for i in IterRange::new((v2).clone().decay().begin(), (v2).clone().decay().end()) { let i: Ptr = i.iter_deref(); i.with_mut(|__v| __v.prefix_inc()); } } - 'loop_: for v2 in IterRange::new( - (v.as_pointer() as Ptr>>).decay().begin(), - (v.as_pointer() as Ptr>>).decay().end(), - ) { + 'loop_: for v2 in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) { let v2: Ptr> = v2.iter_deref(); - 'loop_: for i in IterRange::new( - ((v2).clone() as Ptr>).decay().begin(), - ((v2).clone() as Ptr>).decay().end(), - ) { + 'loop_: for i in IterRange::new((v2).clone().decay().begin(), (v2).clone().decay().end()) { let mut i: i32 = (i.iter_deref().read()); println!("{}", (i + 3)); } } - 'loop_: for v2 in IterRange::new( - (v.as_pointer() as Ptr>>).decay().begin(), - (v.as_pointer() as Ptr>>).decay().end(), - ) { + 'loop_: for v2 in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) { let v2: Value> = Rc::new(RefCell::new((*v2.iter_deref().upgrade().deref()).clone())); 'loop_: for i in IterRange::new( - (v2.as_pointer() as Ptr>).decay().begin(), - (v2.as_pointer() as Ptr>).decay().end(), + v2.as_pointer().decay().begin(), + v2.as_pointer().decay().end(), ) { let mut i: i32 = (i.iter_deref().read()); println!("{}", i); diff --git a/tests/unit/out/refcount/vector_addr_of_back.rs b/tests/unit/out/refcount/vector_addr_of_back.rs index 850298298..f43a4b604 100644 --- a/tests/unit/out/refcount/vector_addr_of_back.rs +++ b/tests/unit/out/refcount/vector_addr_of_back.rs @@ -17,10 +17,10 @@ fn main_0() -> i32 { let a0_clone = inner.clone(); (*outer.borrow_mut()).push(a0_clone) }; - let mut sink: Ptr> = ((outer.as_pointer() as Ptr>>).decay().to_last()); + let mut sink: Ptr> = (outer.as_pointer().decay().to_last()); assert!(((*sink.upgrade().deref()).len() == 0_usize)); let mut p: Ptr>> = (outer.as_pointer()); - sink = (((p).clone() as Ptr>>).decay().to_last()); + sink = ((p).clone().decay().to_last()); assert!(((*sink.upgrade().deref()).len() == 0_usize)); return 0; } diff --git a/tests/unit/out/refcount/vector_deque_vector_string.rs b/tests/unit/out/refcount/vector_deque_vector_string.rs index 1257e7cbe..1bb035d48 100644 --- a/tests/unit/out/refcount/vector_deque_vector_string.rs +++ b/tests/unit/out/refcount/vector_deque_vector_string.rs @@ -37,7 +37,7 @@ fn main_0() -> i32 { }; (*row.borrow_mut()).push(__a1) }; - elem!((v.as_pointer() as Ptr>>>), 0_usize) + elem!(v.as_pointer().decay(), 0_usize) .with_mut(|__v: &mut Vec>>| __v.push((*row.borrow()).clone())); { let __a1 = { @@ -47,23 +47,20 @@ fn main_0() -> i32 { }; (*row.borrow_mut()).push(__a1) }; - elem!((v.as_pointer() as Ptr>>>), 1_usize) + elem!(v.as_pointer().decay(), 1_usize) .with_mut(|__v: &mut Vec>>| __v.push((*row.borrow()).clone())); { let __init = Vec::new(); - elem!((v.as_pointer() as Ptr>>>), 1_usize) + elem!(v.as_pointer().decay(), 1_usize) .with_mut(|__v: &mut Vec>>| __v.push(__init)) }; { let __a1 = { - let mut r = (*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>>) - .decay()), - ) as Ptr>) - .offset(1_usize) - .as_pointer() as Ptr>) + let mut r = (*(Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).as_pointer().decay()), + ) + .offset(1_usize) + .as_pointer() as Ptr>) .upgrade() .deref()) .clone(); @@ -72,17 +69,19 @@ fn main_0() -> i32 { r.push(0); r }; - ((v.as_pointer() as Ptr>>>) + v.as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr>>>) + .as_pointer() .decay() .to_last() .with_mut(|__v: &mut Vec>| __v.push(__a1)) }; assert!( - ((*((v.as_pointer() as Ptr>>>) + ((*v.as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr>>>) + .as_pointer() .decay() .upgrade() .deref()) @@ -90,32 +89,27 @@ fn main_0() -> i32 { == 2_usize) ); assert!( - ((*((v.as_pointer() as Ptr>>>) + ((*v.as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr>>>) + .as_pointer() .decay() .upgrade() .deref()) .len() == 3_usize) && (Ptr::::from_string_literal(b"def").with_c_str(|__s| { - (*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>>) - .decay()), - ) as Ptr>) - .offset(2_usize) - .as_pointer() as Ptr>) + (*(Ptr::>>::decay( + &(v.as_pointer().decay().offset(1_usize).as_pointer().decay()), + ) + .offset(2_usize) + .as_pointer() as Ptr>) .upgrade() - .deref())[..(*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>>) - .decay()), - ) as Ptr>) - .offset(2_usize) - .as_pointer() as Ptr>) + .deref())[..(*(Ptr::>>::decay( + &(v.as_pointer().decay().offset(1_usize).as_pointer().decay()), + ) + .offset(2_usize) + .as_pointer() as Ptr>) .upgrade() .deref()) .len() @@ -124,25 +118,27 @@ fn main_0() -> i32 { })) ); assert!(Ptr::::from_string_literal(b"bcx").with_c_str(|__s| { - (*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) + (*(Ptr::>>::decay( + &(v.as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr>>>) + .as_pointer() .decay() .to_last()), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) + ) + .offset(0_usize) + .as_pointer() as Ptr>) .upgrade() - .deref())[..(*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) + .deref())[..(*(Ptr::>>::decay( + &(v.as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr>>>) + .as_pointer() .decay() .to_last()), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) + ) + .offset(0_usize) + .as_pointer() as Ptr>) .upgrade() .deref()) .len() @@ -150,89 +146,81 @@ fn main_0() -> i32 { == *__s })); let copy: Value>>>> = Rc::new(RefCell::new((*v.borrow()).clone())); - ((Ptr::>>::decay( - &(((copy.as_pointer() as Ptr>>>) + Ptr::>>::decay( + &(copy + .as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr>>>) + .as_pointer() .decay()), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .write({ - let mut __bytes = Ptr::::from_string_literal(b"z").to_c_bytes(); - __bytes.push(0); - __bytes - }); + ) + .offset(0_usize) + .as_pointer() + .write({ + let mut __bytes = Ptr::::from_string_literal(b"z").to_c_bytes(); + __bytes.push(0); + __bytes + }); if 0_usize as usize - >= (*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>>) - .decay()), - ) as Ptr>) - .offset(1_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + >= (*Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).as_pointer().decay()), + ) + .offset(1_usize) + .as_pointer() + .upgrade() + .deref()) .len() .saturating_sub(1) { panic!("out of bounds access") } else { - ((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>>) - .decay()), - ) as Ptr>) + Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).as_pointer().decay())) .offset(1_usize) - .as_pointer() as Ptr>) + .as_pointer() .decay() .offset(0_usize as isize) } .write(('B' as i8)); assert!( - (Ptr::::from_string_literal(b"a").with_c_str(|__s| (*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>>) - .decay()) - ) as Ptr>) - .offset(0_usize) - .as_pointer() + (Ptr::::from_string_literal(b"a").with_c_str(|__s| (*(Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).as_pointer().decay()) + ) + .offset(0_usize) + .as_pointer() as Ptr>) .upgrade() - .deref())[..(*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>>) - .decay()) - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) + .deref())[..(*(Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).as_pointer().decay()) + ) + .offset(0_usize) + .as_pointer() as Ptr>) .upgrade() .deref()) .len() .saturating_sub(1)] == *__s)) && (Ptr::::from_string_literal(b"z").with_c_str(|__s| { - (*((Ptr::>>::decay( - &(((copy.as_pointer() as Ptr>>>) + (*(Ptr::>>::decay( + &(copy + .as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr>>>) + .as_pointer() .decay()), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) + ) + .offset(0_usize) + .as_pointer() as Ptr>) .upgrade() - .deref())[..(*((Ptr::>>::decay( - &(((copy.as_pointer() as Ptr>>>) + .deref())[..(*(Ptr::>>::decay( + &(copy + .as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr>>>) + .as_pointer() .decay()), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) + ) + .offset(0_usize) + .as_pointer() as Ptr>) .upgrade() .deref()) .len() @@ -241,47 +229,45 @@ fn main_0() -> i32 { })) ); assert!( - (Ptr::::from_string_literal(b"Bc").with_c_str(|__s| (*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>>) - .decay()) - ) as Ptr>) - .offset(1_usize) - .as_pointer() + (Ptr::::from_string_literal(b"Bc").with_c_str(|__s| (*(Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).as_pointer().decay()) + ) + .offset(1_usize) + .as_pointer() as Ptr>) .upgrade() - .deref())[..(*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>>) - .decay()) - ) as Ptr>) - .offset(1_usize) - .as_pointer() as Ptr>) + .deref())[..(*(Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).as_pointer().decay()) + ) + .offset(1_usize) + .as_pointer() as Ptr>) .upgrade() .deref()) .len() .saturating_sub(1)] == *__s)) && (Ptr::::from_string_literal(b"bc").with_c_str(|__s| { - (*((Ptr::>>::decay( - &(((copy.as_pointer() as Ptr>>>) + (*(Ptr::>>::decay( + &(copy + .as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr>>>) + .as_pointer() .decay()), - ) as Ptr>) - .offset(1_usize) - .as_pointer() as Ptr>) + ) + .offset(1_usize) + .as_pointer() as Ptr>) .upgrade() - .deref())[..(*((Ptr::>>::decay( - &(((copy.as_pointer() as Ptr>>>) + .deref())[..(*(Ptr::>>::decay( + &(copy + .as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr>>>) + .as_pointer() .decay()), - ) as Ptr>) - .offset(1_usize) - .as_pointer() as Ptr>) + ) + .offset(1_usize) + .as_pointer() as Ptr>) .upgrade() .deref()) .len() @@ -289,26 +275,19 @@ fn main_0() -> i32 { == *__s })) ); - elem!((v.as_pointer() as Ptr>>>), 1_usize) - .with_mut(|__v: &mut Vec>>| __v.remove(0)); + elem!(v.as_pointer().decay(), 1_usize).with_mut(|__v: &mut Vec>>| __v.remove(0)); assert!(Ptr::::from_string_literal(b"bcx").with_c_str(|__s| { - (*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>>) - .decay()), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) + (*(Ptr::>>::decay( + &(v.as_pointer().decay().offset(1_usize).as_pointer().decay()), + ) + .offset(0_usize) + .as_pointer() as Ptr>) .upgrade() - .deref())[..(*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>>) - .decay()), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) + .deref())[..(*(Ptr::>>::decay( + &(v.as_pointer().decay().offset(1_usize).as_pointer().decay()), + ) + .offset(0_usize) + .as_pointer() as Ptr>) .upgrade() .deref()) .len() @@ -316,9 +295,11 @@ fn main_0() -> i32 { == *__s })); assert!( - ((*((copy.as_pointer() as Ptr>>>) + ((*copy + .as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr>>>) + .as_pointer() .decay() .upgrade() .deref()) diff --git a/tests/unit/out/refcount/vector_iter_range_ctor.rs b/tests/unit/out/refcount/vector_iter_range_ctor.rs index c25155822..b0a7a829c 100644 --- a/tests/unit/out/refcount/vector_iter_range_ctor.rs +++ b/tests/unit/out/refcount/vector_iter_range_ctor.rs @@ -73,7 +73,7 @@ fn main_0() -> i32 { assert!((v5.len() == 5_usize)); assert!(((v5[0_usize] as i32) == 10) && ((v5[4_usize] as i32) == 50)); let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -86,7 +86,7 @@ fn main_0() -> i32 { .as_pointer() }) .write(10); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -99,7 +99,7 @@ fn main_0() -> i32 { .as_pointer() }) .write(20); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(3.clone(), || { ( @@ -114,10 +114,11 @@ fn main_0() -> i32 { .write(30); let v6: Value, Value)>> = Rc::new(RefCell::new({ let mut __v = Vec::new(); - let mut __it = (m.as_pointer() as Ptr, Value)>>) + let mut __it = m + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()); while __it - != (m.as_pointer() as Ptr, Value)>>) + != m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) { __v.push( @@ -140,30 +141,25 @@ fn main_0() -> i32 { ); { let start_idx = , Value)>>::from( - (v6.as_pointer() as Ptr, Value)>>) - .decay() - .begin() - .iter_add(1_isize), + v6.as_pointer().decay().begin().iter_add(1_isize), ) .index(); let mut temp_vec: Vec<(Value, Value)> = Vec::new(); - let mut __it = (m.as_pointer() as Ptr, Value)>>) + let mut __it = m + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()); while __it - != (m.as_pointer() as Ptr, Value)>>) + != m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) { temp_vec.push(__it.iter_deref().read()); __it.iter_inc(); } - (v6.as_pointer() as Ptr, Value)>>).with_mut( - |v: &mut Vec<(Value, Value)>| { + v6.as_pointer() + .with_mut(|v: &mut Vec<(Value, Value)>| { v.splice(start_idx..start_idx, temp_vec); - }, - ); - RandomAccessIterator::Vec( - (v6.as_pointer() as Ptr, Value)>>).decay() + start_idx, - ) + }); + RandomAccessIterator::Vec(v6.as_pointer().decay() + start_idx) }; assert!(((*v6.borrow()).len() == 6_usize)); assert!( diff --git a/tests/unit/out/refcount/vector_subscript_borrow.rs b/tests/unit/out/refcount/vector_subscript_borrow.rs index b64d0e5ec..72499bfd6 100644 --- a/tests/unit/out/refcount/vector_subscript_borrow.rs +++ b/tests/unit/out/refcount/vector_subscript_borrow.rs @@ -38,22 +38,22 @@ fn main_0() -> i32 { items[2_usize].postfix_inc(); assert!(((items[0_usize] == 0_u32) && (items[1_usize] == 7_u32)) && (items[2_usize] == 5_u32)); elem!( - (v.as_pointer() as Ptr), + v.as_pointer().decay(), ({ (*v.borrow())[0_usize] } as usize) ) .write(3); let __rhs = ({ (*v.borrow())[1_usize] } + 4); elem!( - (v.as_pointer() as Ptr), + v.as_pointer().decay(), ({ (*v.borrow())[1_usize] } as usize) ) .write(__rhs); assert!(({ (*v.borrow())[1_usize] } == 3) && ({ (*v.borrow())[3_usize] } == 7)); - let mut p: Ptr = ((v.as_pointer() as Ptr).offset(0_usize)); - elem!((v.as_pointer() as Ptr), ((p.read()) as usize)).write(9); + let mut p: Ptr = (v.as_pointer().decay().offset(0_usize)); + elem!(v.as_pointer().decay(), ((p.read()) as usize)).write(9); assert!(({ (*v.borrow())[1_usize] } == 9)); elem!( - (v.as_pointer() as Ptr), + v.as_pointer().decay(), (({ bump_1((v.as_pointer()), 10,) }) as usize) ) .write(2); diff --git a/tests/unit/out/refcount/vector_subscript_direct.rs b/tests/unit/out/refcount/vector_subscript_direct.rs index a4429087c..3bb1e60cf 100644 --- a/tests/unit/out/refcount/vector_subscript_direct.rs +++ b/tests/unit/out/refcount/vector_subscript_direct.rs @@ -57,30 +57,30 @@ fn main_0() -> i32 { (*v.borrow_mut())[1_usize] = 0; assert!( ((elem!( - (v.as_pointer() as Ptr), + v.as_pointer().decay(), ({ (*v.borrow())[1_usize] } as usize) ) .read()) == 7) ); let mut i: i32 = 0; - elem!((v.as_pointer() as Ptr), (i.postfix_inc() as usize)).write(3); + elem!(v.as_pointer().decay(), (i.postfix_inc() as usize)).write(3); assert!((i == 1) && ({ (*v.borrow())[0_usize] } == 3)); assert!( ((elem!( - (v.as_pointer() as Ptr), + v.as_pointer().decay(), (({ push_and_index_0(v.as_pointer(),) }) as usize) ) .read()) == 42) ); elem!( - (v.as_pointer() as Ptr), + v.as_pointer().decay(), (({ push_and_index_0(v.as_pointer(),) }) as usize) ) .write(5); assert!(((*v.borrow()).len() == 5_usize) && ({ (*v.borrow())[4_usize] } == 5)); - let mut p: Ptr = ((v.as_pointer() as Ptr).offset(2_usize)); + let mut p: Ptr = (v.as_pointer().decay().offset(2_usize)); p.write(9); assert!(({ (*v.borrow())[2_usize] } == 9)); assert!((({ sum_ref_1(v.as_pointer(),) }) == ((((3 + 0) + 9) + 42) + 5))); @@ -101,7 +101,10 @@ fn main_0() -> i32 { assert!( (({ PointImpl::sum( - &(field_ref!(h.as_pointer(), points).as_pointer() as Ptr).offset(0_usize), + &field_ref!(h.as_pointer(), points) + .as_pointer() + .decay() + .offset(0_usize), ) }) == 6) ); @@ -126,60 +129,21 @@ fn main_0() -> i32 { let __a1 = vec![0; 3_usize as usize]; (*grid.borrow_mut()).push(__a1) }; - index!( - elem!((grid.as_pointer() as Ptr>), 1_usize), - 2_usize - ) - .write(8); + index!(elem!(grid.as_pointer().decay(), 1_usize), 2_usize).write(8); assert!( - ((index!( - elem!((grid.as_pointer() as Ptr>), 1_usize), - 2_usize - ) - .read()) - == 8) - && ((index!( - elem!((grid.as_pointer() as Ptr>), 0_usize), - 2_usize - ) - .read()) - == 0) + ((index!(elem!(grid.as_pointer().decay(), 1_usize), 2_usize).read()) == 8) + && ((index!(elem!(grid.as_pointer().decay(), 0_usize), 2_usize).read()) == 0) ); - let __rhs = (index!( - elem!((grid.as_pointer() as Ptr>), 1_usize), - 2_usize - ) - .read()); - index!( - elem!((grid.as_pointer() as Ptr>), 0_usize), - 1_usize - ) - .write(__rhs); - let __rhs = (index!( - elem!((grid.as_pointer() as Ptr>), 0_usize), - 1_usize - ) - .read()); + let __rhs = (index!(elem!(grid.as_pointer().decay(), 1_usize), 2_usize).read()); + index!(elem!(grid.as_pointer().decay(), 0_usize), 1_usize).write(__rhs); + let __rhs = (index!(elem!(grid.as_pointer().decay(), 0_usize), 1_usize).read()); { - index!( - elem!((grid.as_pointer() as Ptr>), 1_usize), - 0_usize - ) - .with_mut(|__v| *__v = *__v + __rhs) + index!(elem!(grid.as_pointer().decay(), 1_usize), 0_usize) + .with_mut(|__v| *__v = *__v + __rhs) }; assert!( - ((index!( - elem!((grid.as_pointer() as Ptr>), 0_usize), - 1_usize - ) - .read()) - == 8) - && ((index!( - elem!((grid.as_pointer() as Ptr>), 1_usize), - 0_usize - ) - .read()) - == 8) + ((index!(elem!(grid.as_pointer().decay(), 0_usize), 1_usize).read()) == 8) + && ((index!(elem!(grid.as_pointer().decay(), 1_usize), 0_usize).read()) == 8) ); let a: Value> = Rc::new(RefCell::new(Vec::from([4, 5, 6]))); let __rhs = ({ (*a.borrow())[0_usize] } + { (*a.borrow())[2_usize] }); diff --git a/tests/unit/out/refcount/vector_with_allocator.rs b/tests/unit/out/refcount/vector_with_allocator.rs index 9fa53a67a..1939bb3b5 100644 --- a/tests/unit/out/refcount/vector_with_allocator.rs +++ b/tests/unit/out/refcount/vector_with_allocator.rs @@ -37,20 +37,20 @@ pub fn fn_1(v: Ptr>, v3: Vec) { x = (index!(v, 2_usize).read()); v2[0_usize] = 1; elem!( - ((if true { + (if true { (Ptr::>::decay(&(v3.as_pointer()))) } else { (Ptr::>::decay(&(v))) - }) as Ptr), + }), 0_usize ) .write(7); index!(v4, 1_usize).write(13); assert!((x == 6)); - assert!(((((v).clone() as Ptr>).decay().read()) == 4)); + assert!((((v).clone().decay().read()) == 4)); assert!(((index!(v, 1_usize).read()) == 5)); assert!(((index!(v, 2_usize).read()) == 6)); - assert!(((((v).clone() as Ptr>).decay().to_last().read()) == 20)); + assert!((((v).clone().decay().to_last().read()) == 20)); assert!(({ (*v3.borrow())[0_usize] } == 7)); assert!(({ (*v3.borrow())[1_usize] } == 13)); { @@ -100,21 +100,18 @@ fn main_0() -> i32 { }; assert!(((*v2.borrow()).len() == 3_usize)); { - let __off = - >::from((v2.as_pointer() as Ptr>).decay().begin()) - .index(); - (v2.as_pointer() as Ptr>).with_mut(|__v: &mut Vec| __v.remove(__off)); - RandomAccessIterator::Vec((v2.as_pointer() as Ptr>).decay() + __off) + let __off = >::from(v2.as_pointer().decay().begin()).index(); + v2.as_pointer() + .with_mut(|__v: &mut Vec| __v.remove(__off)); + RandomAccessIterator::Vec(v2.as_pointer().decay() + __off) }; assert!(((*v2.borrow()).len() == 2_usize)); assert!(({ (*v2.borrow())[0_usize] } == 2)); assert!(({ (*v2.borrow())[1_usize] } == 3)); { - let __off = - >::from((v2.as_pointer() as Ptr>).decay().begin()) - .index(); + let __off = >::from(v2.as_pointer().decay().begin()).index(); (*v2.borrow_mut()).insert(__off, 100); - >::from((v2.as_pointer() as Ptr>).decay().begin()) + >::from(v2.as_pointer().decay().begin()) }; ({ copy_0((*v2.borrow()).clone()) }); assert!(((*v2.borrow()).len() == 3_usize)); @@ -136,9 +133,9 @@ fn main_0() -> i32 { assert!(({ (*v6.borrow())[(i as usize)] } == 2_f64)); i.prefix_inc(); } - let mut p1: Ptr = (v6.as_pointer() as Ptr>).decay(); + let mut p1: Ptr = v6.as_pointer().decay(); assert!(((p1.read()) == 2_f64)); - let mut p2: Ptr = (v3.as_pointer() as Ptr>).decay(); + let mut p2: Ptr = v3.as_pointer().decay(); assert!(((p2.read()) == 1)); assert!(({ (*v3.borrow())[0_usize] } == 1)); assert!(({ (*v3.borrow())[1_usize] } == 1)); @@ -176,52 +173,54 @@ fn main_0() -> i32 { }; assert!(((*v3.borrow()).capacity() == 201_usize)); assert!(((*v3.borrow()).len() == 100_usize)); - assert!((((v2.as_pointer() as Ptr>).decay().to_last().read()) == 3)); - assert!((((v3.as_pointer() as Ptr>).decay().to_last().read()) == 1)); - assert!((((v6.as_pointer() as Ptr>).decay().to_last().read()) == 2_f64)); - let ref0: Ptr = (v6.as_pointer() as Ptr>).decay().to_last(); + assert!(((v2.as_pointer().decay().to_last().read()) == 3)); + assert!(((v3.as_pointer().decay().to_last().read()) == 1)); + assert!(((v6.as_pointer().decay().to_last().read()) == 2_f64)); + let ref0: Ptr = v6.as_pointer().decay().to_last(); ref0.write(5_f64); - assert!((((v6.as_pointer() as Ptr>).decay().to_last().read()) == 5_f64)); - let mut x0: f64 = ((v6.as_pointer() as Ptr>).decay().to_last().read()); + assert!(((v6.as_pointer().decay().to_last().read()) == 5_f64)); + let mut x0: f64 = (v6.as_pointer().decay().to_last().read()); assert!((x0 == 5_f64)); x0 = 6_f64; - assert!((((v6.as_pointer() as Ptr>).decay().to_last().read()) == 5_f64)); + assert!(((v6.as_pointer().decay().to_last().read()) == 5_f64)); let mut idx: i32 = 0; assert!( - (((v6.as_pointer() as Ptr>) + ((v6.as_pointer() .decay() .offset((idx as usize) as isize) .read()) == 2_f64) ); assert!( - (((v6.as_pointer() as Ptr>) + ((v6.as_pointer() .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()) == 5_f64) ); - let ref1: Ptr = (v6.as_pointer() as Ptr>) + let ref1: Ptr = v6 + .as_pointer() .decay() .offset((s2).wrapping_sub(1_usize) as isize); { ref1.with_mut(|__v| *__v = *__v + 1.5_f64) }; assert!( - (((v6.as_pointer() as Ptr>) + ((v6.as_pointer() .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()) == 6.5_f64) ); - let mut x1: f64 = ((v6.as_pointer() as Ptr>) + let mut x1: f64 = (v6 + .as_pointer() .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()); assert!((x1 == 6.5_f64)); x1 -= 1.5_f64; assert!( - (((v6.as_pointer() as Ptr>) + ((v6.as_pointer() .decay() .offset((s2).wrapping_sub(1_usize) as isize) .read()) @@ -312,12 +311,9 @@ fn main_0() -> i32 { assert!((v13.len() == 5_usize)); assert!(((v13[0_usize] as i32) == 10) && ((v13[4_usize] as i32) == 50)); assert!( - (((s1).wrapping_add(s2)).wrapping_add( - (((v2.as_pointer() as Ptr>) - .decay() - .offset(0_usize as isize) - .read()) as usize) - ) == 103_usize) + (((s1).wrapping_add(s2)) + .wrapping_add(((v2.as_pointer().decay().offset(0_usize as isize).read()) as usize)) + == 103_usize) ); return 0; } diff --git a/tests/unit/out/refcount/void_cast.rs b/tests/unit/out/refcount/void_cast.rs index 96d41f5b1..42236d076 100644 --- a/tests/unit/out/refcount/void_cast.rs +++ b/tests/unit/out/refcount/void_cast.rs @@ -130,7 +130,7 @@ pub trait NonCopyableImpl { } impl NonCopyableImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), value) as Ptr>>) + field_ptr!((*self), value) .write(field!(_a0, value).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/void_return.rs b/tests/unit/out/refcount/void_return.rs index f755ba78c..9328709cb 100644 --- a/tests/unit/out/refcount/void_return.rs +++ b/tests/unit/out/refcount/void_return.rs @@ -58,8 +58,8 @@ pub fn main() { fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::from([1, 3, 0, 2, 8, 7]))); ({ - let _first: RandomAccessIterator = (v.as_pointer() as Ptr>).decay().begin(); - let _last: RandomAccessIterator = (v.as_pointer() as Ptr>).decay().end(); + let _first: RandomAccessIterator = v.as_pointer().decay().begin(); + let _last: RandomAccessIterator = v.as_pointer().decay().end(); f1_0(_first, _last) }); let a: Value> = Rc::new(RefCell::new(Box::new([1, 2, 3]))); From c2c8bfec6bd67ad0ba07ee1e4dad507b3c6bee0f Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 13:54:19 +0100 Subject: [PATCH 04/62] Drop unneeded casts on ptr --- cpp2rust/converter/converter.cpp | 7 ++- cpp2rust/converter/converter.h | 3 ++ .../converter/models/converter_refcount.cpp | 47 ++++++++++--------- .../converter/models/converter_refcount.h | 5 ++ 4 files changed, 40 insertions(+), 22 deletions(-) diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index de802c205..b8f827436 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -223,6 +223,11 @@ std::string Converter::ConvertFreshObject(clang::Expr *expr) { return ConvertFreshPointer(expr); } +std::string Converter::ConvertPointerReceiver(clang::Expr *arg, + std::string_view param_type) { + return std::format("({} as {})", ConvertFreshObject(arg), param_type); +} + std::string Converter::ConvertLValue(clang::Expr *expr) { PushExprKind push(*this, ExprKind::LValue); return ToString(expr); @@ -5125,7 +5130,7 @@ std::string Converter::ConvertPlaceholder(clang::Expr *expr, clang::Expr *arg, if (ph_ctx.needs_pointer_receiver()) { auto param_type = Mapper::GetParamType(*this, expr, ph_ctx.arg_idx); - return std::format("({} as {})", ConvertFreshObject(arg), param_type); + return ConvertPointerReceiver(arg, param_type); } if (ph_ctx.needs_object_receiver()) { diff --git a/cpp2rust/converter/converter.h b/cpp2rust/converter/converter.h index 0a3afdfc7..2787bd7bf 100644 --- a/cpp2rust/converter/converter.h +++ b/cpp2rust/converter/converter.h @@ -1077,6 +1077,9 @@ class Converter : public clang::RecursiveASTVisitor { ConvertFreshPointer(clang::Expr *expr, std::optional implicit_convert_to = {}); virtual std::string ConvertFreshObject(clang::Expr *expr); + + virtual std::string ConvertPointerReceiver(clang::Expr *arg, + std::string_view param_type); std::string ConvertPointer(clang::Expr *expr, std::optional implicit_convert_to = {}, diff --git a/cpp2rust/converter/models/converter_refcount.cpp b/cpp2rust/converter/models/converter_refcount.cpp index 96d7d7891..0315b3293 100644 --- a/cpp2rust/converter/models/converter_refcount.cpp +++ b/cpp2rust/converter/models/converter_refcount.cpp @@ -392,6 +392,18 @@ std::string ConverterRefCount::ConvertObject(clang::Expr *expr, return str; } +std::string ConverterRefCount::AsPointerMethod(clang::QualType type) const { + return isObject() && WantsElementPtr() && + type.getNonReferenceType()->isRecordType() + ? ".as_pointer().decay()" + : ".as_pointer()"; +} + +std::string ConverterRefCount::ConvertPointerReceiver(clang::Expr *arg, + std::string_view) { + return ConvertFreshObject(arg); +} + std::string ConverterRefCount::ConvertFreshObject(clang::Expr *expr) { auto str = ConvertObject(expr); if (isFresh()) { @@ -1047,11 +1059,12 @@ void ConverterRefCount::ConvertDeclRefValue(clang::Expr *expr, if (isAddrOf()) { if (is_global_value) { - StrCat(std::format("{}.with(|v| v.as_pointer())", std::move(str))); + StrCat(std::format("{}.with(|v| v{})", std::move(str), + AsPointerMethod(decl_t))); } else if (is_global_ptr) { StrCat(str); } else { - StrCat(str, ".as_pointer()"); + StrCat(str, AsPointerMethod(decl_t)); } computed_expr_type_ = ComputedExprType::FreshPointer; return; @@ -1328,7 +1341,7 @@ bool ConverterRefCount::VisitCallExpr(clang::CallExpr *expr) { if (isAddrOf() && !ty->isReferenceType() && !IsPointerType(ctx_, ty)) { PushConversionKind push(*this, ConversionKind::FullRefCount); - StrCat(BoxValue(std::move(str)), ".as_pointer()"); + StrCat(BoxValue(std::move(str)), AsPointerMethod(ty)); return false; } @@ -2065,7 +2078,7 @@ bool ConverterRefCount::VisitMemberExpr(clang::MemberExpr *expr) { if (member->getType()->isReferenceType()) { computed_expr_type_ = ComputedExprType::Pointer; } else { - StrCat(".as_pointer()"); + StrCat(AsPointerMethod(member->getType())); computed_expr_type_ = ComputedExprType::FreshPointer; } return false; @@ -2100,8 +2113,8 @@ void ConverterRefCount::ConvertInlineField(clang::MemberExpr *expr) { StrCat(std::format("array_field_ptr!({}, {})", ConvertRecordPtr(expr), name)); } else if (IsBoxedType(ctx_, type)) { - StrCat(std::format("field_ref!({}, {}).as_pointer()", - ConvertRecordPtr(expr), name)); + StrCat(std::format("field_ref!({}, {}){}", ConvertRecordPtr(expr), name, + AsPointerMethod(type))); } else { StrCat(std::format("field_ptr!({}, {})", ConvertRecordPtr(expr), name)); } @@ -2804,25 +2817,17 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr( StrCat(GetPointerDerefPrefix(expr->getType())); } - if (is_inner_boxed && !isObject()) { - StrCat('('); - } - PushConversionKind push(*this, ConversionKind::Unboxed); if (deref && !is_inner_boxed) { StrCat(ConvertElemPlace(expr->getArg(0), expr->getArg(1))); } else { - StrCat(std::format("({} as {}).offset({})", + StrCat(std::format("{}.offset({})", ConvertObject(expr->getArg(0), ObjectShape::Element), - ConvertPtrType(expr->getArg(0)->getType()), ConvertSubscriptIndex(expr->getArg(1)))); } if (is_inner_boxed) { - StrCat(".as_pointer()"); - if (!isObject()) { - StrCat(std::format("as Ptr<{}>)", ToString(expr->getType()))); - } + StrCat(".decay()"); } if (isAddrOf()) { @@ -2881,10 +2886,9 @@ std::string ConverterRefCount::ConvertElemPlace(clang::Expr *container, return std::format("index!({}, {})", place, ConvertSubscriptIndex(idx)); } } - auto ptr = - std::format("({} as {})", ConvertObject(container, ObjectShape::Element), - ConvertPtrType(container->getType())); - return std::format("elem!({}, {})", ptr, ConvertSubscriptIndex(idx)); + return std::format("elem!({}, {})", + ConvertObject(container, ObjectShape::Element), + ConvertSubscriptIndex(idx)); } void ConverterRefCount::ConvertFunctionParameters(clang::FunctionDecl *decl) { @@ -3384,7 +3388,8 @@ void ConverterRefCount::SetUFCSReceiver(clang::Expr *base, bool is_arrow, !IsReferenceType(base->IgnoreImplicit())) { PushConversionKind push(*this, ConversionKind::FullRefCount); ufcs_receiver_ = - token::kRef + BoxValue(ConvertRValue(base)) + ".as_pointer()"; + token::kRef + BoxValue(ConvertRValue(base)) + + AsPointerMethod(base->getType()); return; } ufcs_receiver_ = token::kRef + (base_is_pointer ? ConvertRValue(base) diff --git a/cpp2rust/converter/models/converter_refcount.h b/cpp2rust/converter/models/converter_refcount.h index 5fffcfefb..2c5716e76 100644 --- a/cpp2rust/converter/models/converter_refcount.h +++ b/cpp2rust/converter/models/converter_refcount.h @@ -394,6 +394,11 @@ class ConverterRefCount final : public Converter { std::string ConvertObject(clang::Expr *expr, ObjectShape shape = ObjectShape::Whole); std::string ConvertFreshObject(clang::Expr *expr) override; + + std::string ConvertPointerReceiver(clang::Expr *arg, + std::string_view param_type) override; + + std::string AsPointerMethod(clang::QualType type) const; bool WantsElementPtr() const { return object_shape_ == ObjectShape::Element; } std::string ConvertFresh(clang::Expr *expr, From 955cf952601233c024e82ed578e74a9c44b2f8f5 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 13:55:44 +0100 Subject: [PATCH 05/62] Delete AsPointer for Vec --- libcc2rs/src/field.rs | 21 --------------------- libcc2rs/src/rc.rs | 17 ----------------- 2 files changed, 38 deletions(-) diff --git a/libcc2rs/src/field.rs b/libcc2rs/src/field.rs index 260a8945c..efc04dd4d 100644 --- a/libcc2rs/src/field.rs +++ b/libcc2rs/src/field.rs @@ -442,27 +442,6 @@ where } } -impl AsPointer for FieldRef, G, M> -where - S: Record, - T: ByteRepr, - G: Fn(&S) -> &Vec + Copy + 'static, - M: Fn(&mut S) -> &mut Vec + Copy + 'static, -{ - #[inline] - fn as_pointer(&self) -> Ptr { - match &self.base.kind { - PtrKind::Field(_, _, FieldShape::Single) => self - .base - .field_ptr(self.get, self.get_mut, self.offset) - .decay(), - _ => self - .base - .elems_of(self.get, self.get_mut, (self.offset)(&S::OFFSETS), false), - } - } -} - // The sequence that `get` gives in the struct that `base` points to, which is // reached through `base`: a field, as a sequence of one element, or the // elements of an array or vector field. It is the parent of the pointers into diff --git a/libcc2rs/src/rc.rs b/libcc2rs/src/rc.rs index f0742fe5f..a38ac1a29 100644 --- a/libcc2rs/src/rc.rs +++ b/libcc2rs/src/rc.rs @@ -1402,16 +1402,6 @@ impl AsPointer for Option>>> { } } -impl AsPointer for Rc>> { - #[inline] - fn as_pointer(&self) -> Ptr { - Ptr { - offset: 0, - kind: PtrKind::StackVec(Rc::downgrade(self)), - } - } -} - impl AsPointer> for Ptr> { #[inline] fn as_pointer(&self) -> Ptr> { @@ -1419,13 +1409,6 @@ impl AsPointer> for Ptr> { } } -impl AsPointer for Ptr> { - #[inline] - fn as_pointer(&self) -> Ptr { - self.decay() - } -} - impl Ptr> { #[inline] pub fn decay(&self) -> Ptr { From 8b002b12ccbc49dd508a4558afab07fe4530c0e9 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 14:01:06 +0100 Subject: [PATCH 06/62] Fix decay --- .../converter/models/converter_refcount.cpp | 2 +- .../out/refcount/row_ptr_outlives_vector.rs | 7 +- tests/unit/out/refcount/clone_vs_move.rs | 20 +- .../unit/out/refcount/copy_move_defaulted.rs | 3 +- .../out/refcount/inline_container_fields.rs | 2 +- tests/unit/out/refcount/push_emplace_back.rs | 13 +- .../refcount/vector_deque_vector_string.rs | 202 ++++++------------ 7 files changed, 88 insertions(+), 161 deletions(-) diff --git a/cpp2rust/converter/models/converter_refcount.cpp b/cpp2rust/converter/models/converter_refcount.cpp index 0315b3293..5afe7c363 100644 --- a/cpp2rust/converter/models/converter_refcount.cpp +++ b/cpp2rust/converter/models/converter_refcount.cpp @@ -2826,7 +2826,7 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr( ConvertSubscriptIndex(expr->getArg(1)))); } - if (is_inner_boxed) { + if (is_inner_boxed && isObject() && WantsElementPtr()) { StrCat(".decay()"); } diff --git a/tests/ub/out/refcount/row_ptr_outlives_vector.rs b/tests/ub/out/refcount/row_ptr_outlives_vector.rs index 6c953df4c..84c1d725e 100644 --- a/tests/ub/out/refcount/row_ptr_outlives_vector.rs +++ b/tests/ub/out/refcount/row_ptr_outlives_vector.rs @@ -11,12 +11,7 @@ pub fn second_row_0() -> Ptr { Vec::from([1, 2, 3]), Vec::from([4, 5, 6]), ]))); - return rows - .as_pointer() - .decay() - .offset(1_usize) - .as_pointer() - .decay(); + return rows.as_pointer().decay().offset(1_usize).decay(); } pub fn main() { __cpp2rust_init_globals(); diff --git a/tests/unit/out/refcount/clone_vs_move.rs b/tests/unit/out/refcount/clone_vs_move.rs index b6ee1a62e..90888f52f 100644 --- a/tests/unit/out/refcount/clone_vs_move.rs +++ b/tests/unit/out/refcount/clone_vs_move.rs @@ -161,14 +161,20 @@ fn main_0() -> i32 { let mut i: i32 = 0; 'loop_: while (i < N) { assert!( - ((*(m1.as_pointer().decay().offset((i as usize)).as_pointer() as Ptr>) + ((*m1 + .as_pointer() + .decay() + .offset((i as usize)) .upgrade() .deref()) .len() == 10_usize) ); assert!( - ((*(m2.as_pointer().decay().offset((i as usize)).as_pointer() as Ptr>) + ((*m2 + .as_pointer() + .decay() + .offset((i as usize)) .upgrade() .deref()) .len() @@ -199,14 +205,20 @@ fn main_0() -> i32 { let mut i: i32 = 0; 'loop_: while (i < N) { assert!( - ((*(m1.as_pointer().decay().offset((i as usize)).as_pointer() as Ptr>) + ((*m1 + .as_pointer() + .decay() + .offset((i as usize)) .upgrade() .deref()) .len() == 10_usize) ); assert!( - ((*(m2.as_pointer().decay().offset((i as usize)).as_pointer() as Ptr>) + ((*m2 + .as_pointer() + .decay() + .offset((i as usize)) .upgrade() .deref()) .len() diff --git a/tests/unit/out/refcount/copy_move_defaulted.rs b/tests/unit/out/refcount/copy_move_defaulted.rs index 6bdaff3dc..2423c64aa 100644 --- a/tests/unit/out/refcount/copy_move_defaulted.rs +++ b/tests/unit/out/refcount/copy_move_defaulted.rs @@ -340,11 +340,10 @@ fn main_0() -> i32 { ); assert!( (((*r.borrow()).rows.len() == 1_usize) - && ((*(field_ref!(r.as_pointer(), rows) + && ((*field_ref!(r.as_pointer(), rows) .as_pointer() .decay() .offset(0_usize) - .as_pointer() as Ptr>) .upgrade() .deref()) .len() diff --git a/tests/unit/out/refcount/inline_container_fields.rs b/tests/unit/out/refcount/inline_container_fields.rs index 2d589974b..5474cbf60 100644 --- a/tests/unit/out/refcount/inline_container_fields.rs +++ b/tests/unit/out/refcount/inline_container_fields.rs @@ -184,7 +184,7 @@ fn main_0() -> i32 { .as_pointer() .decay() .offset(0_usize) - .as_pointer() + .decay() .offset(0_usize)); elem!(row, 2).write(9); assert!(((index!(vec_elem!(s.as_pointer(), rows, 0_usize), 2_usize).read()) == 9)); diff --git a/tests/unit/out/refcount/push_emplace_back.rs b/tests/unit/out/refcount/push_emplace_back.rs index 5e7c65300..13ac9e7bf 100644 --- a/tests/unit/out/refcount/push_emplace_back.rs +++ b/tests/unit/out/refcount/push_emplace_back.rs @@ -179,21 +179,15 @@ fn main_0() -> i32 { let vecs: Value>> = Rc::new(RefCell::new(Vec::new())); ({ push_param_0((vecs.as_pointer())) }); assert!(((*vecs.borrow()).len() == 1_usize)); - assert!( - (*(vecs.as_pointer().decay().offset(0_usize).as_pointer() as Ptr>) - .upgrade() - .deref()) - .is_empty() - ); + assert!((*vecs.as_pointer().decay().offset(0_usize).upgrade().deref()).is_empty()); let jpg: Value = Rc::new(RefCell::new(::default())); ({ push_local_from_field_1((jpg.as_pointer()), true) }); assert!(((*jpg.borrow()).com_data.len() == 1_usize)); assert!( - ((*(field_ref!(jpg.as_pointer(), com_data) + ((*field_ref!(jpg.as_pointer(), com_data) .as_pointer() .decay() .offset(0_usize) - .as_pointer() as Ptr>) .upgrade() .deref()) .len() @@ -221,11 +215,10 @@ fn main_0() -> i32 { ({ emplace_local_from_field_4((jpg.as_pointer()), false) }); assert!(((*jpg.borrow()).app_data.len() == 1_usize)); assert!( - ((*(field_ref!(jpg.as_pointer(), app_data) + ((*field_ref!(jpg.as_pointer(), app_data) .as_pointer() .decay() .offset(0_usize) - .as_pointer() as Ptr>) .upgrade() .deref()) .len() diff --git a/tests/unit/out/refcount/vector_deque_vector_string.rs b/tests/unit/out/refcount/vector_deque_vector_string.rs index 1bb035d48..334c682fe 100644 --- a/tests/unit/out/refcount/vector_deque_vector_string.rs +++ b/tests/unit/out/refcount/vector_deque_vector_string.rs @@ -56,14 +56,12 @@ fn main_0() -> i32 { }; { let __a1 = { - let mut r = (*(Ptr::>>::decay( - &(v.as_pointer().decay().offset(0_usize).as_pointer().decay()), - ) - .offset(1_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) - .clone(); + let mut r = + (*Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).decay())) + .offset(1_usize) + .upgrade() + .deref()) + .clone(); r.pop(); Ptr::::from_string_literal(b"x").with_c_str(|__s| r.extend_from_slice(__s)); r.push(0); @@ -72,7 +70,6 @@ fn main_0() -> i32 { v.as_pointer() .decay() .offset(1_usize) - .as_pointer() .decay() .to_last() .with_mut(|__v: &mut Vec>| __v.push(__a1)) @@ -81,7 +78,6 @@ fn main_0() -> i32 { ((*v.as_pointer() .decay() .offset(0_usize) - .as_pointer() .decay() .upgrade() .deref()) @@ -92,184 +88,121 @@ fn main_0() -> i32 { ((*v.as_pointer() .decay() .offset(1_usize) - .as_pointer() .decay() .upgrade() .deref()) .len() == 3_usize) && (Ptr::::from_string_literal(b"def").with_c_str(|__s| { - (*(Ptr::>>::decay( - &(v.as_pointer().decay().offset(1_usize).as_pointer().decay()), - ) - .offset(2_usize) - .as_pointer() as Ptr>) + (*Ptr::>>::decay(&(v.as_pointer().decay().offset(1_usize).decay())) + .offset(2_usize) .upgrade() - .deref())[..(*(Ptr::>>::decay( - &(v.as_pointer().decay().offset(1_usize).as_pointer().decay()), + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(1_usize).decay()), ) .offset(2_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s })) ); assert!(Ptr::::from_string_literal(b"bcx").with_c_str(|__s| { - (*(Ptr::>>::decay( - &(v.as_pointer() - .decay() - .offset(1_usize) - .as_pointer() - .decay() - .to_last()), - ) - .offset(0_usize) - .as_pointer() as Ptr>) + (*Ptr::>>::decay(&(v.as_pointer().decay().offset(1_usize).decay().to_last())) + .offset(0_usize) .upgrade() - .deref())[..(*(Ptr::>>::decay( - &(v.as_pointer() - .decay() - .offset(1_usize) - .as_pointer() - .decay() - .to_last()), + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(1_usize).decay().to_last()), ) .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s })); let copy: Value>>>> = Rc::new(RefCell::new((*v.borrow()).clone())); - Ptr::>>::decay( - &(copy - .as_pointer() - .decay() - .offset(0_usize) - .as_pointer() - .decay()), - ) - .offset(0_usize) - .as_pointer() - .write({ - let mut __bytes = Ptr::::from_string_literal(b"z").to_c_bytes(); - __bytes.push(0); - __bytes - }); + Ptr::>>::decay(&(copy.as_pointer().decay().offset(0_usize).decay())) + .offset(0_usize) + .write({ + let mut __bytes = Ptr::::from_string_literal(b"z").to_c_bytes(); + __bytes.push(0); + __bytes + }); if 0_usize as usize - >= (*Ptr::>>::decay( - &(v.as_pointer().decay().offset(0_usize).as_pointer().decay()), - ) - .offset(1_usize) - .as_pointer() - .upgrade() - .deref()) + >= (*Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).decay())) + .offset(1_usize) + .upgrade() + .deref()) .len() .saturating_sub(1) { panic!("out of bounds access") } else { - Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).as_pointer().decay())) + Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).decay())) .offset(1_usize) - .as_pointer() .decay() .offset(0_usize as isize) } .write(('B' as i8)); assert!( - (Ptr::::from_string_literal(b"a").with_c_str(|__s| (*(Ptr::>>::decay( - &(v.as_pointer().decay().offset(0_usize).as_pointer().decay()) + (Ptr::::from_string_literal(b"a").with_c_str(|__s| (*Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).decay()) ) .offset(0_usize) - .as_pointer() - as Ptr>) - .upgrade() - .deref())[..(*(Ptr::>>::decay( - &(v.as_pointer().decay().offset(0_usize).as_pointer().decay()) + .upgrade() + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).decay()) ) .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s)) - && (Ptr::::from_string_literal(b"z").with_c_str(|__s| { - (*(Ptr::>>::decay( - &(copy - .as_pointer() - .decay() - .offset(0_usize) - .as_pointer() - .decay()), + && (Ptr::::from_string_literal(b"z").with_c_str( + |__s| (*Ptr::>>::decay( + &(copy.as_pointer().decay().offset(0_usize).decay()) ) .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref())[..(*(Ptr::>>::decay( - &(copy - .as_pointer() - .decay() - .offset(0_usize) - .as_pointer() - .decay()), + .upgrade() + .deref())[..(*Ptr::>>::decay( + &(copy.as_pointer().decay().offset(0_usize).decay()) ) .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s - })) + )) ); assert!( - (Ptr::::from_string_literal(b"Bc").with_c_str(|__s| (*(Ptr::>>::decay( - &(v.as_pointer().decay().offset(0_usize).as_pointer().decay()) + (Ptr::::from_string_literal(b"Bc").with_c_str(|__s| (*Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).decay()) ) .offset(1_usize) - .as_pointer() - as Ptr>) - .upgrade() - .deref())[..(*(Ptr::>>::decay( - &(v.as_pointer().decay().offset(0_usize).as_pointer().decay()) + .upgrade() + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).decay()) ) .offset(1_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s)) && (Ptr::::from_string_literal(b"bc").with_c_str(|__s| { - (*(Ptr::>>::decay( - &(copy - .as_pointer() - .decay() - .offset(0_usize) - .as_pointer() - .decay()), - ) - .offset(1_usize) - .as_pointer() as Ptr>) + (*Ptr::>>::decay(&(copy.as_pointer().decay().offset(0_usize).decay())) + .offset(1_usize) .upgrade() - .deref())[..(*(Ptr::>>::decay( - &(copy - .as_pointer() - .decay() - .offset(0_usize) - .as_pointer() - .decay()), + .deref())[..(*Ptr::>>::decay( + &(copy.as_pointer().decay().offset(0_usize).decay()), ) .offset(1_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s @@ -277,19 +210,15 @@ fn main_0() -> i32 { ); elem!(v.as_pointer().decay(), 1_usize).with_mut(|__v: &mut Vec>>| __v.remove(0)); assert!(Ptr::::from_string_literal(b"bcx").with_c_str(|__s| { - (*(Ptr::>>::decay( - &(v.as_pointer().decay().offset(1_usize).as_pointer().decay()), - ) - .offset(0_usize) - .as_pointer() as Ptr>) + (*Ptr::>>::decay(&(v.as_pointer().decay().offset(1_usize).decay())) + .offset(0_usize) .upgrade() - .deref())[..(*(Ptr::>>::decay( - &(v.as_pointer().decay().offset(1_usize).as_pointer().decay()), + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(1_usize).decay()), ) .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s @@ -299,7 +228,6 @@ fn main_0() -> i32 { .as_pointer() .decay() .offset(1_usize) - .as_pointer() .decay() .upgrade() .deref()) From 1e8d2c811466be0b1e385065d6138d3a9c206d7f Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 14:06:52 +0100 Subject: [PATCH 07/62] format --- cpp2rust/converter/models/converter_refcount.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cpp2rust/converter/models/converter_refcount.cpp b/cpp2rust/converter/models/converter_refcount.cpp index 5afe7c363..53d218549 100644 --- a/cpp2rust/converter/models/converter_refcount.cpp +++ b/cpp2rust/converter/models/converter_refcount.cpp @@ -3387,9 +3387,8 @@ void ConverterRefCount::SetUFCSReceiver(clang::Expr *base, bool is_arrow, if (IsTemporaryObject(base) && base->getType()->isRecordType() && !IsReferenceType(base->IgnoreImplicit())) { PushConversionKind push(*this, ConversionKind::FullRefCount); - ufcs_receiver_ = - token::kRef + BoxValue(ConvertRValue(base)) + - AsPointerMethod(base->getType()); + ufcs_receiver_ = token::kRef + BoxValue(ConvertRValue(base)) + + AsPointerMethod(base->getType()); return; } ufcs_receiver_ = token::kRef + (base_is_pointer ? ConvertRValue(base) From ec164bcfb246db59165e43cf7533f8a73beb5a5d Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 14:07:17 +0100 Subject: [PATCH 08/62] Use field pointer instead of elem pointer --- libcc2rs/src/cstr.rs | 2 +- libcc2rs/src/field.rs | 16 +++++++++------- libcc2rs/src/rc.rs | 12 +++++++----- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/libcc2rs/src/cstr.rs b/libcc2rs/src/cstr.rs index 7022930a8..3810c2793 100644 --- a/libcc2rs/src/cstr.rs +++ b/libcc2rs/src/cstr.rs @@ -357,7 +357,7 @@ mod tests { #[test] fn stops_at_first_nul_in_vec() { let v = std::rc::Rc::new(RefCell::new(EMBEDDED_NUL.to_vec())); - check(&v.as_pointer()); + check(&v.as_pointer().decay()); } #[test] diff --git a/libcc2rs/src/field.rs b/libcc2rs/src/field.rs index efc04dd4d..cb397fe6d 100644 --- a/libcc2rs/src/field.rs +++ b/libcc2rs/src/field.rs @@ -568,7 +568,7 @@ macro_rules! array_field_ptr { // Field `field` of the struct that a Ptr or a Value holds, to make a pointer // to with as_pointer(), e.g., `field_ref!(p, v).as_pointer()` for a vector -// field `v`, which gives a pointer to the vector or to its first element. +// field `v`, which gives a pointer to the vector. #[macro_export] macro_rules! field_ref { ($base:expr, $field:ident) => {{ @@ -1006,7 +1006,8 @@ impl VecElem<'_, S, T> { let elems: Ptr = self .base .field_ref(self.get, self.get_mut, self.offset) - .as_pointer(); + .as_pointer() + .decay(); elems.offset(self.idx).upgrade() } } @@ -1561,10 +1562,11 @@ mod tests { } #[test] - #[should_panic(expected = "too large for a pointer to its elements")] fn far_vector_field_ptr() { - let far: Ptr = field_ptr!(holds_far(), far); - let _: Ptr = field_ref!(far, v).as_pointer(); + let holder = holds_far(); + let far: Ptr = field_ptr!(holder, far); + let v: Ptr = field_ref!(far, v).as_pointer().decay(); + assert_eq!(v.offset(1).read(), 6); } #[test] @@ -1574,7 +1576,7 @@ mod tests { let s: Value = Rc::new(RefCell::new(holds_far().borrow().far.clone())); let arr: Ptr = array_field_ptr!(s, arr); assert_eq!(arr.offset(2).read(), 3); - let v: Ptr = field_ref!(s, v).as_pointer(); + let v: Ptr = field_ref!(s, v).as_pointer().decay(); assert_eq!(v.offset(1).read(), 6); } @@ -1623,7 +1625,7 @@ mod tests { assert_ne!(a.offset(1), b); assert_eq!(b.offset(-2), a); // The elements of a vector are not in the struct. - let v: Ptr = field_ref!(s, v).as_pointer(); + let v: Ptr = field_ref!(s, v).as_pointer().decay(); assert_ne!(v.offset(6), field_ptr!(s, c)); } diff --git a/libcc2rs/src/rc.rs b/libcc2rs/src/rc.rs index a38ac1a29..97bdf0132 100644 --- a/libcc2rs/src/rc.rs +++ b/libcc2rs/src/rc.rs @@ -1423,10 +1423,12 @@ impl Ptr> { kind: PtrKind::HeapVec(weak.clone()), }, // The elements of a field are reached through the struct. - PtrKind::Field(root, _, FieldShape::Single) => Ptr { - offset: 0, - kind: PtrKind::Field(root.clone(), field_offset(self.offset), FieldShape::Vec), - }, + PtrKind::Field(root, _, FieldShape::Single) if u32::try_from(self.offset).is_ok() => { + Ptr { + offset: 0, + kind: PtrKind::Field(root.clone(), self.offset as u32, FieldShape::Vec), + } + } PtrKind::StackVec(_) | PtrKind::HeapVec(_) | PtrKind::StackArray(_) @@ -1654,7 +1656,7 @@ mod tests { assert_eq!(pp.borrow().read(), 3); pp_ptr.read().write(7); assert_eq!(a.borrow()[2], 7); - pp_ptr.write(v.as_pointer().offset(1)); + pp_ptr.write(v.as_pointer().decay().offset(1)); pp_ptr.read().write(8); assert_eq!(*v.borrow(), vec![4, 8]); } From a4f46de980e54d9fa5cf7744b3b3fd818d9fafe7 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 14:37:05 +0100 Subject: [PATCH 09/62] Drop useless clones for receiver --- cpp2rust/converter/converter.cpp | 3 +++ cpp2rust/converter/models/converter_refcount.cpp | 2 +- rule-preprocessor/src/syntactic.rs | 13 ++++++++----- tests/unit/out/refcount/11_move.rs | 2 +- tests/unit/out/refcount/alloc_array.rs | 2 +- tests/unit/out/refcount/foreach_double.rs | 4 +--- tests/unit/out/refcount/implicit_autoref.rs | 2 +- tests/unit/out/refcount/map.rs | 5 +---- tests/unit/out/refcount/push_emplace_back.rs | 2 +- tests/unit/out/refcount/references2.rs | 2 +- tests/unit/out/refcount/sys_stat.rs | 14 +++++++------- .../out/refcount/unboxed_conditional_iterator.rs | 4 ++-- tests/unit/out/refcount/unboxed_locals.rs | 2 +- tests/unit/out/refcount/unique_ptr_small.rs | 2 +- tests/unit/out/refcount/vector2.rs | 4 ++-- tests/unit/out/refcount/vector3.rs | 4 ++-- tests/unit/out/refcount/vector_addr_of_back.rs | 2 +- tests/unit/out/refcount/vector_with_allocator.rs | 4 ++-- 18 files changed, 37 insertions(+), 36 deletions(-) diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index b8f827436..ead4ca34e 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -5130,6 +5130,9 @@ std::string Converter::ConvertPlaceholder(clang::Expr *expr, clang::Expr *arg, if (ph_ctx.needs_pointer_receiver()) { auto param_type = Mapper::GetParamType(*this, expr, ph_ctx.arg_idx); + bool borrowed = ph_ctx.access == TranslationRule::Access::kBorrow || + ph_ctx.access == TranslationRule::Access::kBorrowMut; + PushExprKind push(*this, borrowed ? ExprKind::Object : ExprKind::XValue); return ConvertPointerReceiver(arg, param_type); } diff --git a/cpp2rust/converter/models/converter_refcount.cpp b/cpp2rust/converter/models/converter_refcount.cpp index 53d218549..f6425008b 100644 --- a/cpp2rust/converter/models/converter_refcount.cpp +++ b/cpp2rust/converter/models/converter_refcount.cpp @@ -401,7 +401,7 @@ std::string ConverterRefCount::AsPointerMethod(clang::QualType type) const { std::string ConverterRefCount::ConvertPointerReceiver(clang::Expr *arg, std::string_view) { - return ConvertFreshObject(arg); + return isObject() ? ConvertObject(arg) : ConvertFreshObject(arg); } std::string ConverterRefCount::ConvertFreshObject(clang::Expr *expr) { diff --git a/rule-preprocessor/src/syntactic.rs b/rule-preprocessor/src/syntactic.rs index b3f6ad797..5788207a3 100644 --- a/rule-preprocessor/src/syntactic.rs +++ b/rule-preprocessor/src/syntactic.rs @@ -216,7 +216,9 @@ impl<'a> FragmentCtx<'a> { }); return; } - let mut access = self.builder.classify_access(token); + let mut access = self + .builder + .classify_access(token, param.is_refcount_pointer); if param.is_mut_ref && self.text_buf.ends_with('*') { self.text_buf.pop(); } @@ -392,7 +394,7 @@ impl<'a> FnIrBuilder<'a> { generics } - fn classify_rw_from_name_ref(&self, name_ref: &ast::NameRef) -> Access { + fn classify_rw_from_name_ref(&self, name_ref: &ast::NameRef, is_ptr: bool) -> Access { name_ref .syntax() .ancestors() @@ -425,7 +427,8 @@ impl<'a> FnIrBuilder<'a> { { return None; } - Some(Access::Unknown) + // Every Ptr method takes &self. + Some(if is_ptr { Access::Borrow } else { Access::Unknown }) }, ast::ReturnExpr(_) => { panic!("return statements are not supported in rule bodies"); @@ -461,12 +464,12 @@ impl<'a> FnIrBuilder<'a> { .is_some_and(|ty| matches!(ty, ast::Type::RefType(r) if r.mut_token().is_some())) } - fn classify_access(&self, token: &ra_ap_syntax::SyntaxToken) -> Access { + fn classify_access(&self, token: &ra_ap_syntax::SyntaxToken, is_ptr: bool) -> Access { let Some(name_ref) = token.parent().and_then(ast::NameRef::cast) else { // Inside a macro invocation. Phase 2 will resolve this. return Access::Unknown; }; - self.classify_rw_from_name_ref(&name_ref) + self.classify_rw_from_name_ref(&name_ref, is_ptr) } fn trim_whitespaces(fragments: &mut Vec) { diff --git a/tests/unit/out/refcount/11_move.rs b/tests/unit/out/refcount/11_move.rs index e4f6d18f9..d26c363c8 100644 --- a/tests/unit/out/refcount/11_move.rs +++ b/tests/unit/out/refcount/11_move.rs @@ -8,7 +8,7 @@ use std::os::fd::AsFd; use std::rc::{Rc, Weak}; pub fn change_0(n: Ptr>>) { let m: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(20))))); - (n).clone().write((*m.borrow_mut()).take()); + n.write((*m.borrow_mut()).take()); assert!(((*m.borrow()).as_pointer()).is_null()); } pub fn main() { diff --git a/tests/unit/out/refcount/alloc_array.rs b/tests/unit/out/refcount/alloc_array.rs index 7db2e87ce..23ccbe4b2 100644 --- a/tests/unit/out/refcount/alloc_array.rs +++ b/tests/unit/out/refcount/alloc_array.rs @@ -19,7 +19,7 @@ pub fn All_0(arr: Ptr>>>, mut N: i32, mut element: i32) .write(element); i.prefix_inc(); } - (arr).clone().write((*all.borrow_mut()).take()); + arr.write((*all.borrow_mut()).take()); } pub fn Consume_1(mut arr: Option>>, mut N: i32) -> i32 { let mut sum: i32 = 0; diff --git a/tests/unit/out/refcount/foreach_double.rs b/tests/unit/out/refcount/foreach_double.rs index a98d9eae3..e9968e095 100644 --- a/tests/unit/out/refcount/foreach_double.rs +++ b/tests/unit/out/refcount/foreach_double.rs @@ -80,9 +80,7 @@ fn main_0() -> i32 { 'loop_: for row in IterRange::new(m.as_pointer().decay().begin(), m.as_pointer().decay().end()) { let row: Ptr> = row.iter_deref(); - 'loop_: for col in - IterRange::new((row).clone().decay().begin(), (row).clone().decay().end()) - { + 'loop_: for col in IterRange::new(row.decay().begin(), row.decay().end()) { let col: Ptr = col.iter_deref(); square += { (col.read()) }; } diff --git a/tests/unit/out/refcount/implicit_autoref.rs b/tests/unit/out/refcount/implicit_autoref.rs index 6865f2549..02a1b2ea5 100644 --- a/tests/unit/out/refcount/implicit_autoref.rs +++ b/tests/unit/out/refcount/implicit_autoref.rs @@ -49,7 +49,7 @@ fn main_0() -> i32 { assert!(((index!(p, 1_usize).read()) == 30)); assert!((b == 40)); assert!(((vec_elem!((hp), v, 1_usize).read()) == 60)); - ({ write_through_0(((p).clone().decay().offset(0_usize as isize))) }); + ({ write_through_0((p.decay().offset(0_usize as isize))) }); assert!(((index!(p, 0_usize).read()) == 42)); return 0; } diff --git a/tests/unit/out/refcount/map.rs b/tests/unit/out/refcount/map.rs index fae8aff22..7c4a13b67 100644 --- a/tests/unit/out/refcount/map.rs +++ b/tests/unit/out/refcount/map.rs @@ -423,10 +423,7 @@ fn main_0() -> i32 { != m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) ); - (r).clone() - .with_mut(|__m: &mut Map, Value)>| { - __m.erase(&(*it4.borrow()).clone()) - }); + r.with_mut(|__m: &mut Map, Value)>| __m.erase(&(*it4.borrow()).clone())); assert!(((*r.upgrade().deref()).len() == 3_usize)); assert!( m.as_pointer() diff --git a/tests/unit/out/refcount/push_emplace_back.rs b/tests/unit/out/refcount/push_emplace_back.rs index 13ac9e7bf..69597b478 100644 --- a/tests/unit/out/refcount/push_emplace_back.rs +++ b/tests/unit/out/refcount/push_emplace_back.rs @@ -99,7 +99,7 @@ pub fn nested_emplace_move_5(mut bw: Ptr) { } pub fn self_ref_push_6(mut comps: Ptr>) { { - let a0_clone = (*(comps).clone().decay().upgrade().deref()).clone(); + let a0_clone = (*comps.decay().upgrade().deref()).clone(); comps.with_mut(|__v: &mut Vec| __v.push(a0_clone)) }; } diff --git a/tests/unit/out/refcount/references2.rs b/tests/unit/out/refcount/references2.rs index ec8cc4078..1c9d579e0 100644 --- a/tests/unit/out/refcount/references2.rs +++ b/tests/unit/out/refcount/references2.rs @@ -8,7 +8,7 @@ use std::os::fd::AsFd; use std::rc::{Rc, Weak}; pub fn change_0(p: Ptr>>) { let q: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(7))))); - (p).clone().write((*q.borrow_mut()).take()); + p.write((*q.borrow_mut()).take()); } pub fn main() { __cpp2rust_init_globals(); diff --git a/tests/unit/out/refcount/sys_stat.rs b/tests/unit/out/refcount/sys_stat.rs index 5d8ebde46..25445bb2c 100644 --- a/tests/unit/out/refcount/sys_stat.rs +++ b/tests/unit/out/refcount/sys_stat.rs @@ -109,26 +109,26 @@ pub fn test_st_mtime_access_2() { let mut sp: Ptr = (st.as_pointer()); field_ptr!(st.as_pointer(), st_mtime).write(5_i64); assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 5_i64) as i32) != 0)); - field_ptr!((sp).clone(), st_mtime).write(6_i64); - assert!(((((field_ptr!((sp).clone(), st_mtime).read()) == 6_i64) as i32) != 0)); + field_ptr!(sp, st_mtime).write(6_i64); + assert!(((((field_ptr!(sp, st_mtime).read()) == 6_i64) as i32) != 0)); { field_ptr!(st.as_pointer(), st_mtime).with_mut(|__v| *__v = *__v + 2_i64) }; assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 8_i64) as i32) != 0)); { - field_ptr!((sp).clone(), st_mtime).with_mut(|__v| *__v = *__v - 1_i64) + field_ptr!(sp, st_mtime).with_mut(|__v| *__v = *__v - 1_i64) }; - assert!(((((field_ptr!((sp).clone(), st_mtime).read()) == 7_i64) as i32) != 0)); + assert!(((((field_ptr!(sp, st_mtime).read()) == 7_i64) as i32) != 0)); field_ptr!(st.as_pointer(), st_mtime).with_mut(|__v| __v.postfix_inc()); - field_ptr!((sp).clone(), st_mtime).with_mut(|__v| __v.prefix_inc()); + field_ptr!(sp, st_mtime).with_mut(|__v| __v.prefix_inc()); assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 9_i64) as i32) != 0)); let mut mtime: Ptr = (field_ptr!(st.as_pointer(), st_mtime)); mtime.write(10_i64); assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 10_i64) as i32) != 0)); - let mut mtime_via_ptr: Ptr = (field_ptr!((sp).clone(), st_mtime)); + let mut mtime_via_ptr: Ptr = (field_ptr!(sp, st_mtime)); mtime_via_ptr.write(11_i64); assert!(((((mtime.read()) == 11_i64) as i32) != 0)); - let mut copy: i64 = (field_ptr!((sp).clone(), st_mtime).read()); + let mut copy: i64 = (field_ptr!(sp, st_mtime).read()); assert!((((copy == 11_i64) as i32) != 0)); } pub fn main() { diff --git a/tests/unit/out/refcount/unboxed_conditional_iterator.rs b/tests/unit/out/refcount/unboxed_conditional_iterator.rs index b1bd73fe2..7d2ecb313 100644 --- a/tests/unit/out/refcount/unboxed_conditional_iterator.rs +++ b/tests/unit/out/refcount/unboxed_conditional_iterator.rs @@ -73,8 +73,8 @@ pub fn lehmer_2(mut sigma: Ptr, mut len: u32, mut code: Ptr) { } pub fn sum_3(v: Ptr>) -> i32 { let mut s: i32 = 0; - let it: Value> = Rc::new(RefCell::new((v).clone().decay().begin())); - 'loop_: while (*it.borrow()) != (v).clone().decay().end() { + let it: Value> = Rc::new(RefCell::new(v.decay().begin())); + 'loop_: while (*it.borrow()) != v.decay().end() { s += ((*it.borrow()).iter_deref().read()); (*it.borrow_mut()).iter_inc(); } diff --git a/tests/unit/out/refcount/unboxed_locals.rs b/tests/unit/out/refcount/unboxed_locals.rs index a2f7e957e..76b2e4137 100644 --- a/tests/unit/out/refcount/unboxed_locals.rs +++ b/tests/unit/out/refcount/unboxed_locals.rs @@ -22,7 +22,7 @@ pub struct Pair { } pub fn total_2(v: Ptr>) -> i32 { let mut s: i32 = 0; - 'loop_: for x in IterRange::new((v).clone().decay().begin(), (v).clone().decay().end()) { + 'loop_: for x in IterRange::new(v.decay().begin(), v.decay().end()) { let mut x: i32 = (x.iter_deref().read()); s += x; } diff --git a/tests/unit/out/refcount/unique_ptr_small.rs b/tests/unit/out/refcount/unique_ptr_small.rs index 23fd513da..7396d8d7f 100644 --- a/tests/unit/out/refcount/unique_ptr_small.rs +++ b/tests/unit/out/refcount/unique_ptr_small.rs @@ -8,7 +8,7 @@ use std::os::fd::AsFd; use std::rc::{Rc, Weak}; pub fn change_0(n: Ptr>>) { let m: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(20))))); - (n).clone().write((*m.borrow_mut()).take()); + n.write((*m.borrow_mut()).take()); } pub fn main() { __cpp2rust_init_globals(); diff --git a/tests/unit/out/refcount/vector2.rs b/tests/unit/out/refcount/vector2.rs index d1f430268..ee6a0c4e0 100644 --- a/tests/unit/out/refcount/vector2.rs +++ b/tests/unit/out/refcount/vector2.rs @@ -41,10 +41,10 @@ pub fn fn_0(v: Ptr>, v3: Vec) { v2.as_pointer().write((*v.upgrade().deref()).clone()); index!(v4, 1_usize).write(13); assert!((x == 6)); - assert!((((v).clone().decay().read()) == 4)); + assert!(((v.decay().read()) == 4)); assert!(((index!(v, 1_usize).read()) == 5)); assert!(((index!(v, 2_usize).read()) == 6)); - assert!((((v).clone().decay().to_last().read()) == 20)); + assert!(((v.decay().to_last().read()) == 20)); assert!(({ (*v2.borrow())[0_usize] } == 4)); assert!(({ (*v2.borrow())[1_usize] } == 5)); assert!(({ (*v2.borrow())[2_usize] } == 6)); diff --git a/tests/unit/out/refcount/vector3.rs b/tests/unit/out/refcount/vector3.rs index e20d9a2a8..2cede07ce 100644 --- a/tests/unit/out/refcount/vector3.rs +++ b/tests/unit/out/refcount/vector3.rs @@ -31,14 +31,14 @@ fn main_0() -> i32 { index!(elem!(v.as_pointer().decay(), 1_usize), 0_usize).write(6); 'loop_: for v2 in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) { let v2: Ptr> = v2.iter_deref(); - 'loop_: for i in IterRange::new((v2).clone().decay().begin(), (v2).clone().decay().end()) { + 'loop_: for i in IterRange::new(v2.decay().begin(), v2.decay().end()) { let i: Ptr = i.iter_deref(); i.with_mut(|__v| __v.prefix_inc()); } } 'loop_: for v2 in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) { let v2: Ptr> = v2.iter_deref(); - 'loop_: for i in IterRange::new((v2).clone().decay().begin(), (v2).clone().decay().end()) { + 'loop_: for i in IterRange::new(v2.decay().begin(), v2.decay().end()) { let mut i: i32 = (i.iter_deref().read()); println!("{}", (i + 3)); } diff --git a/tests/unit/out/refcount/vector_addr_of_back.rs b/tests/unit/out/refcount/vector_addr_of_back.rs index f43a4b604..ddd402c05 100644 --- a/tests/unit/out/refcount/vector_addr_of_back.rs +++ b/tests/unit/out/refcount/vector_addr_of_back.rs @@ -20,7 +20,7 @@ fn main_0() -> i32 { let mut sink: Ptr> = (outer.as_pointer().decay().to_last()); assert!(((*sink.upgrade().deref()).len() == 0_usize)); let mut p: Ptr>> = (outer.as_pointer()); - sink = ((p).clone().decay().to_last()); + sink = (p.decay().to_last()); assert!(((*sink.upgrade().deref()).len() == 0_usize)); return 0; } diff --git a/tests/unit/out/refcount/vector_with_allocator.rs b/tests/unit/out/refcount/vector_with_allocator.rs index 1939bb3b5..9ca0b0f17 100644 --- a/tests/unit/out/refcount/vector_with_allocator.rs +++ b/tests/unit/out/refcount/vector_with_allocator.rs @@ -47,10 +47,10 @@ pub fn fn_1(v: Ptr>, v3: Vec) { .write(7); index!(v4, 1_usize).write(13); assert!((x == 6)); - assert!((((v).clone().decay().read()) == 4)); + assert!(((v.decay().read()) == 4)); assert!(((index!(v, 1_usize).read()) == 5)); assert!(((index!(v, 2_usize).read()) == 6)); - assert!((((v).clone().decay().to_last().read()) == 20)); + assert!(((v.decay().to_last().read()) == 20)); assert!(({ (*v3.borrow())[0_usize] } == 7)); assert!(({ (*v3.borrow())[1_usize] } == 13)); { From 4ff48b9364947458fff25192e0527348d3559f11 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:00:33 +0100 Subject: [PATCH 10/62] Add rules for typedefs --- rules/allocator_traits/src.cpp | 7 +++++ rules/allocator_traits/tgt_unsafe.rs | 6 ++++ rules/array/src.cpp | 3 ++ rules/array/tgt_unsafe.rs | 4 +++ rules/builtin_types/src.cpp | 2 +- rules/dirent/src.c | 1 + rules/dirent/tgt_unsafe.rs | 4 +++ rules/fstream/src.cpp | 1 + rules/fstream/tgt_unsafe.rs | 4 +++ rules/ip/src.c | 2 ++ rules/ip/tgt_unsafe.rs | 8 +++++ rules/iterator/src.cpp | 7 +++++ rules/iterator/tgt_unsafe.rs | 6 ++++ rules/map/src.cpp | 6 ++++ rules/map/tgt_unsafe.rs | 8 +++++ rules/socket/src.c | 2 ++ rules/socket/tgt_unsafe.rs | 8 +++++ rules/stdint/src.c | 16 ++++++++++ rules/stdint/tgt_unsafe.rs | 46 ++++++++++++++++++++++++++++ rules/stdio/src.c | 1 + rules/stdio/tgt_unsafe.rs | 4 +++ rules/string/src.cpp | 1 + rules/string/tgt_refcount.rs | 4 +++ rules/string/tgt_unsafe.rs | 4 +++ rules/sys_types/src.c | 7 +++++ rules/sys_types/tgt_unsafe.rs | 10 ++++++ rules/time/src.c | 1 + rules/time/tgt_unsafe.rs | 4 +++ rules/type_traits/src.cpp | 7 +++++ rules/type_traits/tgt_unsafe.rs | 6 ++++ rules/vector/src.cpp | 8 +++++ rules/vector/tgt_unsafe.rs | 12 ++++++++ 32 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 rules/allocator_traits/src.cpp create mode 100644 rules/allocator_traits/tgt_unsafe.rs create mode 100644 rules/iterator/src.cpp create mode 100644 rules/iterator/tgt_unsafe.rs create mode 100644 rules/stdint/src.c create mode 100644 rules/stdint/tgt_unsafe.rs create mode 100644 rules/sys_types/src.c create mode 100644 rules/sys_types/tgt_unsafe.rs create mode 100644 rules/type_traits/src.cpp create mode 100644 rules/type_traits/tgt_unsafe.rs diff --git a/rules/allocator_traits/src.cpp b/rules/allocator_traits/src.cpp new file mode 100644 index 000000000..d39313344 --- /dev/null +++ b/rules/allocator_traits/src.cpp @@ -0,0 +1,7 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +#include + +template +using t1 = typename std::allocator_traits::value_type; diff --git a/rules/allocator_traits/tgt_unsafe.rs b/rules/allocator_traits/tgt_unsafe.rs new file mode 100644 index 000000000..eb48fd0c0 --- /dev/null +++ b/rules/allocator_traits/tgt_unsafe.rs @@ -0,0 +1,6 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +fn t1() -> T1 { + unimplemented!() +} diff --git a/rules/array/src.cpp b/rules/array/src.cpp index 2736d24b6..fac378dba 100644 --- a/rules/array/src.cpp +++ b/rules/array/src.cpp @@ -8,6 +8,9 @@ template using t1 = std::array; template using t2 = typename std::array::size_type; +template +using t3 = typename std::array::value_type; + template const T1 *f1(const std::array &o) { return o.data(); diff --git a/rules/array/tgt_unsafe.rs b/rules/array/tgt_unsafe.rs index a385a0ee4..baa127877 100644 --- a/rules/array/tgt_unsafe.rs +++ b/rules/array/tgt_unsafe.rs @@ -11,6 +11,10 @@ fn t2() -> usize { 0_usize } +fn t3() -> T1 { + unimplemented!() +} + unsafe fn f1(a0: Vec) -> *const T1 { a0.as_ptr() } diff --git a/rules/builtin_types/src.cpp b/rules/builtin_types/src.cpp index 7ea9b8bc7..9eb568f37 100644 --- a/rules/builtin_types/src.cpp +++ b/rules/builtin_types/src.cpp @@ -3,7 +3,7 @@ #include -typedef decltype(nullptr) t0; +typedef std::nullptr_t t0; typedef bool t10; typedef char16_t t80; diff --git a/rules/dirent/src.c b/rules/dirent/src.c index 75c18fed2..3f5ca7ed5 100644 --- a/rules/dirent/src.c +++ b/rules/dirent/src.c @@ -5,6 +5,7 @@ typedef DIR *t1; typedef struct dirent t2; +typedef DIR t3; DIR *f1(const char *name) { return opendir(name); } diff --git a/rules/dirent/tgt_unsafe.rs b/rules/dirent/tgt_unsafe.rs index da80489df..d56331804 100644 --- a/rules/dirent/tgt_unsafe.rs +++ b/rules/dirent/tgt_unsafe.rs @@ -9,6 +9,10 @@ fn t2() -> ::libc::dirent { unsafe { std::mem::zeroed() } } +fn t3() -> ::libc::DIR { + unimplemented!() +} + unsafe fn f1(a0: *const libc::c_char) -> *mut ::libc::DIR { libc::opendir(a0) } diff --git a/rules/fstream/src.cpp b/rules/fstream/src.cpp index 5627ad79b..3e27d32bd 100644 --- a/rules/fstream/src.cpp +++ b/rules/fstream/src.cpp @@ -8,6 +8,7 @@ using t1 = std::ifstream; using t2 = std::ofstream; using t3 = std::ostream_iterator; +using t4 = std::ostream_iterator::ostream_type; std::ofstream f1(const char *filename, std::ios_base::openmode mode) { return std::ofstream(filename, mode); diff --git a/rules/fstream/tgt_unsafe.rs b/rules/fstream/tgt_unsafe.rs index 5e5a37da9..9542e030a 100644 --- a/rules/fstream/tgt_unsafe.rs +++ b/rules/fstream/tgt_unsafe.rs @@ -13,6 +13,10 @@ fn t3() -> ::std::fs::File { ::std::fs::File::open("").unwrap() } +fn t4() -> ::std::fs::File { + ::std::fs::File::open("").unwrap() +} + unsafe fn f1(a0: *const libc::c_char) -> ::std::fs::File { ::std::fs::File::create(::std::ffi::CStr::from_ptr(a0).to_str().unwrap()).unwrap() } diff --git a/rules/ip/src.c b/rules/ip/src.c index 5b9fa9519..36c354641 100644 --- a/rules/ip/src.c +++ b/rules/ip/src.c @@ -5,6 +5,8 @@ typedef struct sockaddr_in t1; typedef struct in_addr t2; typedef struct sockaddr_in6 t3; typedef struct in6_addr t4; +typedef in_addr_t t5; +typedef in_port_t t6; int f1(void) { return IPPROTO_TCP; } diff --git a/rules/ip/tgt_unsafe.rs b/rules/ip/tgt_unsafe.rs index 7395fe0e1..fc9e2463e 100644 --- a/rules/ip/tgt_unsafe.rs +++ b/rules/ip/tgt_unsafe.rs @@ -14,6 +14,14 @@ fn t4() -> ::libc::in6_addr { unsafe { std::mem::zeroed() } } +fn t5() -> ::libc::in_addr_t { + 0 as ::libc::in_addr_t +} + +fn t6() -> ::libc::in_port_t { + 0 as ::libc::in_port_t +} + unsafe fn f1() -> i32 { libc::IPPROTO_TCP } diff --git a/rules/iterator/src.cpp b/rules/iterator/src.cpp new file mode 100644 index 000000000..b8a3da27d --- /dev/null +++ b/rules/iterator/src.cpp @@ -0,0 +1,7 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +#include + +template +using t1 = typename std::iterator_traits::difference_type; diff --git a/rules/iterator/tgt_unsafe.rs b/rules/iterator/tgt_unsafe.rs new file mode 100644 index 000000000..9dec46f41 --- /dev/null +++ b/rules/iterator/tgt_unsafe.rs @@ -0,0 +1,6 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +fn t1() -> isize { + 0_isize +} diff --git a/rules/map/src.cpp b/rules/map/src.cpp index 4177680d8..5b492cde1 100644 --- a/rules/map/src.cpp +++ b/rules/map/src.cpp @@ -11,6 +11,12 @@ template using t1 = std::map; template using t4 = typename std::map::size_type; +template +using t5 = typename std::map::key_type; + +template +using t6 = typename std::map::mapped_type; + template T2 &f1(std::map &o, const T1 &key) { return o[key]; } diff --git a/rules/map/tgt_unsafe.rs b/rules/map/tgt_unsafe.rs index 50440d791..b65918085 100644 --- a/rules/map/tgt_unsafe.rs +++ b/rules/map/tgt_unsafe.rs @@ -11,6 +11,14 @@ fn t4() -> usize { 0_usize } +fn t5() -> T1 { + unimplemented!() +} + +fn t6() -> T2 { + unimplemented!() +} + unsafe fn f1(a0: &mut UnsafeMap, a1: T1) -> &mut T2 { &mut (*a0.get_or_insert_with(a1.clone(), || (a1, ::default()))).1 } diff --git a/rules/socket/src.c b/rules/socket/src.c index 55030b200..699b89adc 100644 --- a/rules/socket/src.c +++ b/rules/socket/src.c @@ -7,6 +7,8 @@ typedef struct sockaddr t1; typedef struct sockaddr_storage t2; typedef struct sockaddr_un t3; +typedef socklen_t t4; +typedef sa_family_t t5; int f1(void) { return MSG_NOSIGNAL; } diff --git a/rules/socket/tgt_unsafe.rs b/rules/socket/tgt_unsafe.rs index 402a17829..678379061 100644 --- a/rules/socket/tgt_unsafe.rs +++ b/rules/socket/tgt_unsafe.rs @@ -10,6 +10,14 @@ fn t3() -> libc::sockaddr_un { unsafe { std::mem::zeroed() } } +fn t4() -> libc::socklen_t { + 0 as libc::socklen_t +} + +fn t5() -> libc::sa_family_t { + 0 as libc::sa_family_t +} + unsafe fn f1() -> i32 { libc::MSG_NOSIGNAL } diff --git a/rules/stdint/src.c b/rules/stdint/src.c new file mode 100644 index 000000000..c101bb8f6 --- /dev/null +++ b/rules/stdint/src.c @@ -0,0 +1,16 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +#include + +typedef uint8_t t1; +typedef uint16_t t2; +typedef uint32_t t3; +typedef uint64_t t4; +typedef int16_t t5; +typedef int32_t t6; +typedef int64_t t7; +typedef uintptr_t t8; +typedef int8_t t9; +typedef uintmax_t t10; +typedef intmax_t t11; diff --git a/rules/stdint/tgt_unsafe.rs b/rules/stdint/tgt_unsafe.rs new file mode 100644 index 000000000..1d4d3464a --- /dev/null +++ b/rules/stdint/tgt_unsafe.rs @@ -0,0 +1,46 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +fn t1() -> u8 { + 0_u8 +} + +fn t2() -> u16 { + 0_u16 +} + +fn t3() -> u32 { + 0_u32 +} + +fn t4() -> u64 { + 0_u64 +} + +fn t5() -> i16 { + 0_i16 +} + +fn t6() -> i32 { + 0_i32 +} + +fn t7() -> i64 { + 0_i64 +} + +fn t8() -> usize { + 0_usize +} + +fn t9() -> i8 { + 0_i8 +} + +fn t10() -> u64 { + 0_u64 +} + +fn t11() -> i64 { + 0_i64 +} diff --git a/rules/stdio/src.c b/rules/stdio/src.c index c76a78c66..774a49a6c 100644 --- a/rules/stdio/src.c +++ b/rules/stdio/src.c @@ -6,6 +6,7 @@ #include typedef FILE *t1; +typedef FILE t2; FILE *f1(const char *pathname, const char *mode) { return fopen(pathname, mode); diff --git a/rules/stdio/tgt_unsafe.rs b/rules/stdio/tgt_unsafe.rs index 0be970ce4..68e7fc25b 100644 --- a/rules/stdio/tgt_unsafe.rs +++ b/rules/stdio/tgt_unsafe.rs @@ -5,6 +5,10 @@ fn t1() -> *mut ::libc::FILE { std::ptr::null_mut() } +fn t2() -> ::libc::FILE { + unimplemented!() +} + unsafe fn f1(a0: *const libc::c_char, a1: *const libc::c_char) -> *mut ::libc::FILE { libc::fopen(a0, a1) } diff --git a/rules/string/src.cpp b/rules/string/src.cpp index 2ebae94da..32fa17711 100644 --- a/rules/string/src.cpp +++ b/rules/string/src.cpp @@ -6,6 +6,7 @@ #include using t1 = std::string; +using t4 = std::basic_string; typedef std::string::size_type t3; std::string f1(const std::string &s, std::size_t pos, std::size_t count) { diff --git a/rules/string/tgt_refcount.rs b/rules/string/tgt_refcount.rs index 3b94acee5..98211eefd 100644 --- a/rules/string/tgt_refcount.rs +++ b/rules/string/tgt_refcount.rs @@ -9,6 +9,10 @@ fn t1() -> Vec { vec![0] } +fn t4() -> Vec { + vec![0] +} + fn f1(a0: Vec, a1: usize, a2: usize) -> Vec { let mut __tmp1 = a0[(a1) as usize..::std::cmp::min((a1 + a2) as usize, a0.len().saturating_sub(1))].to_vec(); diff --git a/rules/string/tgt_unsafe.rs b/rules/string/tgt_unsafe.rs index 32cacd28c..74a096f8f 100644 --- a/rules/string/tgt_unsafe.rs +++ b/rules/string/tgt_unsafe.rs @@ -7,6 +7,10 @@ fn t1() -> Vec { vec![0] } +fn t4() -> Vec { + vec![0] +} + fn t3() -> usize { 0_usize } diff --git a/rules/sys_types/src.c b/rules/sys_types/src.c new file mode 100644 index 000000000..19d34179e --- /dev/null +++ b/rules/sys_types/src.c @@ -0,0 +1,7 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +#include + +typedef uid_t t1; +typedef off_t t2; diff --git a/rules/sys_types/tgt_unsafe.rs b/rules/sys_types/tgt_unsafe.rs new file mode 100644 index 000000000..9b5bb05d0 --- /dev/null +++ b/rules/sys_types/tgt_unsafe.rs @@ -0,0 +1,10 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +fn t1() -> ::libc::uid_t { + 0 as ::libc::uid_t +} + +fn t2() -> ::libc::off_t { + 0 as ::libc::off_t +} diff --git a/rules/time/src.c b/rules/time/src.c index da852cdf6..beb9f89bb 100644 --- a/rules/time/src.c +++ b/rules/time/src.c @@ -7,6 +7,7 @@ typedef struct tm t1; typedef struct timeval t2; typedef struct timespec t3; +typedef time_t t4; time_t f1(time_t *t) { return time(t); } diff --git a/rules/time/tgt_unsafe.rs b/rules/time/tgt_unsafe.rs index b1b41c9eb..e244133ce 100644 --- a/rules/time/tgt_unsafe.rs +++ b/rules/time/tgt_unsafe.rs @@ -13,6 +13,10 @@ fn t3() -> ::libc::timespec { unsafe { std::mem::zeroed() } } +fn t4() -> ::libc::time_t { + 0 as ::libc::time_t +} + unsafe fn f1(a0: *mut ::libc::time_t) -> ::libc::time_t { libc::time(a0) } diff --git a/rules/type_traits/src.cpp b/rules/type_traits/src.cpp new file mode 100644 index 000000000..50c586baa --- /dev/null +++ b/rules/type_traits/src.cpp @@ -0,0 +1,7 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +#include + +template ::type> +using t1 = typename std::remove_reference::type; diff --git a/rules/type_traits/tgt_unsafe.rs b/rules/type_traits/tgt_unsafe.rs new file mode 100644 index 000000000..eb48fd0c0 --- /dev/null +++ b/rules/type_traits/tgt_unsafe.rs @@ -0,0 +1,6 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +fn t1() -> T1 { + unimplemented!() +} diff --git a/rules/vector/src.cpp b/rules/vector/src.cpp index e6d62263b..a6eb02301 100644 --- a/rules/vector/src.cpp +++ b/rules/vector/src.cpp @@ -16,6 +16,14 @@ using t5 = std::vector; template > using t9 = typename std::vector::size_type; +template > +using t10 = typename std::vector::value_type; + +template +using t11 = typename std::vector>::value_type; + +using t12 = std::vector::reference; + std::vector f38(std::size_t n, const bool &value) { return std::vector(n, value); } diff --git a/rules/vector/tgt_unsafe.rs b/rules/vector/tgt_unsafe.rs index 386dbc7af..834c269ee 100644 --- a/rules/vector/tgt_unsafe.rs +++ b/rules/vector/tgt_unsafe.rs @@ -11,6 +11,18 @@ fn t9() -> usize { 0_usize } +fn t10() -> T1 { + unimplemented!() +} + +fn t11() -> Vec { + Vec::new() +} + +fn t12() -> bool { + false +} + unsafe fn f38(a0: usize, a1: bool) -> Vec { (0..(a0) as usize).map(|_| a1).collect::>() } From 697482d3776ec7c2611ace7448b6d6b862ae7907 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:03:37 +0100 Subject: [PATCH 11/62] Add generic on types --- cpp2rust/converter/translation_rule.cpp | 2 ++ cpp2rust/converter/translation_rule.h | 1 + rule-preprocessor/src/ir.rs | 2 ++ rule-preprocessor/src/syntactic.rs | 14 ++++++++++++++ 4 files changed, 19 insertions(+) diff --git a/cpp2rust/converter/translation_rule.cpp b/cpp2rust/converter/translation_rule.cpp index 5beafea1f..8c914227b 100644 --- a/cpp2rust/converter/translation_rule.cpp +++ b/cpp2rust/converter/translation_rule.cpp @@ -268,6 +268,8 @@ TypeRule ParseTypeRuleJSON(const llvm::json::Object &obj) { TypeRule rule; if (auto init = obj.getString("init")) rule.initializer = init->str(); + if (auto generic = obj.getInteger("generic")) + rule.generic = *generic; rule.type_info = ParseTypeInfoJSON(obj); return rule; } diff --git a/cpp2rust/converter/translation_rule.h b/cpp2rust/converter/translation_rule.h index 6cc21da79..0a8651eba 100644 --- a/cpp2rust/converter/translation_rule.h +++ b/cpp2rust/converter/translation_rule.h @@ -87,6 +87,7 @@ struct ExprRule { struct TypeRule { std::string initializer; // Rust initializer expression + unsigned generic = 0; TypeInfo type_info; void dump() const; diff --git a/rule-preprocessor/src/ir.rs b/rule-preprocessor/src/ir.rs index 34653078d..5bb7f5314 100644 --- a/rule-preprocessor/src/ir.rs +++ b/rule-preprocessor/src/ir.rs @@ -142,6 +142,8 @@ impl FnIr { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TypeIr { pub init: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub generic: Option, #[serde(flatten)] pub type_info: TypeInfo, } diff --git a/rule-preprocessor/src/syntactic.rs b/rule-preprocessor/src/syntactic.rs index b3f6ad797..6ccc6ac1d 100644 --- a/rule-preprocessor/src/syntactic.rs +++ b/rule-preprocessor/src/syntactic.rs @@ -595,8 +595,22 @@ impl<'a> TypeIrBuilder<'a> { .tail_expr() .expect("Type rules must yield an initializer"); + let ty_text = ty.syntax().text().to_string(); + let generic = self + .fn_item + .generic_param_list() + .into_iter() + .flat_map(|gpl| gpl.generic_params()) + .filter_map(|param| match param { + ast::GenericParam::TypeParam(tp) => tp.name(), + _ => None, + }) + .find(|name| name.text() == ty_text) + .map(|name| name.text()[1..].parse().expect("generic name is T")); + TypeIr { init: init.syntax().text().to_string(), + generic, type_info: TypeInfo { ty: ty.syntax().text().to_string(), is_refcount_pointer, From 935a490378f1fc9f5297268d2f7a73aa5d3a8ff6 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:05:35 +0100 Subject: [PATCH 12/62] Update tests --- tests/unit/out/refcount/inet_pton_ntop.rs | 8 +-- tests/unit/out/refcount/netdb.rs | 26 ++++++---- .../out/refcount/socket_transparent_union.rs | 4 +- tests/unit/out/refcount/sockopt.rs | 4 +- tests/unit/out/refcount/sys_stat.rs | 17 ++++--- tests/unit/out/refcount/sys_time.rs | 50 +++++++++---------- tests/unit/out/unsafe/class_templates.rs | 18 +++---- tests/unit/out/unsafe/inet_pton_ntop.rs | 6 +-- .../out/unsafe/libc_struct_without_default.rs | 4 +- tests/unit/out/unsafe/map_copy.rs | 6 ++- tests/unit/out/unsafe/netdb.rs | 10 ++-- .../out/unsafe/socket_transparent_union.rs | 10 ++-- tests/unit/out/unsafe/sockopt.rs | 8 +-- tests/unit/out/unsafe/string.rs | 36 ++++++------- tests/unit/out/unsafe/sys_stat.rs | 21 ++++---- tests/unit/out/unsafe/sys_time.rs | 50 +++++++++---------- tests/unit/out/unsafe/unconst.rs | 2 +- tests/unit/out/unsafe/vector.rs | 24 ++++----- .../unit/out/unsafe/vector_with_allocator.rs | 24 ++++----- 19 files changed, 175 insertions(+), 153 deletions(-) diff --git a/tests/unit/out/refcount/inet_pton_ntop.rs b/tests/unit/out/refcount/inet_pton_ntop.rs index b8ca2ddcb..b205eee62 100644 --- a/tests/unit/out/refcount/inet_pton_ntop.rs +++ b/tests/unit/out/refcount/inet_pton_ntop.rs @@ -355,7 +355,8 @@ fn main_0() -> i32 { }; match __text { Some(__s) - if (__s.len() as u32) < (::std::mem::size_of::<[i8; 64]>() as u32) => + if (__s.len() as u32) + < (::std::mem::size_of::<[i8; 64]>() as libc::socklen_t) => { let __n = __s.len(); (text.as_pointer() as Ptr).write_c_bytes(__s.as_bytes()); @@ -412,7 +413,8 @@ fn main_0() -> i32 { }; match __text { Some(__s) - if (__s.len() as u32) < (::std::mem::size_of::<[i8; 64]>() as u32) => + if (__s.len() as u32) + < (::std::mem::size_of::<[i8; 64]>() as libc::socklen_t) => { let __n = __s.len(); (text.as_pointer() as Ptr).write_c_bytes(__s.as_bytes()); @@ -462,7 +464,7 @@ fn main_0() -> i32 { None }; match __text { - Some(__s) if (__s.len() as u32) < 4_u32 => { + Some(__s) if (__s.len() as u32) < (4 as libc::socklen_t) => { let __n = __s.len(); (text.as_pointer() as Ptr).write_c_bytes(__s.as_bytes()); elem!((text.as_pointer() as Ptr::), __n).write(0); diff --git a/tests/unit/out/refcount/netdb.rs b/tests/unit/out/refcount/netdb.rs index 4036e05b5..8e706f17f 100644 --- a/tests/unit/out/refcount/netdb.rs +++ b/tests/unit/out/refcount/netdb.rs @@ -10,7 +10,7 @@ pub fn test_ipv4_literal_0() { let hints: Value = Rc::new(RefCell::new(Default::default())); (*hints.borrow_mut()).ai_flags = 0; (*hints.borrow_mut()).ai_protocol = 0; - (*hints.borrow_mut()).ai_addrlen = 0_u32; + (*hints.borrow_mut()).ai_addrlen = 0 as libc::socklen_t; (*hints.borrow_mut()).ai_addr = Ptr::::null(); (*hints.borrow_mut()).ai_canonname = Ptr::::null(); (*hints.borrow_mut()).ai_next = Ptr::::null(); @@ -122,10 +122,13 @@ pub fn test_ipv4_literal_0() { ((8080 % 256) as u8), ]))); assert!( - (((((field_ptr!(sin, sin_port)) as Ptr).to_any().memcmp( - &((port_be.as_pointer() as Ptr::) as Ptr).to_any(), - 2_usize - ) == 0) as i32) + (((((field_ptr!(sin, sin_port)) as Ptr<::libc::in_port_t>) + .to_any() + .memcmp( + &((port_be.as_pointer() as Ptr::) as Ptr).to_any(), + 2_usize + ) + == 0) as i32) != 0) ); let addr_be: Value> = Rc::new(RefCell::new(Box::new([127_u8, 0_u8, 0_u8, 1_u8]))); @@ -157,7 +160,7 @@ pub fn test_ipv6_literal_1() { let hints: Value = Rc::new(RefCell::new(Default::default())); (*hints.borrow_mut()).ai_flags = 0; (*hints.borrow_mut()).ai_protocol = 0; - (*hints.borrow_mut()).ai_addrlen = 0_u32; + (*hints.borrow_mut()).ai_addrlen = 0 as libc::socklen_t; (*hints.borrow_mut()).ai_addr = Ptr::::null(); (*hints.borrow_mut()).ai_canonname = Ptr::::null(); (*hints.borrow_mut()).ai_next = Ptr::::null(); @@ -268,10 +271,13 @@ pub fn test_ipv6_literal_1() { ((443 % 256) as u8), ]))); assert!( - (((((field_ptr!(sin6, sin6_port)) as Ptr).to_any().memcmp( - &((port_be.as_pointer() as Ptr::) as Ptr).to_any(), - 2_usize - ) == 0) as i32) + (((((field_ptr!(sin6, sin6_port)) as Ptr<::libc::in_port_t>) + .to_any() + .memcmp( + &((port_be.as_pointer() as Ptr::) as Ptr).to_any(), + 2_usize + ) + == 0) as i32) != 0) ); let addr_be: Value> = Rc::new(RefCell::new(Box::new([ diff --git a/tests/unit/out/refcount/socket_transparent_union.rs b/tests/unit/out/refcount/socket_transparent_union.rs index 7ab27144f..e7c543011 100644 --- a/tests/unit/out/refcount/socket_transparent_union.rs +++ b/tests/unit/out/refcount/socket_transparent_union.rs @@ -13,7 +13,7 @@ pub fn main() { fn main_0() -> i32 { let mut fd: i32 = 0; let ssloc: Value = Rc::new(RefCell::new(Default::default())); - let slen: Value = Rc::new(RefCell::new((128usize as u32))); + let slen: Value = Rc::new(RefCell::new((128usize as libc::socklen_t))); assert!( (((match nix::sys::socket::getsockname::(fd) { Ok(__ss) => { @@ -32,7 +32,7 @@ fn main_0() -> i32 { != 0) ); let sin: Value = Rc::new(RefCell::new(Default::default())); - let inlen: Value = Rc::new(RefCell::new((16usize as u32))); + let inlen: Value = Rc::new(RefCell::new((16usize as libc::socklen_t))); assert!( (((match nix::sys::socket::getsockname::(fd) { Ok(__ss) => { diff --git a/tests/unit/out/refcount/sockopt.rs b/tests/unit/out/refcount/sockopt.rs index 0ae5ab606..e44aa4e4b 100644 --- a/tests/unit/out/refcount/sockopt.rs +++ b/tests/unit/out/refcount/sockopt.rs @@ -61,7 +61,9 @@ fn main_0() -> i32 { != 0) ); let err: Value = Rc::new(RefCell::new(-1_i32)); - let len: Value = Rc::new(RefCell::new((::std::mem::size_of::() as u32))); + let len: Value = Rc::new(RefCell::new( + (::std::mem::size_of::() as libc::socklen_t), + )); assert!( (((match (libc::SOL_SOCKET, libc::SO_ERROR) { (::libc::SOL_SOCKET, ::libc::SO_ERROR) => { diff --git a/tests/unit/out/refcount/sys_stat.rs b/tests/unit/out/refcount/sys_stat.rs index 4f8e92c3c..968a3f2e0 100644 --- a/tests/unit/out/refcount/sys_stat.rs +++ b/tests/unit/out/refcount/sys_stat.rs @@ -132,16 +132,19 @@ pub fn test_st_mtime_access_2() { assert!( ((((field_ptr!((st.as_pointer() as Ptr), st_mtime).read()) == 9_i64) as i32) != 0) ); - let mut mtime: Ptr = (field_ptr!((st.as_pointer() as Ptr), st_mtime)); - mtime.write(10_i64); + let mut mtime: Ptr<::libc::time_t> = + (field_ptr!((st.as_pointer() as Ptr), st_mtime)).reinterpret_cast::<::libc::time_t>(); + mtime.write((10 as ::libc::time_t)); assert!( ((((field_ptr!((st.as_pointer() as Ptr), st_mtime).read()) == 10_i64) as i32) != 0) ); - let mut mtime_via_ptr: Ptr = (field_ptr!(((sp).clone() as Ptr), st_mtime)); - mtime_via_ptr.write(11_i64); - assert!(((((mtime.read()) == 11_i64) as i32) != 0)); - let mut copy: i64 = (field_ptr!(((sp).clone() as Ptr), st_mtime).read()); - assert!((((copy == 11_i64) as i32) != 0)); + let mut mtime_via_ptr: Ptr<::libc::time_t> = + (field_ptr!(((sp).clone() as Ptr), st_mtime)).reinterpret_cast::<::libc::time_t>(); + mtime_via_ptr.write((11 as ::libc::time_t)); + assert!(((((mtime.read()) == (11 as ::libc::time_t)) as i32) != 0)); + let mut copy: ::libc::time_t = + ((field_ptr!(((sp).clone() as Ptr), st_mtime).read()) as ::libc::time_t); + assert!((((copy == (11 as ::libc::time_t)) as i32) != 0)); } pub fn main() { __cpp2rust_init_globals(); diff --git a/tests/unit/out/refcount/sys_time.rs b/tests/unit/out/refcount/sys_time.rs index e0d41bfba..0bc283ce1 100644 --- a/tests/unit/out/refcount/sys_time.rs +++ b/tests/unit/out/refcount/sys_time.rs @@ -7,8 +7,8 @@ use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; pub fn test_time_0() { - let mut t1: i64 = { - let __out = Ptr::::null(); + let mut t1: ::libc::time_t = { + let __out = Ptr::<::libc::time_t>::null(); match nix::time::clock_gettime(nix::time::ClockId::CLOCK_REALTIME) { Ok(__ts) => { let __s = __ts.tv_sec(); @@ -23,8 +23,8 @@ pub fn test_time_0() { } } }; - let t2: Value = Rc::new(RefCell::new(0_i64)); - let mut t3: i64 = { + let t2: Value<::libc::time_t> = Rc::new(RefCell::new(0 as ::libc::time_t)); + let mut t3: ::libc::time_t = { let __out = (t2.as_pointer()); match nix::time::clock_gettime(nix::time::ClockId::CLOCK_REALTIME) { Ok(__ts) => { @@ -40,12 +40,12 @@ pub fn test_time_0() { } } }; - assert!((((t1 > 1500000000_i64) as i32) != 0)); + assert!((((t1 > (1500000000 as ::libc::time_t)) as i32) != 0)); assert!(((((*t2.borrow()) == t3) as i32) != 0)); assert!((((t3 >= t1) as i32) != 0)); } -pub fn print_tm_1(t: i64) { - let t: Value = Rc::new(RefCell::new(t)); +pub fn print_tm_1(t: ::libc::time_t) { + let t: Value<::libc::time_t> = Rc::new(RefCell::new(t)); let tm: Value = Rc::new(RefCell::new(Default::default())); assert!( (((!(({ @@ -81,19 +81,19 @@ pub fn print_tm_1(t: i64) { ); } pub fn test_gmtime_r_2() { - ({ print_tm_1(0_i64) }); - ({ print_tm_1(1_i64) }); - ({ print_tm_1(86399_i64) }); - ({ print_tm_1(86400_i64) }); - ({ print_tm_1(951782400_i64) }); - ({ print_tm_1(951868799_i64) }); - ({ print_tm_1(1704067199_i64) }); - ({ print_tm_1(1704067200_i64) }); - ({ print_tm_1(1721126096_i64) }); - ({ print_tm_1(4102444800_i64) }); + ({ print_tm_1(0 as ::libc::time_t) }); + ({ print_tm_1((1 as ::libc::time_t)) }); + ({ print_tm_1((86399 as ::libc::time_t)) }); + ({ print_tm_1((86400 as ::libc::time_t)) }); + ({ print_tm_1((951782400 as ::libc::time_t)) }); + ({ print_tm_1((951868799 as ::libc::time_t)) }); + ({ print_tm_1((1704067199 as ::libc::time_t)) }); + ({ print_tm_1((1704067200 as ::libc::time_t)) }); + ({ print_tm_1((1721126096 as ::libc::time_t)) }); + ({ print_tm_1((4102444800_i64 as ::libc::time_t)) }); } -pub fn print_local_tm_3(t: i64) { - let t: Value = Rc::new(RefCell::new(t)); +pub fn print_local_tm_3(t: ::libc::time_t) { + let t: Value<::libc::time_t> = Rc::new(RefCell::new(t)); let tm: Value = Rc::new(RefCell::new(Default::default())); assert!( (((!(({ @@ -135,14 +135,14 @@ pub fn print_local_tm_3(t: i64) { ); } pub fn test_localtime_r_4() { - ({ print_local_tm_3(0_i64) }); - ({ print_local_tm_3(951782400_i64) }); - ({ print_local_tm_3(1704067199_i64) }); - ({ print_local_tm_3(1721126096_i64) }); - ({ print_local_tm_3(1735689600_i64) }); + ({ print_local_tm_3(0 as ::libc::time_t) }); + ({ print_local_tm_3((951782400 as ::libc::time_t)) }); + ({ print_local_tm_3((1704067199 as ::libc::time_t)) }); + ({ print_local_tm_3((1721126096 as ::libc::time_t)) }); + ({ print_local_tm_3((1735689600 as ::libc::time_t)) }); } pub fn test_strftime_5() { - let t: Value = Rc::new(RefCell::new(1721126096_i64)); + let t: Value<::libc::time_t> = Rc::new(RefCell::new((1721126096 as ::libc::time_t))); let tm: Value = Rc::new(RefCell::new(Default::default())); assert!( (((!(({ diff --git a/tests/unit/out/unsafe/class_templates.rs b/tests/unit/out/unsafe/class_templates.rs index 070681fcf..c88653f98 100644 --- a/tests/unit/out/unsafe/class_templates.rs +++ b/tests/unit/out/unsafe/class_templates.rs @@ -15,8 +15,8 @@ impl MyContainer_int_ { pub unsafe fn empty(&self) -> bool { return self.vec_.is_empty(); } - pub unsafe fn size(&self) -> usize { - return self.vec_.len(); + pub unsafe fn size(&self) -> u64 { + return (self.vec_.len() as u64); } pub unsafe fn back_4(&mut self) -> *mut i32 { return ((self.vec_).last_mut().unwrap()); @@ -41,8 +41,8 @@ impl MyContainer_char_ { pub unsafe fn empty(&self) -> bool { return self.vec_.is_empty(); } - pub unsafe fn size(&self) -> usize { - return self.vec_.len(); + pub unsafe fn size(&self) -> u64 { + return (self.vec_.len() as u64); } pub unsafe fn back_4(&mut self) -> *mut libc::c_char { return ((self.vec_).last_mut().unwrap()); @@ -67,8 +67,8 @@ impl MyContainer_float_ { pub unsafe fn empty(&self) -> bool { return self.vec_.is_empty(); } - pub unsafe fn size(&self) -> usize { - return self.vec_.len(); + pub unsafe fn size(&self) -> u64 { + return (self.vec_.len() as u64); } pub unsafe fn back_4(&mut self) -> *mut f32 { return ((self.vec_).last_mut().unwrap()); @@ -224,7 +224,7 @@ unsafe fn main_0() -> i32 { MyContainer_int_::push_back(&mut imc, &mut _item) }); assert!( - ((unsafe { MyContainer_int_::size(&imc,) }) == (1_usize)) + ((unsafe { MyContainer_int_::size(&imc,) }) == (1_u64)) && ((*(unsafe { MyContainer_int_::back_4(&mut imc,) })) == (1)) ); (unsafe { MyContainer_int_::pop_back(&mut imc) }); @@ -236,7 +236,7 @@ unsafe fn main_0() -> i32 { MyContainer_char_::push_back(&mut cmc, &mut _item) }); assert!( - ((unsafe { MyContainer_char_::size(&cmc,) }) == (1_usize)) + ((unsafe { MyContainer_char_::size(&cmc,) }) == (1_u64)) && (((*(unsafe { MyContainer_char_::back_4(&mut cmc,) })) as i32) == (('a' as libc::c_char) as i32)) ); @@ -249,7 +249,7 @@ unsafe fn main_0() -> i32 { MyContainer_float_::push_back(&mut fmc, &mut _item) }); assert!( - ((unsafe { MyContainer_float_::size(&fmc,) }) == (1_usize)) + ((unsafe { MyContainer_float_::size(&fmc,) }) == (1_u64)) && (((*(unsafe { MyContainer_float_::back_4(&mut fmc,) })) as f64) == (1_f64)) ); (unsafe { MyContainer_float_::pop_back(&mut fmc) }); diff --git a/tests/unit/out/unsafe/inet_pton_ntop.rs b/tests/unit/out/unsafe/inet_pton_ntop.rs index 30ef355ba..e9d821ae3 100644 --- a/tests/unit/out/unsafe/inet_pton_ntop.rs +++ b/tests/unit/out/unsafe/inet_pton_ntop.rs @@ -229,7 +229,7 @@ unsafe fn main_0() -> i32 { libc::AF_INET, (four.as_mut_ptr() as *const ::libc::c_void), text.as_mut_ptr(), - (::std::mem::size_of::<[libc::c_char; 64]>() as u32), + (::std::mem::size_of::<[libc::c_char; 64]>() as libc::socklen_t), ) }, (c"10.0.0.1".as_ptr().cast_mut()).cast_const() @@ -256,7 +256,7 @@ unsafe fn main_0() -> i32 { libc::AF_INET6, (sixteen.as_mut_ptr() as *const ::libc::c_void), text.as_mut_ptr(), - (::std::mem::size_of::<[libc::c_char; 64]>() as u32), + (::std::mem::size_of::<[libc::c_char; 64]>() as libc::socklen_t), ) }, (c"::1".as_ptr().cast_mut()).cast_const() @@ -277,7 +277,7 @@ unsafe fn main_0() -> i32 { libc::AF_INET, (four.as_mut_ptr() as *const ::libc::c_void), text.as_mut_ptr(), - 4_u32, + (4 as libc::socklen_t), ) }) .is_null()) as i32) diff --git a/tests/unit/out/unsafe/libc_struct_without_default.rs b/tests/unit/out/unsafe/libc_struct_without_default.rs index d578f3cad..5da91d26c 100644 --- a/tests/unit/out/unsafe/libc_struct_without_default.rs +++ b/tests/unit/out/unsafe/libc_struct_without_default.rs @@ -51,8 +51,8 @@ unsafe fn main_0() -> i32 { assert!(((p.events as i32) == (0))); assert!(((p.revents as i32) == (2))); let mut ia: ::libc::in_addr = unsafe { std::mem::zeroed() }; - ia.s_addr = 1_u32; - assert!(((ia.s_addr) == (1_u32))); + ia.s_addr = (1 as ::libc::in_addr_t); + assert!(((ia.s_addr) == (1 as ::libc::in_addr_t))); let mut t: ::libc::tm = unsafe { std::mem::zeroed() }; t.tm_year = 124; t.tm_mon = 5; diff --git a/tests/unit/out/unsafe/map_copy.rs b/tests/unit/out/unsafe/map_copy.rs index 44337897b..d564ce35a 100644 --- a/tests/unit/out/unsafe/map_copy.rs +++ b/tests/unit/out/unsafe/map_copy.rs @@ -13,9 +13,11 @@ pub fn main() { } } unsafe fn main_0() -> i32 { - let mut a: UnsafeMap = UnsafeMap::new(); + let mut a: std_map_int__int__std_less_int___std_allocator_std_pair_const_int__int___ = + UnsafeMap::new(); (*&mut (*a.get_or_insert_with(1.clone(), || (1, ::default()))).1) = 10; - let mut b: UnsafeMap = a.clone(); + let mut b: std_map_int__int__std_less_int___std_allocator_std_pair_const_int__int___ = + a.clone(); (*&mut (*b.get_or_insert_with(1.clone(), || (1, ::default()))).1) = 20; assert!(((*&mut (*a.get_or_insert_with(1.clone(), || (1, ::default()))).1) == (10))); let mut x: UnsafeMap = UnsafeMap::new(); diff --git a/tests/unit/out/unsafe/netdb.rs b/tests/unit/out/unsafe/netdb.rs index 98dafb3b1..2b83826d9 100644 --- a/tests/unit/out/unsafe/netdb.rs +++ b/tests/unit/out/unsafe/netdb.rs @@ -10,7 +10,7 @@ pub unsafe fn test_ipv4_literal_0() { let mut hints: ::libc::addrinfo = unsafe { std::mem::zeroed() }; hints.ai_flags = 0; hints.ai_protocol = 0; - hints.ai_addrlen = 0_u32; + hints.ai_addrlen = 0 as libc::socklen_t; hints.ai_addr = std::ptr::null_mut(); hints.ai_canonname = std::ptr::null_mut(); hints.ai_next = std::ptr::null_mut(); @@ -40,7 +40,8 @@ pub unsafe fn test_ipv4_literal_0() { assert!( (((({ let sa = core::slice::from_raw_parts( - ((&mut (*sin).sin_port as *mut u16) as *const ::libc::c_void) as *const u8, + ((&mut (*sin).sin_port as *mut ::libc::in_port_t) as *const ::libc::c_void) + as *const u8, 2_usize as usize, ); let sb = core::slice::from_raw_parts( @@ -87,7 +88,7 @@ pub unsafe fn test_ipv6_literal_1() { let mut hints: ::libc::addrinfo = unsafe { std::mem::zeroed() }; hints.ai_flags = 0; hints.ai_protocol = 0; - hints.ai_addrlen = 0_u32; + hints.ai_addrlen = 0 as libc::socklen_t; hints.ai_addr = std::ptr::null_mut(); hints.ai_canonname = std::ptr::null_mut(); hints.ai_next = std::ptr::null_mut(); @@ -117,7 +118,8 @@ pub unsafe fn test_ipv6_literal_1() { assert!( (((({ let sa = core::slice::from_raw_parts( - ((&mut (*sin6).sin6_port as *mut u16) as *const ::libc::c_void) as *const u8, + ((&mut (*sin6).sin6_port as *mut ::libc::in_port_t) as *const ::libc::c_void) + as *const u8, 2_usize as usize, ); let sb = core::slice::from_raw_parts( diff --git a/tests/unit/out/unsafe/socket_transparent_union.rs b/tests/unit/out/unsafe/socket_transparent_union.rs index 64f5614fb..fe9a8a347 100644 --- a/tests/unit/out/unsafe/socket_transparent_union.rs +++ b/tests/unit/out/unsafe/socket_transparent_union.rs @@ -15,22 +15,24 @@ pub fn main() { unsafe fn main_0() -> i32 { let mut fd: i32 = 0; let mut ssloc: libc::sockaddr_storage = unsafe { std::mem::zeroed() }; - let mut slen: u32 = (::std::mem::size_of::() as u32); + let mut slen: libc::socklen_t = + (::std::mem::size_of::() as libc::socklen_t); assert!( ((((libc::getsockname( fd, ((&mut ssloc as *mut libc::sockaddr_storage) as *mut libc::sockaddr), - (&mut slen as *mut u32) + (&mut slen as *mut libc::socklen_t) )) == (-1_i32)) as i32) != 0) ); let mut sin: ::libc::sockaddr_in = unsafe { std::mem::zeroed() }; - let mut inlen: u32 = (::std::mem::size_of::<::libc::sockaddr_in>() as u32); + let mut inlen: libc::socklen_t = + (::std::mem::size_of::<::libc::sockaddr_in>() as libc::socklen_t); assert!( ((((libc::getsockname( fd, ((&mut sin as *mut ::libc::sockaddr_in) as *mut libc::sockaddr), - (&mut inlen as *mut u32) + (&mut inlen as *mut libc::socklen_t) )) == (-1_i32)) as i32) != 0) ); diff --git a/tests/unit/out/unsafe/sockopt.rs b/tests/unit/out/unsafe/sockopt.rs index 2ed618ad8..0d6085a8b 100644 --- a/tests/unit/out/unsafe/sockopt.rs +++ b/tests/unit/out/unsafe/sockopt.rs @@ -22,7 +22,7 @@ unsafe fn main_0() -> i32 { libc::SOL_SOCKET, libc::SO_KEEPALIVE, ((&mut on as *mut i32) as *const ::libc::c_void), - (::std::mem::size_of::() as u32) + (::std::mem::size_of::() as libc::socklen_t) )) == (0)) as i32) != 0) ); @@ -32,19 +32,19 @@ unsafe fn main_0() -> i32 { libc::IPPROTO_TCP, libc::TCP_NODELAY, ((&mut on as *mut i32) as *const ::libc::c_void), - (::std::mem::size_of::() as u32) + (::std::mem::size_of::() as libc::socklen_t) )) == (0)) as i32) != 0) ); let mut err: i32 = -1_i32; - let mut len: u32 = (::std::mem::size_of::() as u32); + let mut len: libc::socklen_t = (::std::mem::size_of::() as libc::socklen_t); assert!( ((((libc::getsockopt( s, libc::SOL_SOCKET, libc::SO_ERROR, ((&mut err as *mut i32) as *mut ::libc::c_void), - (&mut len as *mut u32) + (&mut len as *mut libc::socklen_t) )) == (0)) as i32) != 0) ); diff --git a/tests/unit/out/unsafe/string.rs b/tests/unit/out/unsafe/string.rs index eb2fe255e..1331fc424 100644 --- a/tests/unit/out/unsafe/string.rs +++ b/tests/unit/out/unsafe/string.rs @@ -272,7 +272,7 @@ unsafe fn main_0() -> i32 { assert!(((substr_2[(5_usize)] as i32) == (('f' as libc::c_char) as i32))); assert!(((substr_2[(6_usize)] as i32) == (('o' as libc::c_char) as i32))); assert!(((substr_2[(7_usize)] as i32) == (('o' as libc::c_char) as i32))); - let mut pos: usize = match result.iter().rposition(|&c| { + let mut pos: u64 = (match result.iter().rposition(|&c| { ::std::ffi::CStr::from_ptr(c"b".as_ptr()) .to_str() .unwrap() @@ -280,9 +280,9 @@ unsafe fn main_0() -> i32 { }) { Some(idx) => idx, None => usize::MAX, - }; - assert!(((pos) == (0_usize))); - pos = match result.iter().rposition(|&c| { + } as u64); + assert!(((pos) == (0_u64))); + pos = (match result.iter().rposition(|&c| { ::std::ffi::CStr::from_ptr(c"f".as_ptr()) .to_str() .unwrap() @@ -290,9 +290,9 @@ unsafe fn main_0() -> i32 { }) { Some(idx) => idx, None => usize::MAX, - }; - assert!(((pos) == (5_usize))); - pos = match result.iter().rposition(|&c| { + } as u64); + assert!(((pos) == (5_u64))); + pos = (match result.iter().rposition(|&c| { ::std::ffi::CStr::from_ptr(c"o".as_ptr()) .to_str() .unwrap() @@ -300,9 +300,9 @@ unsafe fn main_0() -> i32 { }) { Some(idx) => idx, None => usize::MAX, - }; - assert!(((pos) == (7_usize))); - pos = match result.iter().rposition(|&c| { + } as u64); + assert!(((pos) == (7_u64))); + pos = (match result.iter().rposition(|&c| { ::std::ffi::CStr::from_ptr(c"x".as_ptr()) .to_str() .unwrap() @@ -310,8 +310,8 @@ unsafe fn main_0() -> i32 { }) { Some(idx) => idx, None => usize::MAX, - }; - assert!(((pos) == ((-1_i64 as u64) as usize))); + } as u64); + assert!(((pos) == (-1_i64 as u64))); let mut string_to_cast: Vec = { let s = c"cast".as_ptr(); std::slice::from_raw_parts(s, (0..).take_while(|&i| *s.add(i) != 0).count() + 1).to_vec() @@ -322,12 +322,12 @@ unsafe fn main_0() -> i32 { assert!((((*output_data.offset((1) as isize)) as i32) == (('a' as libc::c_char) as i32))); assert!((((*output_data.offset((2) as isize)) as i32) == (('s' as libc::c_char) as i32))); assert!((((*output_data.offset((3) as isize)) as i32) == (('t' as libc::c_char) as i32))); - let mut t0: usize = (s1.len() - 1); - let mut t1: usize = (t0).wrapping_add(((*p1) as usize)); - let mut t2: usize = (t1).wrapping_add((s2.len() - 1)); - let mut t3: usize = (t2).wrapping_add((s3.len() - 1)); - let mut t4: usize = (t3).wrapping_add((s4.len() - 1)); - assert!((((t4).wrapping_add((s5.len() - 1))) == (139_usize))); + let mut t0: u64 = ((s1.len() - 1) as u64); + let mut t1: u64 = (t0).wrapping_add(((*p1) as u64)); + let mut t2: u64 = ((t1 as usize).wrapping_add((s2.len() - 1)) as u64); + let mut t3: u64 = ((t2 as usize).wrapping_add((s3.len() - 1)) as u64); + let mut t4: u64 = ((t3 as usize).wrapping_add((s4.len() - 1)) as u64); + assert!((((t4 as usize).wrapping_add((s5.len() - 1))) == (139_usize))); return 0; } pub unsafe fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/unsafe/sys_stat.rs b/tests/unit/out/unsafe/sys_stat.rs index a6930e034..8cf405fda 100644 --- a/tests/unit/out/unsafe/sys_stat.rs +++ b/tests/unit/out/unsafe/sys_stat.rs @@ -48,16 +48,19 @@ pub unsafe fn test_st_mtime_access_2() { (*&raw mut (*(&mut st as *mut ::libc::stat)).st_mtime).postfix_inc(); (*&raw mut (*(sp as *mut ::libc::stat)).st_mtime).prefix_inc(); assert!(((((*&raw mut (*(&mut st as *mut ::libc::stat)).st_mtime) == (9_i64)) as i32) != 0)); - let mut mtime: *mut i64 = - (&mut (*&raw mut (*(&mut st as *mut ::libc::stat)).st_mtime) as *mut i64); - (*mtime) = 10_i64; + let mut mtime: *mut ::libc::time_t = ((&mut (*&raw mut (*(&mut st as *mut ::libc::stat)) + .st_mtime) as *mut i64) as *mut i64) + .cast::<::libc::time_t>(); + (*mtime) = (10 as ::libc::time_t); assert!(((((*&raw mut (*(&mut st as *mut ::libc::stat)).st_mtime) == (10_i64)) as i32) != 0)); - let mut mtime_via_ptr: *mut i64 = - (&mut (*&raw mut (*(sp as *mut ::libc::stat)).st_mtime) as *mut i64); - (*mtime_via_ptr) = 11_i64; - assert!(((((*mtime) == (11_i64)) as i32) != 0)); - let mut copy: i64 = (*&raw mut (*(sp as *mut ::libc::stat)).st_mtime); - assert!(((((copy) == (11_i64)) as i32) != 0)); + let mut mtime_via_ptr: *mut ::libc::time_t = ((&mut (*&raw mut (*(sp as *mut ::libc::stat)) + .st_mtime) as *mut i64) as *mut i64) + .cast::<::libc::time_t>(); + (*mtime_via_ptr) = (11 as ::libc::time_t); + assert!(((((*mtime) == (11 as ::libc::time_t)) as i32) != 0)); + let mut copy: ::libc::time_t = + ((*&raw mut (*(sp as *mut ::libc::stat)).st_mtime) as ::libc::time_t); + assert!(((((copy) == (11 as ::libc::time_t)) as i32) != 0)); } pub fn main() { unsafe { diff --git a/tests/unit/out/unsafe/sys_time.rs b/tests/unit/out/unsafe/sys_time.rs index 19c2c0445..4196c97a6 100644 --- a/tests/unit/out/unsafe/sys_time.rs +++ b/tests/unit/out/unsafe/sys_time.rs @@ -7,18 +7,18 @@ use std::io::{Read, Seek, Write}; use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; pub unsafe fn test_time_0() { - let mut t1: i64 = libc::time(std::ptr::null_mut()); - let mut t2: i64 = 0_i64; - let mut t3: i64 = libc::time((&mut t2 as *mut i64)); - assert!(((((t1) > (1500000000_i64)) as i32) != 0)); + let mut t1: ::libc::time_t = libc::time(std::ptr::null_mut()); + let mut t2: ::libc::time_t = 0 as ::libc::time_t; + let mut t3: ::libc::time_t = libc::time((&mut t2 as *mut ::libc::time_t)); + assert!(((((t1) > (1500000000 as ::libc::time_t)) as i32) != 0)); assert!(((((t2) == (t3)) as i32) != 0)); assert!(((((t3) >= (t1)) as i32) != 0)); } -pub unsafe fn print_tm_1(mut t: i64) { +pub unsafe fn print_tm_1(mut t: ::libc::time_t) { let mut tm: ::libc::tm = unsafe { std::mem::zeroed() }; assert!( (((!((libc::gmtime_r( - (&mut t as *mut i64).cast_const(), + (&mut t as *mut ::libc::time_t).cast_const(), (&mut tm as *mut ::libc::tm) )) .is_null())) as i32) @@ -45,22 +45,22 @@ pub unsafe fn print_tm_1(mut t: i64) { }); } pub unsafe fn test_gmtime_r_2() { - (unsafe { print_tm_1(0_i64) }); - (unsafe { print_tm_1(1_i64) }); - (unsafe { print_tm_1(86399_i64) }); - (unsafe { print_tm_1(86400_i64) }); - (unsafe { print_tm_1(951782400_i64) }); - (unsafe { print_tm_1(951868799_i64) }); - (unsafe { print_tm_1(1704067199_i64) }); - (unsafe { print_tm_1(1704067200_i64) }); - (unsafe { print_tm_1(1721126096_i64) }); - (unsafe { print_tm_1(4102444800_i64) }); + (unsafe { print_tm_1(0 as ::libc::time_t) }); + (unsafe { print_tm_1((1 as ::libc::time_t)) }); + (unsafe { print_tm_1((86399 as ::libc::time_t)) }); + (unsafe { print_tm_1((86400 as ::libc::time_t)) }); + (unsafe { print_tm_1((951782400 as ::libc::time_t)) }); + (unsafe { print_tm_1((951868799 as ::libc::time_t)) }); + (unsafe { print_tm_1((1704067199 as ::libc::time_t)) }); + (unsafe { print_tm_1((1704067200 as ::libc::time_t)) }); + (unsafe { print_tm_1((1721126096 as ::libc::time_t)) }); + (unsafe { print_tm_1((4102444800_i64 as ::libc::time_t)) }); } -pub unsafe fn print_local_tm_3(mut t: i64) { +pub unsafe fn print_local_tm_3(mut t: ::libc::time_t) { let mut tm: ::libc::tm = unsafe { std::mem::zeroed() }; assert!( (((!((libc::localtime_r( - (&mut t as *mut i64).cast_const(), + (&mut t as *mut ::libc::time_t).cast_const(), (&mut tm as *mut ::libc::tm) )) .is_null())) as i32) @@ -87,18 +87,18 @@ pub unsafe fn print_local_tm_3(mut t: i64) { }); } pub unsafe fn test_localtime_r_4() { - (unsafe { print_local_tm_3(0_i64) }); - (unsafe { print_local_tm_3(951782400_i64) }); - (unsafe { print_local_tm_3(1704067199_i64) }); - (unsafe { print_local_tm_3(1721126096_i64) }); - (unsafe { print_local_tm_3(1735689600_i64) }); + (unsafe { print_local_tm_3(0 as ::libc::time_t) }); + (unsafe { print_local_tm_3((951782400 as ::libc::time_t)) }); + (unsafe { print_local_tm_3((1704067199 as ::libc::time_t)) }); + (unsafe { print_local_tm_3((1721126096 as ::libc::time_t)) }); + (unsafe { print_local_tm_3((1735689600 as ::libc::time_t)) }); } pub unsafe fn test_strftime_5() { - let mut t: i64 = 1721126096_i64; + let mut t: ::libc::time_t = (1721126096 as ::libc::time_t); let mut tm: ::libc::tm = unsafe { std::mem::zeroed() }; assert!( (((!((libc::gmtime_r( - (&mut t as *mut i64).cast_const(), + (&mut t as *mut ::libc::time_t).cast_const(), (&mut tm as *mut ::libc::tm) )) .is_null())) as i32) diff --git a/tests/unit/out/unsafe/unconst.rs b/tests/unit/out/unsafe/unconst.rs index db5e98286..a85f6b2f9 100644 --- a/tests/unit/out/unsafe/unconst.rs +++ b/tests/unit/out/unsafe/unconst.rs @@ -22,7 +22,7 @@ unsafe fn main_0() -> i32 { let a: i32 = 1; let mut p: *const i32 = (&a as *const i32); let mut q: *mut i32 = - (((((p) as *const ::libc::c_void) as u64) as *mut ::libc::c_void) as *mut i32); + (((((p) as *const ::libc::c_void) as usize) as *mut ::libc::c_void) as *mut i32); assert!(((p) == ((q).cast_const()))); let mut v: i32 = 1; let cr: *const i32 = &v; diff --git a/tests/unit/out/unsafe/vector.rs b/tests/unit/out/unsafe/vector.rs index 3a88b3ba2..fea2a3e37 100644 --- a/tests/unit/out/unsafe/vector.rs +++ b/tests/unit/out/unsafe/vector.rs @@ -29,7 +29,7 @@ unsafe fn main_0() -> i32 { assert!(!(v1.is_empty())); v1.pop(); assert!(v1.is_empty()); - let mut s1: usize = v1.len(); + let mut s1: u64 = (v1.len() as u64); { let __a0 = 100_usize as usize; v1.resize_with(__a0, || ::default()) @@ -162,7 +162,7 @@ unsafe fn main_0() -> i32 { assert!(((v2[(0_usize)]) == (100))); assert!(((v2[(1_usize)]) == (2))); assert!(((v2[(2_usize)]) == (3))); - let mut s2: usize = v2.len(); + let mut s2: u64 = (v2.len() as u64); let mut v3: Vec = vec![1; 100_usize as usize]; assert!(((v3.len()) == (100_usize))); let mut i: i32 = 0; @@ -188,10 +188,10 @@ unsafe fn main_0() -> i32 { assert!((v5[(i as usize)]).is_null()); i.prefix_inc(); } - let mut v6: Vec = vec![2_f64; s2 as usize]; - assert!(((v6.len()) == (s2))); + let mut v6: Vec = vec![2_f64; (s2 as usize) as usize]; + assert!(((v6.len()) == (s2 as usize))); let mut i: u32 = 0_u32; - 'loop_: while ((i as usize) < (s2)) { + 'loop_: while ((i as u64) < (s2)) { assert!(((v6[(i as usize)]) == (2_f64))); i.prefix_inc(); } @@ -258,18 +258,18 @@ unsafe fn main_0() -> i32 { assert!(((*((v6).last_mut().unwrap())) == (5_f64))); let mut idx: i32 = 0; assert!(((*(&mut (v6)[(idx as usize) as usize] as *mut f64)) == (2_f64))); - assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (5_f64))); - let ref1: *mut f64 = (&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64); + assert!(((*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)) == (5_f64))); + let ref1: *mut f64 = (&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64); (*ref1) += 1.5_f64; - assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (6.5_f64))); - let mut x1: f64 = (*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)); + assert!(((*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)) == (6.5_f64))); + let mut x1: f64 = (*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)); assert!(((x1) == (6.5_f64))); x1 -= 1.5_f64; - assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (6.5_f64))); + assert!(((*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)) == (6.5_f64))); assert!( ((((s1).wrapping_add(s2)) - .wrapping_add(((*(&mut (v2)[0_usize as usize] as *mut i32)) as usize))) - == (103_usize)) + .wrapping_add(((*(&mut (v2)[0_usize as usize] as *mut i32)) as u64))) + == (103_u64)) ); let mut a: S = S { x: 1 }; let mut pa: *mut S = (&mut a as *mut S); diff --git a/tests/unit/out/unsafe/vector_with_allocator.rs b/tests/unit/out/unsafe/vector_with_allocator.rs index 5e6bfd12e..326654eb3 100644 --- a/tests/unit/out/unsafe/vector_with_allocator.rs +++ b/tests/unit/out/unsafe/vector_with_allocator.rs @@ -104,7 +104,7 @@ unsafe fn main_0() -> i32 { assert!(!(v1.is_empty())); v1.pop(); assert!(v1.is_empty()); - let mut s1: usize = v1.len(); + let mut s1: u64 = (v1.len() as u64); { let __a0 = 100_usize as usize; v1.resize_with(__a0, || ::default()) @@ -152,7 +152,7 @@ unsafe fn main_0() -> i32 { assert!(((v2[(0_usize)]) == (100))); assert!(((v2[(1_usize)]) == (2))); assert!(((v2[(2_usize)]) == (3))); - let mut s2: usize = v2.len(); + let mut s2: u64 = (v2.len() as u64); let mut v3: Vec = vec![1; 100_usize as usize]; assert!(((v3.len()) == (100_usize))); let mut i: i32 = 0; @@ -160,10 +160,10 @@ unsafe fn main_0() -> i32 { assert!(((v3[(i as usize)]) == (1))); i.prefix_inc(); } - let mut v6: Vec = vec![2_f64; s2 as usize]; - assert!(((v6.len()) == (s2))); + let mut v6: Vec = vec![2_f64; (s2 as usize) as usize]; + assert!(((v6.len()) == (s2 as usize))); let mut i: u32 = 0_u32; - 'loop_: while ((i as usize) < (s2)) { + 'loop_: while ((i as u64) < (s2)) { assert!(((v6[(i as usize)]) == (2_f64))); i.prefix_inc(); } @@ -219,14 +219,14 @@ unsafe fn main_0() -> i32 { assert!(((*((v6).last_mut().unwrap())) == (5_f64))); let mut idx: i32 = 0; assert!(((*(&mut (v6)[(idx as usize) as usize] as *mut f64)) == (2_f64))); - assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (5_f64))); - let ref1: *mut f64 = (&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64); + assert!(((*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)) == (5_f64))); + let ref1: *mut f64 = (&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64); (*ref1) += 1.5_f64; - assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (6.5_f64))); - let mut x1: f64 = (*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)); + assert!(((*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)) == (6.5_f64))); + let mut x1: f64 = (*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)); assert!(((x1) == (6.5_f64))); x1 -= 1.5_f64; - assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (6.5_f64))); + assert!(((*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)) == (6.5_f64))); let mut v7: Vec = Vec::new(); let mut v8: Vec = Vec::new(); { @@ -321,8 +321,8 @@ unsafe fn main_0() -> i32 { assert!(((v13[(0_usize)] as i32) == (10)) && ((v13[(4_usize)] as i32) == (50))); assert!( ((((s1).wrapping_add(s2)) - .wrapping_add(((*(&mut (v2)[0_usize as usize] as *mut i32)) as usize))) - == (103_usize)) + .wrapping_add(((*(&mut (v2)[0_usize as usize] as *mut i32)) as u64))) + == (103_u64)) ); return 0; } From 6f82e2b96e782c42c60be2158e6b640609ad6408 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:06:14 +0100 Subject: [PATCH 13/62] Don't ask derives copy on canonical type --- cpp2rust/converter/converter.cpp | 14 +++++++------- cpp2rust/converter/converter.h | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index 754d3a220..28dce2c91 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -760,13 +760,13 @@ bool Converter::IsPassThroughRule(clang::Expr *expr) const { rule->body[0]); } -bool Converter::RecordDerivesCopy(const clang::RecordDecl *decl) { +bool Converter::RecordDerivesCopy(clang::QualType type) { + auto decl = type->getAsRecordDecl(); if (auto cxx = llvm::dyn_cast(decl); cxx && cxx->isLambda()) { return false; } - if (auto rule = - RuleRegistry::Search(ctx_, ctx_.getCanonicalTagType(decl)).first) { + if (auto rule = RuleRegistry::Search(ctx_, type).first) { auto &derives = rule->type_info.derives; return std::find(derives.begin(), derives.end(), "Copy") != derives.end(); } @@ -794,8 +794,8 @@ bool Converter::RecordHasCopyableFields(const clang::RecordDecl *decl) { } // Look recursively into fields that are RecordDecl - if (auto field_record = f->getType()->getAsRecordDecl()) { - if (!RecordDerivesCopy(field_record)) { + if (f->getType()->getAsRecordDecl()) { + if (!RecordDerivesCopy(f->getType())) { return false; } } @@ -4213,8 +4213,8 @@ std::string Converter::GetArrayDefaultAsString(clang::QualType qual_type) { auto size_as_string = GetNumAsString(array_type->getSize()); auto element_type = array_type->getElementType(); auto element_type_as_string = GetDefaultAsString(element_type); - if (auto *rec = element_type->getAsRecordDecl()) { - if (!RecordDerivesCopy(rec)) { + if (element_type->getAsRecordDecl()) { + if (!RecordDerivesCopy(element_type)) { return std::format("std::array::from_fn::<_, {}, _>(|_| {})", size_as_string.c_str(), element_type_as_string); } diff --git a/cpp2rust/converter/converter.h b/cpp2rust/converter/converter.h index cd07a0ec8..965b6d93d 100644 --- a/cpp2rust/converter/converter.h +++ b/cpp2rust/converter/converter.h @@ -365,8 +365,8 @@ class Converter : public clang::RecursiveASTVisitor { if (ty->isBuiltinType() || ty->isEnumeralType()) { return true; } - if (auto *record = ty->getAsRecordDecl()) { - return RecordDerivesCopy(record); + if (ty->getAsRecordDecl()) { + return RecordDerivesCopy(ty); } return false; } @@ -791,7 +791,7 @@ class Converter : public clang::RecursiveASTVisitor { virtual bool TypeDerivesDefault(clang::QualType qual_type); - bool RecordDerivesCopy(const clang::RecordDecl *decl); + bool RecordDerivesCopy(clang::QualType type); bool IsPassThroughRule(clang::Expr *expr) const; From e4cdfba4bf39359e9b5ed452fbc2d605b03b75e2 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:06:37 +0100 Subject: [PATCH 14/62] Instantiate generics for types in mapper queries --- cpp2rust/converter/mapper.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/cpp2rust/converter/mapper.cpp b/cpp2rust/converter/mapper.cpp index 963ef8298..ac786715d 100644 --- a/cpp2rust/converter/mapper.cpp +++ b/cpp2rust/converter/mapper.cpp @@ -49,8 +49,14 @@ std::string InstantiateTemplate(Converter &converter, const clang::Expr *expr, } std::string Map(clang::ASTContext &ctx, clang::QualType qual_type) { - auto rule = RuleRegistry::Search(ctx, qual_type).first; - return rule ? rule->type_info.type : std::string(); + auto [rule, subs] = RuleRegistry::Search(ctx, qual_type); + if (!rule) { + return {}; + } + if (rule->generic) { + return Map(ctx, subs.at(rule->generic - 1).getAsType()); + } + return rule->type_info.type; } std::string Map(Converter &converter, clang::QualType qual_type) { @@ -65,7 +71,13 @@ std::string Map(Converter &converter, clang::QualType qual_type) { std::string MapInitializer(Converter &converter, clang::QualType qual_type) { auto [rule, subs] = RuleRegistry::Search(converter.GetASTContext(), qual_type); - if (rule && !rule->initializer.empty()) { + if (!rule) { + return {}; + } + if (rule->generic) { + return MapInitializer(converter, subs.at(rule->generic - 1).getAsType()); + } + if (!rule->initializer.empty()) { return Matcher::InstantiateTgt(converter, subs, rule->initializer); } return {}; From 2e52307ce8195ae0e29d60834f26aefdf2b7c408 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:07:07 +0100 Subject: [PATCH 15/62] Match on typedefs instead of walking the typedef chain --- cpp2rust/converter/rules/registry.cpp | 39 ++++--- cpp2rust/converter/rules/rule_keys.cpp | 23 ++-- cpp2rust/converter/rules/type_matcher.cpp | 125 ++++++++++++++-------- cpp2rust/converter/rules/type_matcher.h | 7 +- 4 files changed, 121 insertions(+), 73 deletions(-) diff --git a/cpp2rust/converter/rules/registry.cpp b/cpp2rust/converter/rules/registry.cpp index fd19c1722..0e858923a 100644 --- a/cpp2rust/converter/rules/registry.cpp +++ b/cpp2rust/converter/rules/registry.cpp @@ -3,6 +3,7 @@ #include "converter/rules/registry.h" +#include #include #include #include @@ -269,6 +270,12 @@ struct TypeRuleMatch { TypeRuleMatch findType(clang::QualType use) { TypeRuleMatch best; + use = AstMatcher::SkipInternalTypedefs(use); + if (auto tag = use->getAsTagDecl(); + tag && + (IsUserDefinedDecl(tag) || tag->hasAttr())) { + return best; + } auto consider = [&](const RuleKeys::TypeKey &key) { auto [begin, end] = types_.equal_range(key); for (auto it = begin; it != end; ++it) { @@ -277,22 +284,17 @@ TypeRuleMatch findType(clang::QualType use) { continue; } if (best.rule_decl) { - if (match->depth > best.match.depth) { - continue; + auto better = AstMatcher::MoreSpecializedType(*sema_, it->second.decl, + best.rule_decl->decl); + if (!better) { + use.dump(llvm::errs(), sema_->Context); + it->second.decl->dump(llvm::errs()); + best.rule_decl->decl->dump(llvm::errs()); + llvm::report_fatal_error( + "type matches several rules, none more specialized"); } - if (match->depth == best.match.depth) { - auto better = AstMatcher::MoreSpecializedType(*sema_, it->second.decl, - best.rule_decl->decl); - if (!better) { - use.dump(llvm::errs(), sema_->Context); - it->second.decl->dump(llvm::errs()); - best.rule_decl->decl->dump(llvm::errs()); - llvm::report_fatal_error( - "type matches several rules, none more specialized"); - } - if (better != it->second.decl) { - continue; - } + if (better != it->second.decl) { + continue; } } best = {&it->second, *std::move(match)}; @@ -301,6 +303,13 @@ TypeRuleMatch findType(clang::QualType use) { for (auto key : RuleKeys::GetTypeKeys(sema_->Context, use)) { consider(key); } + if (!best.rule_decl) { + auto spelled = AstMatcher::SpelledTypedef(use); + if (spelled && !IsUserDefinedDecl(spelled)) { + use.dump(llvm::errs(), sema_->Context); + llvm::report_fatal_error("typedef has no type rule"); + } + } return best; } diff --git a/cpp2rust/converter/rules/rule_keys.cpp b/cpp2rust/converter/rules/rule_keys.cpp index adda286d3..be050428e 100644 --- a/cpp2rust/converter/rules/rule_keys.cpp +++ b/cpp2rust/converter/rules/rule_keys.cpp @@ -42,6 +42,9 @@ const clang::Decl *getParent(clang::QualType type) { llvm::dyn_cast(record)) { return spec->getSpecializedTemplate()->getCanonicalDecl(); } + if (auto tmpl = record->getDescribedClassTemplate()) { + return tmpl->getCanonicalDecl(); + } return record->getCanonicalDecl(); } @@ -277,21 +280,17 @@ std::vector GetTypeKeys(clang::ASTContext &ctx, clang::QualType use) { record && !use->isDependentType() && !IsUserDefinedDecl(record)) { keys.push_back(kAnyClass); } - for (auto type = use;; type = type.getSingleStepDesugaredType(ctx)) { - if (auto typedef_type = - llvm::dyn_cast(type.getTypePtr())) { - if (auto owner = llvm::dyn_cast( - typedef_type->getDecl()->getDeclContext())) { - auto key = GetTypeKey(ctx.getCanonicalTagType(owner)); - if (key && !llvm::is_contained(keys, *key)) { - keys.push_back(*key); - } + if (auto typedef_type = + llvm::dyn_cast(use.getTypePtr())) { + if (auto owner = llvm::dyn_cast( + typedef_type->getDecl()->getDeclContext())) { + auto key = GetTypeKey(ctx.getCanonicalTagType(owner)); + if (key && !llvm::is_contained(keys, *key)) { + keys.push_back(*key); } } - if (type.getSingleStepDesugaredType(ctx) == type) { - return keys; - } } + return keys; } std::optional GetDeclKey(const clang::NamedDecl *decl) { diff --git a/cpp2rust/converter/rules/type_matcher.cpp b/cpp2rust/converter/rules/type_matcher.cpp index 2e397fb61..7718fc044 100644 --- a/cpp2rust/converter/rules/type_matcher.cpp +++ b/cpp2rust/converter/rules/type_matcher.cpp @@ -45,15 +45,32 @@ completeArgs(clang::Sema &sema, const clang::TypeAliasTemplateDecl *tmpl, info.CanonicalConverted.end()); } -std::vector getSugarChain(clang::ASTContext &ctx, - clang::QualType type) { - std::vector chain{type}; - for (auto next = type.getSingleStepDesugaredType(ctx); next != type; - next = type.getSingleStepDesugaredType(ctx)) { - type = next; - chain.push_back(type); - } - return chain; +clang::QualType peelUsing(clang::QualType type) { + while (auto using_type = + llvm::dyn_cast(type.getTypePtr())) { + type = using_type->desugar(); + } + return type; +} + +bool isInternal(const clang::NamedDecl *decl) { + auto &opts = decl->getASTContext().getLangOpts(); + if (decl->isReserved(opts) != clang::ReservedIdentifierStatus::NotReserved) { + return true; + } + for (auto context = decl->getDeclContext(); context; + context = context->getParent()) { + if (context->isInlineNamespace()) { + continue; + } + auto named = llvm::dyn_cast(context); + if (named && named->getIdentifier() && + named->isReserved(opts) != + clang::ReservedIdentifierStatus::NotReserved) { + return true; + } + } + return false; } const clang::Type *getSugar(clang::QualType type) { @@ -84,59 +101,75 @@ bool isSameSugar(const clang::Type *a, const clang::Type *b) { std::optional MatchType(clang::Sema &sema, clang::QualType use, const clang::NamedDecl *rule) { auto &ctx = sema.Context; - auto canonical = use.getCanonicalType().getUnqualifiedType(); + auto spelled = peelUsing(use).getUnqualifiedType(); auto tmpl = llvm::dyn_cast(rule); auto alias = tmpl ? tmpl->getTemplatedDecl() : llvm::cast(rule); auto pattern = alias->getUnderlyingType(); - auto chain = getSugarChain(ctx, use); if (!tmpl) { if (auto sugar = getSugar(pattern)) { - for (unsigned depth = 0; depth < chain.size(); ++depth) { - if (isSameSugar(chain[depth].getTypePtr(), sugar)) { - return TypeMatch{{}, depth}; - } - } - if (pattern->isBuiltinType()) { + if (!isSameSugar(spelled.getTypePtr(), sugar)) { return std::nullopt; } + return TypeMatch{}; } - if (pattern.getCanonicalType().getUnqualifiedType() != canonical) { + if (getSugar(spelled) || !ctx.hasSameUnqualifiedType(pattern, spelled)) { return std::nullopt; } - return TypeMatch{{}, kCanonicalDepth}; + return TypeMatch{}; } auto params = tmpl->getTemplateParameters(); if (auto member = pattern->getAs()) { auto qualifier = member->getQualifier().getAsType(); - for (unsigned depth = 0; depth < chain.size() && qualifier; ++depth) { - auto typedef_type = - llvm::dyn_cast(chain[depth].getTypePtr()); - if (!typedef_type || - typedef_type->getDecl()->getIdentifier() != member->getIdentifier()) { - continue; - } - auto owner = llvm::dyn_cast( - typedef_type->getDecl()->getDeclContext()); - if (!owner) { - continue; - } - auto args = - RuleDecls::DeduceFromType(sema, params, clang::QualType(qualifier, 0), - ctx.getCanonicalTagType(owner)); - if (args && (args = completeArgs(sema, tmpl, *std::move(args)))) { - return TypeMatch{*std::move(args), depth}; - } + auto typedef_type = + llvm::dyn_cast(spelled.getTypePtr()); + if (!qualifier || !typedef_type || + typedef_type->getDecl()->getIdentifier() != member->getIdentifier()) { + return std::nullopt; + } + auto owner = llvm::dyn_cast( + typedef_type->getDecl()->getDeclContext()); + if (!owner) { + return std::nullopt; + } + auto args = + RuleDecls::DeduceFromType(sema, params, clang::QualType(qualifier, 0), + ctx.getCanonicalTagType(owner)); + if (args && (args = completeArgs(sema, tmpl, *std::move(args)))) { + return TypeMatch{*std::move(args)}; } return std::nullopt; } - auto args = RuleDecls::DeduceFromType(sema, params, pattern, canonical); + if (getSugar(spelled) && !pattern->getAs()) { + return std::nullopt; + } + auto args = RuleDecls::DeduceFromType(sema, params, pattern, spelled); if (args && (args = completeArgs(sema, tmpl, *std::move(args)))) { - return TypeMatch{*std::move(args), kCanonicalDepth}; + return TypeMatch{*std::move(args)}; } return std::nullopt; } +clang::QualType SkipInternalTypedefs(clang::QualType use) { + auto cvr = use.getLocalCVRQualifiers(); + auto type = peelUsing(use); + while (auto typedef_type = + llvm::dyn_cast(type.getTypePtr())) { + if (!isInternal(typedef_type->getDecl())) { + break; + } + type = peelUsing(typedef_type->desugar()); + cvr |= type.getLocalCVRQualifiers(); + } + return type.withCVRQualifiers(cvr); +} + +const clang::TypedefNameDecl *SpelledTypedef(clang::QualType use) { + auto sugar = getSugar(peelUsing(use)); + auto typedef_type = llvm::dyn_cast_or_null(sugar); + return typedef_type ? typedef_type->getDecl() : nullptr; +} + const clang::NamedDecl *MoreSpecializedType(clang::Sema &sema, const clang::NamedDecl *a, const clang::NamedDecl *b) { @@ -151,12 +184,18 @@ const clang::NamedDecl *MoreSpecializedType(clang::Sema &sema, auto a_alias = llvm::dyn_cast(a); auto b_alias = llvm::dyn_cast(b); if (a_alias && b_alias) { + auto ordered = [](const clang::TypeAliasTemplateDecl *alias) { + auto type = alias->getTemplatedDecl()->getUnderlyingType(); + if (auto member = type->getAs()) { + return clang::QualType(member->getQualifier().getAsType(), 0); + } + return type; + }; auto instance_of = [&](const clang::TypeAliasTemplateDecl *x, const clang::TypeAliasTemplateDecl *y) { - return RuleDecls::DeduceFromType( - sema, y->getTemplateParameters(), - y->getTemplatedDecl()->getUnderlyingType(), - x->getTemplatedDecl()->getUnderlyingType().getCanonicalType()) + return RuleDecls::DeduceFromType(sema, y->getTemplateParameters(), + ordered(y), + ordered(x).getCanonicalType()) .has_value(); }; bool a_of_b = instance_of(a_alias, b_alias); diff --git a/cpp2rust/converter/rules/type_matcher.h b/cpp2rust/converter/rules/type_matcher.h index fabc896c7..f35b44563 100644 --- a/cpp2rust/converter/rules/type_matcher.h +++ b/cpp2rust/converter/rules/type_matcher.h @@ -12,16 +12,17 @@ #include namespace cpp2rust::AstMatcher { -inline constexpr unsigned kCanonicalDepth = -1u; - struct TypeMatch { std::vector args; - unsigned depth; }; std::optional MatchType(clang::Sema &sema, clang::QualType use, const clang::NamedDecl *rule); +clang::QualType SkipInternalTypedefs(clang::QualType use); + +const clang::TypedefNameDecl *SpelledTypedef(clang::QualType use); + const clang::NamedDecl *MoreSpecializedType(clang::Sema &sema, const clang::NamedDecl *a, const clang::NamedDecl *b); From 926f068c885525699c8a277d6162dd88f6d4cd46 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:12:07 +0100 Subject: [PATCH 16/62] Don't visit system headers in address taken visitor --- cpp2rust/converter/models/boxed_vars.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cpp2rust/converter/models/boxed_vars.cpp b/cpp2rust/converter/models/boxed_vars.cpp index d0ef168c2..e5c13c981 100644 --- a/cpp2rust/converter/models/boxed_vars.cpp +++ b/cpp2rust/converter/models/boxed_vars.cpp @@ -251,6 +251,9 @@ class AddressTakenVisitor } void AddressTaken(const clang::ValueDecl *decl) { + if (!IsUserDefinedDecl(decl)) { + return; + } if (auto *var = clang::dyn_cast(decl); var && CanUnbox(ctx_, var)) { address_taken_.insert(var); From e8fa99b047d48ace5f87bfa9b90c0d8fecc97de4 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:12:18 +0100 Subject: [PATCH 17/62] Add more types --- rules/deque/src.cpp | 2 ++ rules/deque/tgt_unsafe.rs | 4 ++++ rules/iterator/src.cpp | 3 +++ rules/iterator/tgt_unsafe.rs | 4 ++++ rules/pair/src.cpp | 6 ++++++ rules/pair/tgt_unsafe.rs | 8 ++++++++ 6 files changed, 27 insertions(+) diff --git a/rules/deque/src.cpp b/rules/deque/src.cpp index 2b4ce2f65..6f1df76d4 100644 --- a/rules/deque/src.cpp +++ b/rules/deque/src.cpp @@ -10,6 +10,8 @@ template using t1 = std::deque; template using t2 = typename std::deque::size_type; +template using t3 = typename std::deque::value_type; + template T1 &f1(std::deque &o) { return o.back(); } template T1 &f2(std::deque &o) { return o.front(); } diff --git a/rules/deque/tgt_unsafe.rs b/rules/deque/tgt_unsafe.rs index 85a1eafc4..028601c28 100644 --- a/rules/deque/tgt_unsafe.rs +++ b/rules/deque/tgt_unsafe.rs @@ -13,6 +13,10 @@ fn t2() -> usize { 0_usize } +fn t3() -> T1 { + unimplemented!() +} + unsafe fn f1(a0: &mut Vec) -> *const T1 { (a0.last_mut().unwrap()) } diff --git a/rules/iterator/src.cpp b/rules/iterator/src.cpp index b8a3da27d..154be6b43 100644 --- a/rules/iterator/src.cpp +++ b/rules/iterator/src.cpp @@ -5,3 +5,6 @@ template using t1 = typename std::iterator_traits::difference_type; + +template +using t2 = typename std::move_iterator::iterator_type; diff --git a/rules/iterator/tgt_unsafe.rs b/rules/iterator/tgt_unsafe.rs index 9dec46f41..1710aaf37 100644 --- a/rules/iterator/tgt_unsafe.rs +++ b/rules/iterator/tgt_unsafe.rs @@ -4,3 +4,7 @@ fn t1() -> isize { 0_isize } + +fn t2() -> T1 { + unimplemented!() +} diff --git a/rules/pair/src.cpp b/rules/pair/src.cpp index b81a3c3ac..f085066f6 100644 --- a/rules/pair/src.cpp +++ b/rules/pair/src.cpp @@ -5,6 +5,12 @@ template using t1 = std::pair; +template +using t2 = typename std::tuple_element<0, std::pair>::type; + +template +using t3 = typename std::tuple_element<1, std::pair>::type; + template std::pair f2(const std::pair &a0) { return std::pair(a0); diff --git a/rules/pair/tgt_unsafe.rs b/rules/pair/tgt_unsafe.rs index c9c5bcff5..0604e0552 100644 --- a/rules/pair/tgt_unsafe.rs +++ b/rules/pair/tgt_unsafe.rs @@ -5,6 +5,14 @@ fn t1() -> (T1, T2) { <(T1, T2)>::default() } +fn t2() -> T1 { + unimplemented!() +} + +fn t3() -> T2 { + unimplemented!() +} + unsafe fn f2(a0: (T1, T2)) -> (T1, T2) { a0.clone() } From 1c524ffc1b7c5f4f75bf272fb826f8883539ad9a Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:12:32 +0100 Subject: [PATCH 18/62] Abort on non-reference --- cpp2rust/converter/rules/registry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp2rust/converter/rules/registry.cpp b/cpp2rust/converter/rules/registry.cpp index 0e858923a..9f9f76a33 100644 --- a/cpp2rust/converter/rules/registry.cpp +++ b/cpp2rust/converter/rules/registry.cpp @@ -305,7 +305,7 @@ TypeRuleMatch findType(clang::QualType use) { } if (!best.rule_decl) { auto spelled = AstMatcher::SpelledTypedef(use); - if (spelled && !IsUserDefinedDecl(spelled)) { + if (spelled && !IsUserDefinedDecl(spelled) && !use->isReferenceType()) { use.dump(llvm::errs(), sema_->Context); llvm::report_fatal_error("typedef has no type rule"); } From e54e02da761617df479e34a3411398b5fec0a4e6 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:14:16 +0100 Subject: [PATCH 19/62] Update tests --- tests/unit/out/refcount/class_templates.rs | 24 ++++++------- .../refcount/libc_struct_without_default.rs | 4 +-- tests/unit/out/refcount/simple_index.rs | 2 +- tests/unit/out/refcount/string.rs | 36 +++++++++---------- tests/unit/out/refcount/vector.rs | 25 ++++++------- .../out/refcount/vector_with_allocator.rs | 25 ++++++------- 6 files changed, 59 insertions(+), 57 deletions(-) diff --git a/tests/unit/out/refcount/class_templates.rs b/tests/unit/out/refcount/class_templates.rs index f1ae3789e..ee0225f7e 100644 --- a/tests/unit/out/refcount/class_templates.rs +++ b/tests/unit/out/refcount/class_templates.rs @@ -156,7 +156,7 @@ fn main_0() -> i32 { MyContainer_int_Impl::push_back(&imc.as_pointer(), _item.as_pointer()) }); assert!( - (({ MyContainer_int_Impl::size(&imc.as_pointer(),) }) == 1_usize) + (({ MyContainer_int_Impl::size(&imc.as_pointer(),) }) == 1_u64) && ((({ MyContainer_int_Impl::back_4(&imc.as_pointer(),) }).read()) == 1) ); ({ MyContainer_int_Impl::pop_back(&imc.as_pointer()) }); @@ -168,7 +168,7 @@ fn main_0() -> i32 { MyContainer_char_Impl::push_back(&cmc.as_pointer(), _item.as_pointer()) }); assert!( - (({ MyContainer_char_Impl::size(&cmc.as_pointer(),) }) == 1_usize) + (({ MyContainer_char_Impl::size(&cmc.as_pointer(),) }) == 1_u64) && (((({ MyContainer_char_Impl::back_4(&cmc.as_pointer(),) }).read()) as i32) == (('a' as i8) as i32)) ); @@ -181,7 +181,7 @@ fn main_0() -> i32 { MyContainer_float_Impl::push_back(&fmc.as_pointer(), _item.as_pointer()) }); assert!( - (({ MyContainer_float_Impl::size(&fmc.as_pointer(),) }) == 1_usize) + (({ MyContainer_float_Impl::size(&fmc.as_pointer(),) }) == 1_u64) && (((({ MyContainer_float_Impl::back_4(&fmc.as_pointer(),) }).read()) as f64) == 1_f64) ); @@ -215,7 +215,7 @@ impl Boxed_short_Impl for Ptr { } pub trait MyContainer_char_Impl { fn empty(&self) -> bool; - fn size(&self) -> usize; + fn size(&self) -> u64; fn back_3(&self) -> Ptr { unimplemented!() } @@ -227,8 +227,8 @@ impl MyContainer_char_Impl for Ptr { fn empty(&self) -> bool { return (*(*self).upgrade().deref()).vec_.is_empty(); } - fn size(&self) -> usize { - return (*(*self).upgrade().deref()).vec_.len(); + fn size(&self) -> u64 { + return ((*(*self).upgrade().deref()).vec_.len() as u64); } fn back_4(&self) -> Ptr { return (field_ref!((*self), vec_).as_pointer() as Ptr).to_last(); @@ -246,7 +246,7 @@ impl MyContainer_char_Impl for Ptr { } pub trait MyContainer_float_Impl { fn empty(&self) -> bool; - fn size(&self) -> usize; + fn size(&self) -> u64; fn back_3(&self) -> Ptr { unimplemented!() } @@ -258,8 +258,8 @@ impl MyContainer_float_Impl for Ptr { fn empty(&self) -> bool { return (*(*self).upgrade().deref()).vec_.is_empty(); } - fn size(&self) -> usize { - return (*(*self).upgrade().deref()).vec_.len(); + fn size(&self) -> u64 { + return ((*(*self).upgrade().deref()).vec_.len() as u64); } fn back_4(&self) -> Ptr { return (field_ref!((*self), vec_).as_pointer() as Ptr).to_last(); @@ -277,7 +277,7 @@ impl MyContainer_float_Impl for Ptr { } pub trait MyContainer_int_Impl { fn empty(&self) -> bool; - fn size(&self) -> usize; + fn size(&self) -> u64; fn back_3(&self) -> Ptr { unimplemented!() } @@ -289,8 +289,8 @@ impl MyContainer_int_Impl for Ptr { fn empty(&self) -> bool { return (*(*self).upgrade().deref()).vec_.is_empty(); } - fn size(&self) -> usize { - return (*(*self).upgrade().deref()).vec_.len(); + fn size(&self) -> u64 { + return ((*(*self).upgrade().deref()).vec_.len() as u64); } fn back_4(&self) -> Ptr { return (field_ref!((*self), vec_).as_pointer() as Ptr).to_last(); diff --git a/tests/unit/out/refcount/libc_struct_without_default.rs b/tests/unit/out/refcount/libc_struct_without_default.rs index c80e7d6f5..3c9c18729 100644 --- a/tests/unit/out/refcount/libc_struct_without_default.rs +++ b/tests/unit/out/refcount/libc_struct_without_default.rs @@ -55,8 +55,8 @@ fn main_0() -> i32 { assert!((({ (*p.borrow()).events } as i32) == 0)); assert!((({ (*p.borrow()).revents } as i32) == 2)); let ia: Value = Rc::new(RefCell::new(Default::default())); - (*ia.borrow_mut()).s_addr = 1_u32; - assert!(({ (*ia.borrow()).s_addr } == 1_u32)); + (*ia.borrow_mut()).s_addr = (1 as ::libc::in_addr_t); + assert!(({ (*ia.borrow()).s_addr } == (1 as ::libc::in_addr_t))); let t: Value = Rc::new(RefCell::new(Default::default())); (*t.borrow_mut()).tm_year = 124; (*t.borrow_mut()).tm_mon = 5; diff --git a/tests/unit/out/refcount/simple_index.rs b/tests/unit/out/refcount/simple_index.rs index 9c6a8a7b4..9f87fca4d 100644 --- a/tests/unit/out/refcount/simple_index.rs +++ b/tests/unit/out/refcount/simple_index.rs @@ -12,7 +12,7 @@ pub fn main() { } fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::from([true]))); - assert!(((*v.borrow())[0_usize] as bool)); + assert!(({ (*v.borrow())[0_usize] } as bool)); return 0; } pub fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/refcount/string.rs b/tests/unit/out/refcount/string.rs index 69da8da79..c0825327f 100644 --- a/tests/unit/out/refcount/string.rs +++ b/tests/unit/out/refcount/string.rs @@ -260,38 +260,38 @@ fn main_0() -> i32 { assert!(((substr_2[5_usize] as i32) == (('f' as i8) as i32))); assert!(((substr_2[6_usize] as i32) == (('o' as i8) as i32))); assert!(((substr_2[7_usize] as i32) == (('o' as i8) as i32))); - let mut pos: usize = Ptr::::from_string_literal(b"b").with_c_str(|__lookup| { + let mut pos: u64 = (Ptr::::from_string_literal(b"b").with_c_str(|__lookup| { result .iter() .take(result.len().saturating_sub(1)) .rposition(|&x| __lookup.contains(&x)) .unwrap_or(usize::MAX) - }); - assert!((pos == 0_usize)); - pos = Ptr::::from_string_literal(b"f").with_c_str(|__lookup| { + }) as u64); + assert!((pos == 0_u64)); + pos = (Ptr::::from_string_literal(b"f").with_c_str(|__lookup| { result .iter() .take(result.len().saturating_sub(1)) .rposition(|&x| __lookup.contains(&x)) .unwrap_or(usize::MAX) - }); - assert!((pos == 5_usize)); - pos = Ptr::::from_string_literal(b"o").with_c_str(|__lookup| { + }) as u64); + assert!((pos == 5_u64)); + pos = (Ptr::::from_string_literal(b"o").with_c_str(|__lookup| { result .iter() .take(result.len().saturating_sub(1)) .rposition(|&x| __lookup.contains(&x)) .unwrap_or(usize::MAX) - }); - assert!((pos == 7_usize)); - pos = Ptr::::from_string_literal(b"x").with_c_str(|__lookup| { + }) as u64); + assert!((pos == 7_u64)); + pos = (Ptr::::from_string_literal(b"x").with_c_str(|__lookup| { result .iter() .take(result.len().saturating_sub(1)) .rposition(|&x| __lookup.contains(&x)) .unwrap_or(usize::MAX) - }); - assert!((pos == ((-1_i64 as u64) as usize))); + }) as u64); + assert!((pos == (-1_i64 as u64))); let string_to_cast: Value> = Rc::new(RefCell::new({ let mut __bytes = Ptr::::from_string_literal(b"cast").to_c_bytes(); __bytes.push(0); @@ -303,12 +303,12 @@ fn main_0() -> i32 { assert!((((elem!(output_data, 1).read()) as i32) == (('a' as i8) as i32))); assert!((((elem!(output_data, 2).read()) as i32) == (('s' as i8) as i32))); assert!((((elem!(output_data, 3).read()) as i32) == (('t' as i8) as i32))); - let mut t0: usize = ((*s1.borrow()).len() - 1); - let mut t1: usize = (t0).wrapping_add(((p1.read()) as usize)); - let mut t2: usize = (t1).wrapping_add(((*s2.borrow()).len() - 1)); - let mut t3: usize = (t2).wrapping_add(((*s3.borrow()).len() - 1)); - let mut t4: usize = (t3).wrapping_add(((*s4.borrow()).len() - 1)); - assert!(((t4).wrapping_add(((*s5.borrow()).len() - 1)) == 139_usize)); + let mut t0: u64 = (((*s1.borrow()).len() - 1) as u64); + let mut t1: u64 = (t0).wrapping_add(((p1.read()) as u64)); + let mut t2: u64 = ((t1 as usize).wrapping_add(((*s2.borrow()).len() - 1)) as u64); + let mut t3: u64 = ((t2 as usize).wrapping_add(((*s3.borrow()).len() - 1)) as u64); + let mut t4: u64 = ((t3 as usize).wrapping_add(((*s4.borrow()).len() - 1)) as u64); + assert!(((t4 as usize).wrapping_add(((*s5.borrow()).len() - 1)) == 139_usize)); return 0; } pub fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/refcount/vector.rs b/tests/unit/out/refcount/vector.rs index abe0cac47..6225b8ded 100644 --- a/tests/unit/out/refcount/vector.rs +++ b/tests/unit/out/refcount/vector.rs @@ -28,7 +28,7 @@ fn main_0() -> i32 { assert!(!(v1.is_empty())); v1.pop(); assert!(v1.is_empty()); - let mut s1: usize = v1.len(); + let mut s1: u64 = (v1.len() as u64); { let __a0 = 100_usize as usize; v1.resize_with(__a0, || ::default()) @@ -159,7 +159,7 @@ fn main_0() -> i32 { assert!(({ (*v2.borrow())[0_usize] } == 100)); assert!(({ (*v2.borrow())[1_usize] } == 2)); assert!(({ (*v2.borrow())[2_usize] } == 3)); - let mut s2: usize = (*v2.borrow()).len(); + let mut s2: u64 = ((*v2.borrow()).len() as u64); let v3: Value> = Rc::new(RefCell::new(vec![1; 100_usize as usize])); assert!(((*v3.borrow()).len() == 100_usize)); let mut i: i32 = 0; @@ -189,10 +189,10 @@ fn main_0() -> i32 { assert!(((*v5.borrow())[(i as usize)]).is_null()); i.prefix_inc(); } - let v6: Value> = Rc::new(RefCell::new(vec![2_f64; s2 as usize])); - assert!(((*v6.borrow()).len() == s2)); + let v6: Value> = Rc::new(RefCell::new(vec![2_f64; (s2 as usize) as usize])); + assert!(((*v6.borrow()).len() == (s2 as usize))); let mut i: u32 = 0_u32; - 'loop_: while ((i as usize) < s2) { + 'loop_: while ((i as u64) < s2) { assert!(({ (*v6.borrow())[(i as usize)] } == 2_f64)); i.prefix_inc(); } @@ -271,28 +271,29 @@ fn main_0() -> i32 { ); assert!( (((v6.as_pointer() as Ptr) - .offset((s2).wrapping_sub(1_usize) as isize) + .offset(((s2).wrapping_sub(1_u64) as usize) as isize) .read()) == 5_f64) ); - let ref1: Ptr = (v6.as_pointer() as Ptr).offset((s2).wrapping_sub(1_usize) as isize); + let ref1: Ptr = + (v6.as_pointer() as Ptr).offset(((s2).wrapping_sub(1_u64) as usize) as isize); { ref1.with_mut(|__v| *__v = *__v + 1.5_f64) }; assert!( (((v6.as_pointer() as Ptr) - .offset((s2).wrapping_sub(1_usize) as isize) + .offset(((s2).wrapping_sub(1_u64) as usize) as isize) .read()) == 6.5_f64) ); let mut x1: f64 = ((v6.as_pointer() as Ptr) - .offset((s2).wrapping_sub(1_usize) as isize) + .offset(((s2).wrapping_sub(1_u64) as usize) as isize) .read()); assert!((x1 == 6.5_f64)); x1 -= 1.5_f64; assert!( (((v6.as_pointer() as Ptr) - .offset((s2).wrapping_sub(1_usize) as isize) + .offset(((s2).wrapping_sub(1_u64) as usize) as isize) .read()) == 6.5_f64) ); @@ -300,8 +301,8 @@ fn main_0() -> i32 { (((s1).wrapping_add(s2)).wrapping_add( (((v2.as_pointer() as Ptr) .offset(0_usize as isize) - .read()) as usize) - ) == 103_usize) + .read()) as u64) + ) == 103_u64) ); let a: Value = Rc::new(RefCell::new(S { x: 1 })); let pa: Value> = Rc::new(RefCell::new((a.as_pointer()))); diff --git a/tests/unit/out/refcount/vector_with_allocator.rs b/tests/unit/out/refcount/vector_with_allocator.rs index 51daeadb8..eef75332d 100644 --- a/tests/unit/out/refcount/vector_with_allocator.rs +++ b/tests/unit/out/refcount/vector_with_allocator.rs @@ -73,7 +73,7 @@ fn main_0() -> i32 { assert!(!(v1.is_empty())); v1.pop(); assert!(v1.is_empty()); - let mut s1: usize = v1.len(); + let mut s1: u64 = (v1.len() as u64); { let __a0 = 100_usize as usize; v1.resize_with(__a0, || ::default()) @@ -119,7 +119,7 @@ fn main_0() -> i32 { assert!(({ (*v2.borrow())[0_usize] } == 100)); assert!(({ (*v2.borrow())[1_usize] } == 2)); assert!(({ (*v2.borrow())[2_usize] } == 3)); - let mut s2: usize = (*v2.borrow()).len(); + let mut s2: u64 = ((*v2.borrow()).len() as u64); let v3: Value> = Rc::new(RefCell::new(vec![1; 100_usize as usize])); assert!(((*v3.borrow()).len() == 100_usize)); let mut i: i32 = 0; @@ -127,10 +127,10 @@ fn main_0() -> i32 { assert!(({ (*v3.borrow())[(i as usize)] } == 1)); i.prefix_inc(); } - let v6: Value> = Rc::new(RefCell::new(vec![2_f64; s2 as usize])); - assert!(((*v6.borrow()).len() == s2)); + let v6: Value> = Rc::new(RefCell::new(vec![2_f64; (s2 as usize) as usize])); + assert!(((*v6.borrow()).len() == (s2 as usize))); let mut i: u32 = 0_u32; - 'loop_: while ((i as usize) < s2) { + 'loop_: while ((i as u64) < s2) { assert!(({ (*v6.borrow())[(i as usize)] } == 2_f64)); i.prefix_inc(); } @@ -193,28 +193,29 @@ fn main_0() -> i32 { ); assert!( (((v6.as_pointer() as Ptr) - .offset((s2).wrapping_sub(1_usize) as isize) + .offset(((s2).wrapping_sub(1_u64) as usize) as isize) .read()) == 5_f64) ); - let ref1: Ptr = (v6.as_pointer() as Ptr).offset((s2).wrapping_sub(1_usize) as isize); + let ref1: Ptr = + (v6.as_pointer() as Ptr).offset(((s2).wrapping_sub(1_u64) as usize) as isize); { ref1.with_mut(|__v| *__v = *__v + 1.5_f64) }; assert!( (((v6.as_pointer() as Ptr) - .offset((s2).wrapping_sub(1_usize) as isize) + .offset(((s2).wrapping_sub(1_u64) as usize) as isize) .read()) == 6.5_f64) ); let mut x1: f64 = ((v6.as_pointer() as Ptr) - .offset((s2).wrapping_sub(1_usize) as isize) + .offset(((s2).wrapping_sub(1_u64) as usize) as isize) .read()); assert!((x1 == 6.5_f64)); x1 -= 1.5_f64; assert!( (((v6.as_pointer() as Ptr) - .offset((s2).wrapping_sub(1_usize) as isize) + .offset(((s2).wrapping_sub(1_u64) as usize) as isize) .read()) == 6.5_f64) ); @@ -306,8 +307,8 @@ fn main_0() -> i32 { (((s1).wrapping_add(s2)).wrapping_add( (((v2.as_pointer() as Ptr) .offset(0_usize as isize) - .read()) as usize) - ) == 103_usize) + .read()) as u64) + ) == 103_u64) ); return 0; } From 388c90f9a52a10e306a8da8fd9182bed5dcb00b3 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:16:26 +0100 Subject: [PATCH 20/62] Update tests --- tests/unit/out/refcount/class_templates.rs | 24 +++++++++++----------- tests/unit/out/unsafe/class_templates.rs | 18 ++++++++-------- tests/unit/out/unsafe/map_copy.rs | 6 ++---- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/tests/unit/out/refcount/class_templates.rs b/tests/unit/out/refcount/class_templates.rs index ee0225f7e..f1ae3789e 100644 --- a/tests/unit/out/refcount/class_templates.rs +++ b/tests/unit/out/refcount/class_templates.rs @@ -156,7 +156,7 @@ fn main_0() -> i32 { MyContainer_int_Impl::push_back(&imc.as_pointer(), _item.as_pointer()) }); assert!( - (({ MyContainer_int_Impl::size(&imc.as_pointer(),) }) == 1_u64) + (({ MyContainer_int_Impl::size(&imc.as_pointer(),) }) == 1_usize) && ((({ MyContainer_int_Impl::back_4(&imc.as_pointer(),) }).read()) == 1) ); ({ MyContainer_int_Impl::pop_back(&imc.as_pointer()) }); @@ -168,7 +168,7 @@ fn main_0() -> i32 { MyContainer_char_Impl::push_back(&cmc.as_pointer(), _item.as_pointer()) }); assert!( - (({ MyContainer_char_Impl::size(&cmc.as_pointer(),) }) == 1_u64) + (({ MyContainer_char_Impl::size(&cmc.as_pointer(),) }) == 1_usize) && (((({ MyContainer_char_Impl::back_4(&cmc.as_pointer(),) }).read()) as i32) == (('a' as i8) as i32)) ); @@ -181,7 +181,7 @@ fn main_0() -> i32 { MyContainer_float_Impl::push_back(&fmc.as_pointer(), _item.as_pointer()) }); assert!( - (({ MyContainer_float_Impl::size(&fmc.as_pointer(),) }) == 1_u64) + (({ MyContainer_float_Impl::size(&fmc.as_pointer(),) }) == 1_usize) && (((({ MyContainer_float_Impl::back_4(&fmc.as_pointer(),) }).read()) as f64) == 1_f64) ); @@ -215,7 +215,7 @@ impl Boxed_short_Impl for Ptr { } pub trait MyContainer_char_Impl { fn empty(&self) -> bool; - fn size(&self) -> u64; + fn size(&self) -> usize; fn back_3(&self) -> Ptr { unimplemented!() } @@ -227,8 +227,8 @@ impl MyContainer_char_Impl for Ptr { fn empty(&self) -> bool { return (*(*self).upgrade().deref()).vec_.is_empty(); } - fn size(&self) -> u64 { - return ((*(*self).upgrade().deref()).vec_.len() as u64); + fn size(&self) -> usize { + return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { return (field_ref!((*self), vec_).as_pointer() as Ptr).to_last(); @@ -246,7 +246,7 @@ impl MyContainer_char_Impl for Ptr { } pub trait MyContainer_float_Impl { fn empty(&self) -> bool; - fn size(&self) -> u64; + fn size(&self) -> usize; fn back_3(&self) -> Ptr { unimplemented!() } @@ -258,8 +258,8 @@ impl MyContainer_float_Impl for Ptr { fn empty(&self) -> bool { return (*(*self).upgrade().deref()).vec_.is_empty(); } - fn size(&self) -> u64 { - return ((*(*self).upgrade().deref()).vec_.len() as u64); + fn size(&self) -> usize { + return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { return (field_ref!((*self), vec_).as_pointer() as Ptr).to_last(); @@ -277,7 +277,7 @@ impl MyContainer_float_Impl for Ptr { } pub trait MyContainer_int_Impl { fn empty(&self) -> bool; - fn size(&self) -> u64; + fn size(&self) -> usize; fn back_3(&self) -> Ptr { unimplemented!() } @@ -289,8 +289,8 @@ impl MyContainer_int_Impl for Ptr { fn empty(&self) -> bool { return (*(*self).upgrade().deref()).vec_.is_empty(); } - fn size(&self) -> u64 { - return ((*(*self).upgrade().deref()).vec_.len() as u64); + fn size(&self) -> usize { + return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { return (field_ref!((*self), vec_).as_pointer() as Ptr).to_last(); diff --git a/tests/unit/out/unsafe/class_templates.rs b/tests/unit/out/unsafe/class_templates.rs index c88653f98..070681fcf 100644 --- a/tests/unit/out/unsafe/class_templates.rs +++ b/tests/unit/out/unsafe/class_templates.rs @@ -15,8 +15,8 @@ impl MyContainer_int_ { pub unsafe fn empty(&self) -> bool { return self.vec_.is_empty(); } - pub unsafe fn size(&self) -> u64 { - return (self.vec_.len() as u64); + pub unsafe fn size(&self) -> usize { + return self.vec_.len(); } pub unsafe fn back_4(&mut self) -> *mut i32 { return ((self.vec_).last_mut().unwrap()); @@ -41,8 +41,8 @@ impl MyContainer_char_ { pub unsafe fn empty(&self) -> bool { return self.vec_.is_empty(); } - pub unsafe fn size(&self) -> u64 { - return (self.vec_.len() as u64); + pub unsafe fn size(&self) -> usize { + return self.vec_.len(); } pub unsafe fn back_4(&mut self) -> *mut libc::c_char { return ((self.vec_).last_mut().unwrap()); @@ -67,8 +67,8 @@ impl MyContainer_float_ { pub unsafe fn empty(&self) -> bool { return self.vec_.is_empty(); } - pub unsafe fn size(&self) -> u64 { - return (self.vec_.len() as u64); + pub unsafe fn size(&self) -> usize { + return self.vec_.len(); } pub unsafe fn back_4(&mut self) -> *mut f32 { return ((self.vec_).last_mut().unwrap()); @@ -224,7 +224,7 @@ unsafe fn main_0() -> i32 { MyContainer_int_::push_back(&mut imc, &mut _item) }); assert!( - ((unsafe { MyContainer_int_::size(&imc,) }) == (1_u64)) + ((unsafe { MyContainer_int_::size(&imc,) }) == (1_usize)) && ((*(unsafe { MyContainer_int_::back_4(&mut imc,) })) == (1)) ); (unsafe { MyContainer_int_::pop_back(&mut imc) }); @@ -236,7 +236,7 @@ unsafe fn main_0() -> i32 { MyContainer_char_::push_back(&mut cmc, &mut _item) }); assert!( - ((unsafe { MyContainer_char_::size(&cmc,) }) == (1_u64)) + ((unsafe { MyContainer_char_::size(&cmc,) }) == (1_usize)) && (((*(unsafe { MyContainer_char_::back_4(&mut cmc,) })) as i32) == (('a' as libc::c_char) as i32)) ); @@ -249,7 +249,7 @@ unsafe fn main_0() -> i32 { MyContainer_float_::push_back(&mut fmc, &mut _item) }); assert!( - ((unsafe { MyContainer_float_::size(&fmc,) }) == (1_u64)) + ((unsafe { MyContainer_float_::size(&fmc,) }) == (1_usize)) && (((*(unsafe { MyContainer_float_::back_4(&mut fmc,) })) as f64) == (1_f64)) ); (unsafe { MyContainer_float_::pop_back(&mut fmc) }); diff --git a/tests/unit/out/unsafe/map_copy.rs b/tests/unit/out/unsafe/map_copy.rs index d564ce35a..44337897b 100644 --- a/tests/unit/out/unsafe/map_copy.rs +++ b/tests/unit/out/unsafe/map_copy.rs @@ -13,11 +13,9 @@ pub fn main() { } } unsafe fn main_0() -> i32 { - let mut a: std_map_int__int__std_less_int___std_allocator_std_pair_const_int__int___ = - UnsafeMap::new(); + let mut a: UnsafeMap = UnsafeMap::new(); (*&mut (*a.get_or_insert_with(1.clone(), || (1, ::default()))).1) = 10; - let mut b: std_map_int__int__std_less_int___std_allocator_std_pair_const_int__int___ = - a.clone(); + let mut b: UnsafeMap = a.clone(); (*&mut (*b.get_or_insert_with(1.clone(), || (1, ::default()))).1) = 20; assert!(((*&mut (*a.get_or_insert_with(1.clone(), || (1, ::default()))).1) == (10))); let mut x: UnsafeMap = UnsafeMap::new(); From 213dc402fd341068c16dd53ab73803d9d712e503 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:16:38 +0100 Subject: [PATCH 21/62] Peel user defiend typedefs --- cpp2rust/converter/rules/type_matcher.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cpp2rust/converter/rules/type_matcher.cpp b/cpp2rust/converter/rules/type_matcher.cpp index 7718fc044..a67c966d0 100644 --- a/cpp2rust/converter/rules/type_matcher.cpp +++ b/cpp2rust/converter/rules/type_matcher.cpp @@ -10,6 +10,7 @@ #include #include +#include "converter/converter_lib.h" #include "converter/rules/decls.h" namespace cpp2rust::AstMatcher { @@ -155,7 +156,8 @@ clang::QualType SkipInternalTypedefs(clang::QualType use) { auto type = peelUsing(use); while (auto typedef_type = llvm::dyn_cast(type.getTypePtr())) { - if (!isInternal(typedef_type->getDecl())) { + auto decl = typedef_type->getDecl(); + if (!isInternal(decl) && !IsUserDefinedDecl(decl)) { break; } type = peelUsing(typedef_type->desugar()); From 9366436a64b60e38c14535af8daf3a983b6a32c8 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:23:41 +0100 Subject: [PATCH 22/62] Add more rules --- rules/array/src.cpp | 3 +++ rules/array/tgt_refcount.rs | 4 ++++ rules/array/tgt_unsafe.rs | 4 ++++ rules/brotli/src.c | 1 + rules/brotli/tgt_unsafe.rs | 4 ++++ rules/type_traits/src.cpp | 2 ++ rules/type_traits/tgt_unsafe.rs | 4 ++++ rules/unique_ptr/src.cpp | 2 ++ rules/unique_ptr/tgt_refcount.rs | 8 ++++++++ rules/unique_ptr/tgt_unsafe.rs | 8 ++++++++ 10 files changed, 40 insertions(+) diff --git a/rules/array/src.cpp b/rules/array/src.cpp index fac378dba..99b2a1de4 100644 --- a/rules/array/src.cpp +++ b/rules/array/src.cpp @@ -11,6 +11,9 @@ using t2 = typename std::array::size_type; template using t3 = typename std::array::value_type; +template +using t4 = typename std::array::pointer; + template const T1 *f1(const std::array &o) { return o.data(); diff --git a/rules/array/tgt_refcount.rs b/rules/array/tgt_refcount.rs index 90b46c20f..92ef35e39 100644 --- a/rules/array/tgt_refcount.rs +++ b/rules/array/tgt_refcount.rs @@ -5,6 +5,10 @@ use libcc2rs::*; use std::cell::RefCell; use std::rc::Rc; +fn t4() -> Ptr { + Ptr::null() +} + fn f1(a0: Ptr) -> Ptr { a0 } diff --git a/rules/array/tgt_unsafe.rs b/rules/array/tgt_unsafe.rs index baa127877..6ffaf012e 100644 --- a/rules/array/tgt_unsafe.rs +++ b/rules/array/tgt_unsafe.rs @@ -15,6 +15,10 @@ fn t3() -> T1 { unimplemented!() } +fn t4() -> *mut T1 { + ::std::ptr::null_mut() +} + unsafe fn f1(a0: Vec) -> *const T1 { a0.as_ptr() } diff --git a/rules/brotli/src.c b/rules/brotli/src.c index fab586d5a..70bd9f4b6 100644 --- a/rules/brotli/src.c +++ b/rules/brotli/src.c @@ -9,6 +9,7 @@ typedef BrotliEncoderMode t2; typedef struct BrotliDecoderStateStruct *t3; typedef const struct BrotliDecoderStateStruct *t4; typedef BrotliDecoderErrorCode t5; +typedef BrotliDecoderState t6; BrotliEncoderMode f1(void) { return BROTLI_MODE_FONT; } diff --git a/rules/brotli/tgt_unsafe.rs b/rules/brotli/tgt_unsafe.rs index b443db28b..e4f5280e8 100644 --- a/rules/brotli/tgt_unsafe.rs +++ b/rules/brotli/tgt_unsafe.rs @@ -21,6 +21,10 @@ fn t5() -> ::brotli_sys::BrotliDecoderErrorCode { ::brotli_sys::BROTLI_DECODER_NO_ERROR } +fn t6() -> ::brotli_sys::BrotliDecoderState { + unimplemented!() +} + unsafe fn f1() -> ::brotli_sys::BrotliEncoderMode { ::brotli_sys::BROTLI_MODE_FONT } diff --git a/rules/type_traits/src.cpp b/rules/type_traits/src.cpp index 50c586baa..9c0f1f474 100644 --- a/rules/type_traits/src.cpp +++ b/rules/type_traits/src.cpp @@ -5,3 +5,5 @@ template ::type> using t1 = typename std::remove_reference::type; + +template using t2 = typename std::enable_if::type; diff --git a/rules/type_traits/tgt_unsafe.rs b/rules/type_traits/tgt_unsafe.rs index eb48fd0c0..6fb906e66 100644 --- a/rules/type_traits/tgt_unsafe.rs +++ b/rules/type_traits/tgt_unsafe.rs @@ -4,3 +4,7 @@ fn t1() -> T1 { unimplemented!() } + +fn t2() -> T1 { + unimplemented!() +} diff --git a/rules/unique_ptr/src.cpp b/rules/unique_ptr/src.cpp index 862272727..96705680b 100644 --- a/rules/unique_ptr/src.cpp +++ b/rules/unique_ptr/src.cpp @@ -8,6 +8,8 @@ template using t1 = std::unique_ptr; template using t2 = std::unique_ptr; +template using t3 = typename std::unique_ptr::pointer; +template using t4 = typename std::unique_ptr::pointer; template T1 *f2(const std::unique_ptr &o) { return o.get(); } diff --git a/rules/unique_ptr/tgt_refcount.rs b/rules/unique_ptr/tgt_refcount.rs index 1d542bfff..20591c6a0 100644 --- a/rules/unique_ptr/tgt_refcount.rs +++ b/rules/unique_ptr/tgt_refcount.rs @@ -13,6 +13,14 @@ fn t2() -> Option>> { None } +fn t3() -> Ptr { + Ptr::null() +} + +fn t4() -> Ptr { + Ptr::null() +} + fn f1(a0: usize) -> Option>> { Some(Rc::new(RefCell::new( (0..a0).map(|_| ::default()).collect::>(), diff --git a/rules/unique_ptr/tgt_unsafe.rs b/rules/unique_ptr/tgt_unsafe.rs index 72075b95f..c29640290 100644 --- a/rules/unique_ptr/tgt_unsafe.rs +++ b/rules/unique_ptr/tgt_unsafe.rs @@ -9,6 +9,14 @@ fn t2() -> Option> { None } +fn t3() -> *mut T1 { + ::std::ptr::null_mut() +} + +fn t4() -> *mut T1 { + ::std::ptr::null_mut() +} + unsafe fn f1(a0: usize) -> Option> { Some((0..a0).map(|_| ::default()).collect::>()) } From 971091927208205d88026d170e549da8ded59b97 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:25:25 +0100 Subject: [PATCH 23/62] Add rule for add_lvalue_reference --- rules/type_traits/src.cpp | 3 +++ rules/type_traits/tgt_refcount.rs | 8 ++++++++ rules/type_traits/tgt_unsafe.rs | 4 ++++ 3 files changed, 15 insertions(+) create mode 100644 rules/type_traits/tgt_refcount.rs diff --git a/rules/type_traits/src.cpp b/rules/type_traits/src.cpp index 9c0f1f474..2b84c4616 100644 --- a/rules/type_traits/src.cpp +++ b/rules/type_traits/src.cpp @@ -7,3 +7,6 @@ template ::type> using t1 = typename std::remove_reference::type; template using t2 = typename std::enable_if::type; + +template +using t3 = typename std::add_lvalue_reference::type; diff --git a/rules/type_traits/tgt_refcount.rs b/rules/type_traits/tgt_refcount.rs new file mode 100644 index 000000000..d1f4d0d6a --- /dev/null +++ b/rules/type_traits/tgt_refcount.rs @@ -0,0 +1,8 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +use libcc2rs::*; + +fn t3() -> Ptr { + Ptr::null() +} diff --git a/rules/type_traits/tgt_unsafe.rs b/rules/type_traits/tgt_unsafe.rs index 6fb906e66..5f5ddb9fb 100644 --- a/rules/type_traits/tgt_unsafe.rs +++ b/rules/type_traits/tgt_unsafe.rs @@ -8,3 +8,7 @@ fn t1() -> T1 { fn t2() -> T1 { unimplemented!() } + +fn t3() -> *mut T1 { + ::std::ptr::null_mut() +} From f07946dde473eced8f757ae774e8f4e2d2993fad Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:27:53 +0100 Subject: [PATCH 24/62] Peel any type of sugar, not only typedef --- cpp2rust/converter/rules/registry.cpp | 6 +++--- cpp2rust/converter/rules/type_matcher.cpp | 23 +++++++++++++---------- cpp2rust/converter/rules/type_matcher.h | 6 ++++-- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/cpp2rust/converter/rules/registry.cpp b/cpp2rust/converter/rules/registry.cpp index 9f9f76a33..38280ac6b 100644 --- a/cpp2rust/converter/rules/registry.cpp +++ b/cpp2rust/converter/rules/registry.cpp @@ -270,7 +270,7 @@ struct TypeRuleMatch { TypeRuleMatch findType(clang::QualType use) { TypeRuleMatch best; - use = AstMatcher::SkipInternalTypedefs(use); + use = AstMatcher::SkipInternalTypedefs(sema_->Context, use); if (auto tag = use->getAsTagDecl(); tag && (IsUserDefinedDecl(tag) || tag->hasAttr())) { @@ -304,8 +304,8 @@ TypeRuleMatch findType(clang::QualType use) { consider(key); } if (!best.rule_decl) { - auto spelled = AstMatcher::SpelledTypedef(use); - if (spelled && !IsUserDefinedDecl(spelled) && !use->isReferenceType()) { + auto spelled = AstMatcher::SpelledTypedef(sema_->Context, use); + if (spelled && !IsUserDefinedDecl(spelled)) { use.dump(llvm::errs(), sema_->Context); llvm::report_fatal_error("typedef has no type rule"); } diff --git a/cpp2rust/converter/rules/type_matcher.cpp b/cpp2rust/converter/rules/type_matcher.cpp index a67c966d0..97fc6c116 100644 --- a/cpp2rust/converter/rules/type_matcher.cpp +++ b/cpp2rust/converter/rules/type_matcher.cpp @@ -46,10 +46,11 @@ completeArgs(clang::Sema &sema, const clang::TypeAliasTemplateDecl *tmpl, info.CanonicalConverted.end()); } -clang::QualType peelUsing(clang::QualType type) { - while (auto using_type = - llvm::dyn_cast(type.getTypePtr())) { - type = using_type->desugar(); +clang::QualType peelSugar(clang::ASTContext &ctx, clang::QualType type) { + while (!llvm::isa( + type.getTypePtr()) && + type != type.getSingleStepDesugaredType(ctx)) { + type = type.getSingleStepDesugaredType(ctx); } return type; } @@ -102,7 +103,7 @@ bool isSameSugar(const clang::Type *a, const clang::Type *b) { std::optional MatchType(clang::Sema &sema, clang::QualType use, const clang::NamedDecl *rule) { auto &ctx = sema.Context; - auto spelled = peelUsing(use).getUnqualifiedType(); + auto spelled = peelSugar(ctx, use).getUnqualifiedType(); auto tmpl = llvm::dyn_cast(rule); auto alias = tmpl ? tmpl->getTemplatedDecl() : llvm::cast(rule); @@ -151,23 +152,25 @@ std::optional MatchType(clang::Sema &sema, clang::QualType use, return std::nullopt; } -clang::QualType SkipInternalTypedefs(clang::QualType use) { +clang::QualType SkipInternalTypedefs(clang::ASTContext &ctx, + clang::QualType use) { auto cvr = use.getLocalCVRQualifiers(); - auto type = peelUsing(use); + auto type = peelSugar(ctx, use); while (auto typedef_type = llvm::dyn_cast(type.getTypePtr())) { auto decl = typedef_type->getDecl(); if (!isInternal(decl) && !IsUserDefinedDecl(decl)) { break; } - type = peelUsing(typedef_type->desugar()); + type = peelSugar(ctx, typedef_type->desugar()); cvr |= type.getLocalCVRQualifiers(); } return type.withCVRQualifiers(cvr); } -const clang::TypedefNameDecl *SpelledTypedef(clang::QualType use) { - auto sugar = getSugar(peelUsing(use)); +const clang::TypedefNameDecl *SpelledTypedef(clang::ASTContext &ctx, + clang::QualType use) { + auto sugar = getSugar(peelSugar(ctx, use)); auto typedef_type = llvm::dyn_cast_or_null(sugar); return typedef_type ? typedef_type->getDecl() : nullptr; } diff --git a/cpp2rust/converter/rules/type_matcher.h b/cpp2rust/converter/rules/type_matcher.h index f35b44563..8b5826110 100644 --- a/cpp2rust/converter/rules/type_matcher.h +++ b/cpp2rust/converter/rules/type_matcher.h @@ -19,9 +19,11 @@ struct TypeMatch { std::optional MatchType(clang::Sema &sema, clang::QualType use, const clang::NamedDecl *rule); -clang::QualType SkipInternalTypedefs(clang::QualType use); +clang::QualType SkipInternalTypedefs(clang::ASTContext &ctx, + clang::QualType use); -const clang::TypedefNameDecl *SpelledTypedef(clang::QualType use); +const clang::TypedefNameDecl *SpelledTypedef(clang::ASTContext &ctx, + clang::QualType use); const clang::NamedDecl *MoreSpecializedType(clang::Sema &sema, const clang::NamedDecl *a, From dd32055ae663f3a57dd1094224dc505a70ca0e35 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:32:33 +0100 Subject: [PATCH 25/62] ADd rule for iterator_traits reference --- rules/iterator/src.cpp | 3 +++ rules/iterator/tgt_refcount.rs | 8 ++++++++ rules/iterator/tgt_unsafe.rs | 4 ++++ 3 files changed, 15 insertions(+) create mode 100644 rules/iterator/tgt_refcount.rs diff --git a/rules/iterator/src.cpp b/rules/iterator/src.cpp index 154be6b43..fc4bbea59 100644 --- a/rules/iterator/src.cpp +++ b/rules/iterator/src.cpp @@ -8,3 +8,6 @@ using t1 = typename std::iterator_traits::difference_type; template using t2 = typename std::move_iterator::iterator_type; + +template +using t3 = typename std::iterator_traits::reference; diff --git a/rules/iterator/tgt_refcount.rs b/rules/iterator/tgt_refcount.rs new file mode 100644 index 000000000..d1f4d0d6a --- /dev/null +++ b/rules/iterator/tgt_refcount.rs @@ -0,0 +1,8 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +use libcc2rs::*; + +fn t3() -> Ptr { + Ptr::null() +} diff --git a/rules/iterator/tgt_unsafe.rs b/rules/iterator/tgt_unsafe.rs index 1710aaf37..401d4e8bc 100644 --- a/rules/iterator/tgt_unsafe.rs +++ b/rules/iterator/tgt_unsafe.rs @@ -8,3 +8,7 @@ fn t1() -> isize { fn t2() -> T1 { unimplemented!() } + +fn t3() -> *mut T1 { + ::std::ptr::null_mut() +} From 1537fcc77c2df91d17e852868fbcf02c1bfcfe47 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:34:00 +0100 Subject: [PATCH 26/62] Add rule for vector::reference --- rules/vector/src.cpp | 6 ++++++ rules/vector/tgt_refcount.rs | 8 ++++++++ rules/vector/tgt_unsafe.rs | 8 ++++++++ 3 files changed, 22 insertions(+) diff --git a/rules/vector/src.cpp b/rules/vector/src.cpp index a6eb02301..a7fea7f78 100644 --- a/rules/vector/src.cpp +++ b/rules/vector/src.cpp @@ -24,6 +24,12 @@ using t11 = typename std::vector>::value_type; using t12 = std::vector::reference; +template > +using t13 = typename std::vector::reference; + +template > +using t14 = typename std::vector::const_reference; + std::vector f38(std::size_t n, const bool &value) { return std::vector(n, value); } diff --git a/rules/vector/tgt_refcount.rs b/rules/vector/tgt_refcount.rs index bdb48977e..7a64e8e6d 100644 --- a/rules/vector/tgt_refcount.rs +++ b/rules/vector/tgt_refcount.rs @@ -5,6 +5,14 @@ use libcc2rs::*; use std::cell::RefCell; use std::rc::Rc; +fn t13() -> Ptr { + Ptr::null() +} + +fn t14() -> Ptr { + Ptr::null() +} + fn f40(a0: Ptr) -> Ptr { a0.to_end() } diff --git a/rules/vector/tgt_unsafe.rs b/rules/vector/tgt_unsafe.rs index 834c269ee..8bdaae175 100644 --- a/rules/vector/tgt_unsafe.rs +++ b/rules/vector/tgt_unsafe.rs @@ -23,6 +23,14 @@ fn t12() -> bool { false } +fn t13() -> *mut T1 { + ::std::ptr::null_mut() +} + +fn t14() -> *const T1 { + ::std::ptr::null() +} + unsafe fn f38(a0: usize, a1: bool) -> Vec { (0..(a0) as usize).map(|_| a1).collect::>() } From 2c69e2240803c5e1c2c21d47608a05075113e28b Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:34:21 +0100 Subject: [PATCH 27/62] Analyse non-builtin types as well --- cpp2rust/converter/rules/rules_loader.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cpp2rust/converter/rules/rules_loader.cpp b/cpp2rust/converter/rules/rules_loader.cpp index d1b69f724..af7872186 100644 --- a/cpp2rust/converter/rules/rules_loader.cpp +++ b/cpp2rust/converter/rules/rules_loader.cpp @@ -523,8 +523,7 @@ std::string TypeKey(clang::QualType type) { llvm::dyn_cast(type.getTypePtr())) { type = typeof_type->getUnderlyingExpr()->getType(); } - if (auto alias = type->getAs(); - alias && type.getCanonicalType()->isBuiltinType()) { + if (auto alias = type->getAs()) { return DeclKey(alias->getDecl()); } if (auto sugar = type->getAs()) { From 2e93eccf085dc1a9ba83897226f138c21acd73f8 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:41:23 +0100 Subject: [PATCH 28/62] Add more rules --- rules/array/src.cpp | 3 +++ rules/array/tgt_refcount.rs | 4 ++++ rules/array/tgt_unsafe.rs | 4 ++++ rules/string/src.cpp | 2 ++ rules/string/tgt_refcount.rs | 8 ++++++++ rules/string/tgt_unsafe.rs | 8 ++++++++ 6 files changed, 29 insertions(+) diff --git a/rules/array/src.cpp b/rules/array/src.cpp index 99b2a1de4..c9669a196 100644 --- a/rules/array/src.cpp +++ b/rules/array/src.cpp @@ -14,6 +14,9 @@ using t3 = typename std::array::value_type; template using t4 = typename std::array::pointer; +template +using t5 = typename std::array::const_pointer; + template const T1 *f1(const std::array &o) { return o.data(); diff --git a/rules/array/tgt_refcount.rs b/rules/array/tgt_refcount.rs index 92ef35e39..d480649e6 100644 --- a/rules/array/tgt_refcount.rs +++ b/rules/array/tgt_refcount.rs @@ -9,6 +9,10 @@ fn t4() -> Ptr { Ptr::null() } +fn t5() -> Ptr { + Ptr::null() +} + fn f1(a0: Ptr) -> Ptr { a0 } diff --git a/rules/array/tgt_unsafe.rs b/rules/array/tgt_unsafe.rs index 6ffaf012e..1e6ac5805 100644 --- a/rules/array/tgt_unsafe.rs +++ b/rules/array/tgt_unsafe.rs @@ -19,6 +19,10 @@ fn t4() -> *mut T1 { ::std::ptr::null_mut() } +fn t5() -> *const T1 { + ::std::ptr::null() +} + unsafe fn f1(a0: Vec) -> *const T1 { a0.as_ptr() } diff --git a/rules/string/src.cpp b/rules/string/src.cpp index 32fa17711..eda350d5e 100644 --- a/rules/string/src.cpp +++ b/rules/string/src.cpp @@ -8,6 +8,8 @@ using t1 = std::string; using t4 = std::basic_string; typedef std::string::size_type t3; +using t5 = std::string::reference; +using t6 = std::string::const_reference; std::string f1(const std::string &s, std::size_t pos, std::size_t count) { return s.substr(pos, count); diff --git a/rules/string/tgt_refcount.rs b/rules/string/tgt_refcount.rs index 98211eefd..1038e1e68 100644 --- a/rules/string/tgt_refcount.rs +++ b/rules/string/tgt_refcount.rs @@ -13,6 +13,14 @@ fn t4() -> Vec { vec![0] } +fn t5() -> Ptr { + Ptr::null() +} + +fn t6() -> Ptr { + Ptr::null() +} + fn f1(a0: Vec, a1: usize, a2: usize) -> Vec { let mut __tmp1 = a0[(a1) as usize..::std::cmp::min((a1 + a2) as usize, a0.len().saturating_sub(1))].to_vec(); diff --git a/rules/string/tgt_unsafe.rs b/rules/string/tgt_unsafe.rs index 74a096f8f..db1871597 100644 --- a/rules/string/tgt_unsafe.rs +++ b/rules/string/tgt_unsafe.rs @@ -11,6 +11,14 @@ fn t4() -> Vec { vec![0] } +fn t5() -> *mut libc::c_char { + ::std::ptr::null_mut() +} + +fn t6() -> *const libc::c_char { + ::std::ptr::null() +} + fn t3() -> usize { 0_usize } From cf4c22025c950f0b047ab1053519ae232a91d706 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:41:33 +0100 Subject: [PATCH 29/62] Add key for typedef --- cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp b/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp index 240daa824..58c7d713d 100644 --- a/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp +++ b/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp @@ -215,6 +215,9 @@ std::string ExprKey(clang::ASTContext &ctx, const clang::Decl *rule) { std::string TypeKey(const clang::TypedefNameDecl *rule) { auto type = rule->getUnderlyingType(); + if (!type->isDependentType() && type->getAs()) { + return RulesLoader::TypeKey(type); + } while (type->isPointerType() || type->isReferenceType()) { type = type->getPointeeType(); } From e73757d8cfd5e391ba7972a1fee4640e8eb1d131 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:47:46 +0100 Subject: [PATCH 30/62] Add rule for brotli --- rules/brotli/src.c | 1 + rules/brotli/tgt_unsafe.rs | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/rules/brotli/src.c b/rules/brotli/src.c index 70bd9f4b6..26fd699e3 100644 --- a/rules/brotli/src.c +++ b/rules/brotli/src.c @@ -10,6 +10,7 @@ typedef struct BrotliDecoderStateStruct *t3; typedef const struct BrotliDecoderStateStruct *t4; typedef BrotliDecoderErrorCode t5; typedef BrotliDecoderState t6; +typedef struct BrotliDecoderStateStruct t7; BrotliEncoderMode f1(void) { return BROTLI_MODE_FONT; } diff --git a/rules/brotli/tgt_unsafe.rs b/rules/brotli/tgt_unsafe.rs index e4f5280e8..219ff3bb1 100644 --- a/rules/brotli/tgt_unsafe.rs +++ b/rules/brotli/tgt_unsafe.rs @@ -25,6 +25,10 @@ fn t6() -> ::brotli_sys::BrotliDecoderState { unimplemented!() } +fn t7() -> ::brotli_sys::BrotliDecoderState { + unimplemented!() +} + unsafe fn f1() -> ::brotli_sys::BrotliEncoderMode { ::brotli_sys::BROTLI_MODE_FONT } From de35ddc7f4004a5a30670252c0261eb667caeafc Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:51:05 +0100 Subject: [PATCH 31/62] Walk typedefs in IsUserDefinedDecl --- cpp2rust/converter/converter_lib.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cpp2rust/converter/converter_lib.cpp b/cpp2rust/converter/converter_lib.cpp index 171c6f013..42c2a274e 100644 --- a/cpp2rust/converter/converter_lib.cpp +++ b/cpp2rust/converter/converter_lib.cpp @@ -274,6 +274,14 @@ bool IsUserDefinedDecl(const clang::Decl *decl) { })) { return false; } + } else if (auto tag = llvm::dyn_cast(decl)) { + if (auto definition = tag->getDefinition()) { + decl = definition; + } else if (llvm::any_of(tag->redecls(), [&](auto redecl) { + return src_mgr.isInSystemHeader(redecl->getLocation()); + })) { + return false; + } } auto src_loc = decl->getLocation(); if (auto *spec = From 35eeb83f5fee21fff96d953933e55a7643a9616c Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 15:51:14 +0100 Subject: [PATCH 32/62] Instantiate generics in Match --- cpp2rust/converter/mapper.cpp | 18 +++--------------- cpp2rust/converter/rules/registry.cpp | 3 +++ 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/cpp2rust/converter/mapper.cpp b/cpp2rust/converter/mapper.cpp index ac786715d..963ef8298 100644 --- a/cpp2rust/converter/mapper.cpp +++ b/cpp2rust/converter/mapper.cpp @@ -49,14 +49,8 @@ std::string InstantiateTemplate(Converter &converter, const clang::Expr *expr, } std::string Map(clang::ASTContext &ctx, clang::QualType qual_type) { - auto [rule, subs] = RuleRegistry::Search(ctx, qual_type); - if (!rule) { - return {}; - } - if (rule->generic) { - return Map(ctx, subs.at(rule->generic - 1).getAsType()); - } - return rule->type_info.type; + auto rule = RuleRegistry::Search(ctx, qual_type).first; + return rule ? rule->type_info.type : std::string(); } std::string Map(Converter &converter, clang::QualType qual_type) { @@ -71,13 +65,7 @@ std::string Map(Converter &converter, clang::QualType qual_type) { std::string MapInitializer(Converter &converter, clang::QualType qual_type) { auto [rule, subs] = RuleRegistry::Search(converter.GetASTContext(), qual_type); - if (!rule) { - return {}; - } - if (rule->generic) { - return MapInitializer(converter, subs.at(rule->generic - 1).getAsType()); - } - if (!rule->initializer.empty()) { + if (rule && !rule->initializer.empty()) { return Matcher::InstantiateTgt(converter, subs, rule->initializer); } return {}; diff --git a/cpp2rust/converter/rules/registry.cpp b/cpp2rust/converter/rules/registry.cpp index 38280ac6b..5ee62bb5c 100644 --- a/cpp2rust/converter/rules/registry.cpp +++ b/cpp2rust/converter/rules/registry.cpp @@ -406,6 +406,9 @@ Matcher::Match Search(clang::ASTContext &ctx, if (!match.rule_decl) { return {}; } + if (auto generic = match.rule_decl->rule.generic) { + return Search(ctx, match.match.args.at(generic - 1).getAsType()); + } return {&match.rule_decl->rule, getBindings(match.rule_decl->decl, match.match.args)}; } From 9bf41bdc23cad6031c73a4421be635395fa45ce5 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 16:00:15 +0100 Subject: [PATCH 33/62] Add rules for deque reference --- rules/deque/src.cpp | 4 ++++ rules/deque/tgt_unsafe.rs | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/rules/deque/src.cpp b/rules/deque/src.cpp index 6f1df76d4..6fde4378e 100644 --- a/rules/deque/src.cpp +++ b/rules/deque/src.cpp @@ -12,6 +12,10 @@ template using t2 = typename std::deque::size_type; template using t3 = typename std::deque::value_type; +template using t4 = typename std::deque::reference; + +template using t5 = typename std::deque::const_reference; + template T1 &f1(std::deque &o) { return o.back(); } template T1 &f2(std::deque &o) { return o.front(); } diff --git a/rules/deque/tgt_unsafe.rs b/rules/deque/tgt_unsafe.rs index 028601c28..8df65909a 100644 --- a/rules/deque/tgt_unsafe.rs +++ b/rules/deque/tgt_unsafe.rs @@ -17,6 +17,14 @@ fn t3() -> T1 { unimplemented!() } +fn t4() -> *mut T1 { + ::std::ptr::null_mut() +} + +fn t5() -> *const T1 { + ::std::ptr::null() +} + unsafe fn f1(a0: &mut Vec) -> *const T1 { (a0.last_mut().unwrap()) } From abd0dd38debea9301f792f04f7f54eef252b7369 Mon Sep 17 00:00:00 2001 From: Nuno Lopes Date: Tue, 20 Oct 2026 16:00:49 +0100 Subject: [PATCH 34/62] Fix #549: std::swap and std::sort copy elements rather than moving them in place Also, handle copy and move assignment operators --- cpp2rust/converter/converter.cpp | 16 +- cpp2rust/converter/converter_lib.cpp | 61 +- cpp2rust/converter/converter_lib.h | 10 + .../converter/models/converter_refcount.cpp | 13 +- libcc2rs-macros/src/assign.rs | 49 + libcc2rs-macros/src/lib.rs | 33 + libcc2rs/src/capture.rs | 33 + libcc2rs/src/lib.rs | 17 +- libcc2rs/src/rc.rs | 159 ++-- libcc2rs/src/swap.rs | 376 ++++++++ rules/algorithm/tgt_refcount.rs | 37 +- rules/algorithm/tgt_unsafe.rs | 6 +- rules/builtin/src.c | 2 +- .../out/refcount/defaulted_move_cross_tu.rs | 2 +- .../out/unsafe/defaulted_move_cross_tu.rs | 2 +- tests/unit/copy_assign.cpp | 29 + tests/unit/out/refcount/copy_assign.rs | 140 ++- tests/unit/out/refcount/copy_ctor.rs | 69 +- .../unit/out/refcount/copy_move_defaulted.rs | 10 +- tests/unit/out/refcount/copy_move_deleted.rs | 6 +- .../refcount/elidable_iterator_copy_cxx11.rs | 19 +- tests/unit/out/refcount/fn_ptr_stable_sort.rs | 13 +- tests/unit/out/refcount/huffman.rs | 2 +- tests/unit/out/refcount/kruskal.rs | 4 +- tests/unit/out/refcount/move_assign.rs | 2 +- .../refcount/operator_comparison_nonbool.rs | 26 +- tests/unit/out/refcount/operator_traits.rs | 44 +- tests/unit/out/refcount/rule_of_five.rs | 2 +- tests/unit/out/refcount/rule_of_three.rs | 2 +- tests/unit/out/refcount/sort.rs | 10 +- tests/unit/out/refcount/sort_no_copy.rs | 291 ++++++ tests/unit/out/refcount/stable_sort.rs | 35 +- .../refcount/structured_binding_copy_ctor.rs | 12 +- tests/unit/out/refcount/swap_malloc.rs | 53 ++ tests/unit/out/refcount/swap_map_no_copy.rs | 891 ++++++++++++++++++ tests/unit/out/refcount/unique_ptr.rs | 2 +- .../out/refcount/unique_ptr_const_deref.rs | 2 +- .../out/refcount/unique_ptr_field_reset.rs | 2 +- tests/unit/out/refcount/unique_ptr_nested.rs | 2 +- .../refcount/vector_deque_vector_string.rs | 9 +- tests/unit/out/refcount/void_cast.rs | 2 +- tests/unit/out/refcount/void_return.rs | 16 +- tests/unit/out/unsafe/copy_assign.rs | 101 +- tests/unit/out/unsafe/copy_ctor.rs | 47 +- tests/unit/out/unsafe/copy_move_defaulted.rs | 10 +- tests/unit/out/unsafe/copy_move_deleted.rs | 6 +- .../unsafe/elidable_iterator_copy_cxx11.rs | 2 +- tests/unit/out/unsafe/huffman.rs | 2 +- tests/unit/out/unsafe/kruskal.rs | 4 +- tests/unit/out/unsafe/move_assign.rs | 2 +- tests/unit/out/unsafe/rule_of_five.rs | 4 +- tests/unit/out/unsafe/rule_of_three.rs | 2 +- tests/unit/out/unsafe/sort_no_copy.rs | 262 +++++ .../unsafe/structured_binding_copy_ctor.rs | 7 +- tests/unit/out/unsafe/swap_malloc.rs | 52 + tests/unit/out/unsafe/swap_map_no_copy.rs | 546 +++++++++++ tests/unit/out/unsafe/unique_ptr.rs | 2 +- .../unit/out/unsafe/unique_ptr_const_deref.rs | 2 +- .../unit/out/unsafe/unique_ptr_field_reset.rs | 2 +- tests/unit/out/unsafe/unique_ptr_nested.rs | 2 +- tests/unit/out/unsafe/void_cast.rs | 2 +- tests/unit/sort_no_copy.cpp | 59 ++ tests/unit/swap_malloc.cpp | 38 + tests/unit/swap_map_no_copy.cpp | 219 +++++ 64 files changed, 3614 insertions(+), 270 deletions(-) create mode 100644 libcc2rs-macros/src/assign.rs create mode 100644 libcc2rs/src/swap.rs create mode 100644 tests/unit/out/refcount/sort_no_copy.rs create mode 100644 tests/unit/out/refcount/swap_malloc.rs create mode 100644 tests/unit/out/refcount/swap_map_no_copy.rs create mode 100644 tests/unit/out/unsafe/sort_no_copy.rs create mode 100644 tests/unit/out/unsafe/swap_malloc.rs create mode 100644 tests/unit/out/unsafe/swap_map_no_copy.rs create mode 100644 tests/unit/sort_no_copy.cpp create mode 100644 tests/unit/swap_malloc.cpp create mode 100644 tests/unit/swap_map_no_copy.cpp diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index 9774cf451..974bebb81 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -793,8 +793,9 @@ bool Converter::RecordHasCopyableFields(const clang::RecordDecl *decl) { } } - // Look recursively into fields that are RecordDecl - if (auto field_record = f->getType()->getAsRecordDecl()) { + // Look recursively into fields that are RecordDecl, or arrays of them + if (auto field_record = + ctx_.getBaseElementType(f->getType())->getAsRecordDecl()) { if (!RecordDerivesCopy(field_record)) { return false; } @@ -3411,7 +3412,8 @@ bool Converter::VisitMemberExpr(clang::MemberExpr *expr) { if (is_reference_type || RuleRegistry::ReturnsPointer(ctx_, expr)) { computed_expr_type_ = ComputedExprType::Pointer; } else { - StrCat(token::kRef); + StrCat(token::kRef, + expr->getType().isConstQualified() ? "" : keyword_mut_); computed_expr_type_ = ComputedExprType::FreshPointer; } StrCat(str); @@ -4365,6 +4367,14 @@ Converter::GetStructAttributes(const clang::RecordDecl *decl) { struct_attrs.emplace_back("MoveCtorUnsafe"); } + if (HasCopyAssignOperator(decl)) { + struct_attrs.emplace_back("CopyAssignUnsafe"); + } + + if (HasMoveAssignOperator(decl)) { + struct_attrs.emplace_back("MoveAssignUnsafe"); + } + if (auto *cxx = clang::dyn_cast(decl); cxx && RecordNeedsDestruction(cxx)) { struct_attrs.emplace_back("DestructorUnsafe"); diff --git a/cpp2rust/converter/converter_lib.cpp b/cpp2rust/converter/converter_lib.cpp index 171c6f013..1ac2fc576 100644 --- a/cpp2rust/converter/converter_lib.cpp +++ b/cpp2rust/converter/converter_lib.cpp @@ -533,11 +533,61 @@ bool IsConvertibleMoveAssignment(const clang::CXXMethodDecl *method) { HasFieldWithMoveAssign(parent); } +static bool IsTranslatedCopyAssignment(const clang::CXXMethodDecl *method) { + if (!method->isCopyAssignmentOperator() || method->isDeleted() || + method->isVirtual()) { + return false; + } + return (method->isUserProvided() && IsUserDefinedDecl(method) && + method->hasBody()) || + IsConvertibleCopyAssignment(method); +} + +bool HasCopyAssignOperator(const clang::RecordDecl *decl) { + auto *cxx = clang::dyn_cast(decl); + return cxx && llvm::any_of(cxx->methods(), [](auto *method) { + return IsTranslatedCopyAssignment(method) && + CanUseCopyOrMoveName(method, "copy_assign"); + }); +} + +bool HasMoveAssignOperator(const clang::RecordDecl *decl) { + auto *cxx = clang::dyn_cast(decl); + return cxx && llvm::any_of(cxx->methods(), [](auto *method) { + return IsConvertibleMoveAssignment(method) && !method->isVirtual() && + CanUseCopyOrMoveName(method, "move_assign"); + }); +} + +// Whether a defaulted copy assignment of decl isn't an assignment of a clone +// of the source, which runs the copy constructors of the record and of its +// fields: when the record has a copy constructor, or a field (or element of +// an array field) has a copy assignment operator. +static bool NeedsDefaultedCopyAssignment(const clang::CXXRecordDecl *decl) { + return GetUserDefinedCopyConstructor(decl) || + llvm::any_of(decl->fields(), [](const clang::FieldDecl *field) { + auto *record = + field->getType()->getBaseElementTypeUnsafe()->getAsRecordDecl(); + return record && HasCopyAssignOperator(record); + }); +} + +bool IsConvertibleCopyAssignment(const clang::CXXMethodDecl *method) { + auto *parent = method->getParent(); + if (!method->isCopyAssignmentOperator() || method->isUserProvided() || + method->isDeleted() || !method->hasBody() || + !IsConvertibleImplicitMemberParent(parent)) { + return false; + } + return NeedsDefaultedCopyAssignment(parent); +} + bool IsConvertibleImplicitMember(const clang::CXXMethodDecl *method) { if (auto *ctor = clang::dyn_cast(method)) { return IsConvertibleMoveConstructor(ctor); } - return IsConvertibleMoveAssignment(method); + return IsConvertibleMoveAssignment(method) || + IsConvertibleCopyAssignment(method); } bool IsDefaultedMoveConstructor(const clang::CXXConstructorDecl *ctor) { @@ -1263,7 +1313,7 @@ bool IsImplicitAssignmentCall(const clang::CallExpr *expr) { if (method->isUserProvided() && IsUserDefinedDecl(method)) { return false; } - return !IsConvertibleMoveAssignment(method); + return !IsConvertibleImplicitMember(method); } const clang::CXXRecordDecl *AsLambdaClass(clang::QualType type) { @@ -1421,7 +1471,7 @@ bool IsUserOperatorCall(const clang::CXXOperatorCallExpr *expr) { return IsUserDefinedDecl(owner); } if (const auto *method = clang::dyn_cast(callee); - method && IsConvertibleMoveAssignment(method)) { + method && IsConvertibleImplicitMember(method)) { return true; } if (!callee->isUserProvided() || !IsUserDefinedDecl(callee)) { @@ -1554,6 +1604,11 @@ void DefineImplicitMembers(clang::Sema &sema, clang::CXXRecordDecl *decl) { !HasDefaultedCopyAssignment(decl)) { sema.DefineImplicitMoveAssignment(decl->getLocation(), method); } + if (method->isCopyAssignmentOperator() && !method->isUserProvided() && + !method->doesThisDeclarationHaveABody() && !method->isDeleted() && + NeedsDefaultedCopyAssignment(decl)) { + sema.DefineImplicitCopyAssignment(decl->getLocation(), method); + } } auto define_defaulted_comparison = [&](clang::FunctionDecl *fn) { if (!fn || !IsComparisonOperator(fn) || !fn->isDefaulted() || diff --git a/cpp2rust/converter/converter_lib.h b/cpp2rust/converter/converter_lib.h index 18b02a8b2..f98d88183 100644 --- a/cpp2rust/converter/converter_lib.h +++ b/cpp2rust/converter/converter_lib.h @@ -100,6 +100,16 @@ bool HasMoveFromConstructor(const clang::RecordDecl *decl); bool IsConvertibleMoveAssignment(const clang::CXXMethodDecl *method); +bool IsConvertibleCopyAssignment(const clang::CXXMethodDecl *method); + +// Whether decl has a copy assignment operator converted to a copy_assign +// method. +bool HasCopyAssignOperator(const clang::RecordDecl *decl); + +// Whether decl has a move assignment operator converted to a move_assign +// method. +bool HasMoveAssignOperator(const clang::RecordDecl *decl); + bool IsConvertibleImplicitMember(const clang::CXXMethodDecl *method); clang::CXXConstructorDecl * diff --git a/cpp2rust/converter/models/converter_refcount.cpp b/cpp2rust/converter/models/converter_refcount.cpp index 9a77c44f4..2a8f64aa9 100644 --- a/cpp2rust/converter/models/converter_refcount.cpp +++ b/cpp2rust/converter/models/converter_refcount.cpp @@ -2520,6 +2520,14 @@ ConverterRefCount::GetStructAttributes(const clang::RecordDecl *decl) { attrs.emplace_back("MoveCtor"); } + if (HasCopyAssignOperator(decl)) { + attrs.emplace_back("CopyAssign"); + } + + if (HasMoveAssignOperator(decl)) { + attrs.emplace_back("MoveAssign"); + } + if (auto *cxx = clang::dyn_cast(decl); cxx && RecordNeedsDestruction(cxx)) { attrs.emplace_back("Destructor"); @@ -2837,7 +2845,10 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr( ConvertSubscriptIndex(expr->getArg(1)))); } - if (is_inner_boxed) { + // The pointer to the element is already a pointer to the whole inner + // container, which as_pointer can't tell from a pointer to its first + // element without a type. + if (is_inner_boxed && (!isObject() || WantsElementPtr())) { StrCat(".as_pointer()"); if (!isObject()) { StrCat(std::format("as Ptr<{}>)", ToString(expr->getType()))); diff --git a/libcc2rs-macros/src/assign.rs b/libcc2rs-macros/src/assign.rs new file mode 100644 index 000000000..4f83875cf --- /dev/null +++ b/libcc2rs-macros/src/assign.rs @@ -0,0 +1,49 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +use proc_macro::TokenStream; +use quote::{format_ident, quote}; +use syn::{DeriveInput, parse_macro_input}; + +// Implements libcc2rs::CopyAssign or MoveAssign (or their unsafe versions) +// with the method of the same name, for `op` "copy" or "move". +pub fn expand(input: TokenStream, op: &str, is_unsafe: bool) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + let name = &input.ident; + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + let method = format_ident!("{}_assign", op); + let is_move = op == "move"; + if is_unsafe { + let tr = if is_move { + quote!(::libcc2rs::MoveAssignUnsafe) + } else { + quote!(::libcc2rs::CopyAssignUnsafe) + }; + let src_ty = if is_move { + quote!(*mut Self) + } else { + quote!(*const Self) + }; + quote! { + impl #impl_generics #tr for #name #ty_generics #where_clause { + unsafe fn #method(dst: *mut Self, src: #src_ty) { + unsafe { (*dst).#method(src) }; + } + } + } + } else { + let tr = if is_move { + quote!(::libcc2rs::MoveAssign) + } else { + quote!(::libcc2rs::CopyAssign) + }; + quote! { + impl #impl_generics #tr for #name #ty_generics #where_clause { + fn #method(dst: &::libcc2rs::Ptr, src: ::libcc2rs::Ptr) { + dst.#method(src); + } + } + } + } + .into() +} diff --git a/libcc2rs-macros/src/lib.rs b/libcc2rs-macros/src/lib.rs index 3f32dbeed..9d0076c75 100644 --- a/libcc2rs-macros/src/lib.rs +++ b/libcc2rs-macros/src/lib.rs @@ -3,6 +3,7 @@ use proc_macro::TokenStream; +mod assign; mod byte_repr; mod destructor; mod fn_ptr_arg; @@ -165,6 +166,38 @@ pub fn derive_move_ctor_unsafe(input: TokenStream) -> TokenStream { move_ctor::expand(input, true) } +// #[derive(CopyAssign, MoveAssign)] +// pub struct S { ... } +// impl SImpl for Ptr { +// fn copy_assign(&self, o: Ptr) -> Ptr { ... } +// fn move_assign(&self, o: Ptr) -> Ptr { ... } +// } +// +// Implements libcc2rs::CopyAssign and MoveAssign for S with its copy and move +// assignment operators, such that std::swap assigns the values of type S +// with them, as C++ does. CopyAssignUnsafe and MoveAssignUnsafe are the same +// for the unsafe model, whose copy_assign and move_assign are methods of S. + +#[proc_macro_derive(CopyAssign)] +pub fn derive_copy_assign(input: TokenStream) -> TokenStream { + assign::expand(input, "copy", false) +} + +#[proc_macro_derive(CopyAssignUnsafe)] +pub fn derive_copy_assign_unsafe(input: TokenStream) -> TokenStream { + assign::expand(input, "copy", true) +} + +#[proc_macro_derive(MoveAssign)] +pub fn derive_move_assign(input: TokenStream) -> TokenStream { + assign::expand(input, "move", false) +} + +#[proc_macro_derive(MoveAssignUnsafe)] +pub fn derive_move_assign_unsafe(input: TokenStream) -> TokenStream { + assign::expand(input, "move", true) +} + // #[derive(Destructor)] // pub struct S { ... } // impl SImpl for Ptr { diff --git a/libcc2rs/src/capture.rs b/libcc2rs/src/capture.rs index 9e11b582c..c77a0d2bc 100644 --- a/libcc2rs/src/capture.rs +++ b/libcc2rs/src/capture.rs @@ -26,6 +26,7 @@ use std::rc::Rc; use crate::fn_ptr::{FnPtr, FnSig}; use crate::rc::{AsPointer, Ptr, Value}; use crate::reinterpret::ByteRepr; +use crate::{Map, UnsafeMap}; // The C++ move constructor of a type, in the refcount model, for the types // whose move isn't a copy. Records implement it with #[derive(MoveCtor)]. @@ -41,6 +42,36 @@ pub trait MoveCtorUnsafe: Sized { unsafe fn move_ctor(src: *mut Self) -> Self; } +// The C++ copy assignment operator of a type, in the refcount model, for the +// types whose copy assignment isn't an assignment of a clone. Records +// implement it with #[derive(CopyAssign)]. +pub trait CopyAssign: Sized { + fn copy_assign(dst: &Ptr, src: Ptr); +} + +// The C++ copy assignment operator of a type, in the unsafe model. Records +// implement it with #[derive(CopyAssignUnsafe)]. +pub trait CopyAssignUnsafe: Sized { + /// # Safety + /// `dst` and `src` must point to live values. + unsafe fn copy_assign(dst: *mut Self, src: *const Self); +} + +// The C++ move assignment operator of a type, in the refcount model, for the +// types whose move assignment isn't an assignment of a moved value. Records +// implement it with #[derive(MoveAssign)]. +pub trait MoveAssign: Sized { + fn move_assign(dst: &Ptr, src: Ptr); +} + +// The C++ move assignment operator of a type, in the unsafe model. Records +// implement it with #[derive(MoveAssignUnsafe)]. +pub trait MoveAssignUnsafe: Sized { + /// # Safety + /// `dst` and `src` must point to live values. + unsafe fn move_assign(dst: *mut Self, src: *mut Self); +} + impl MoveCtor for FnPtr { fn move_ctor(src: Ptr) -> Self { src.with(FnPtr::move_from) @@ -76,6 +107,8 @@ macro_rules! impl_move_ctor_by_take { impl_move_ctor_by_take!( Vec, BTreeMap, + Map, + UnsafeMap, ); // unique_ptr. diff --git a/libcc2rs/src/lib.rs b/libcc2rs/src/lib.rs index db632e584..134df1354 100644 --- a/libcc2rs/src/lib.rs +++ b/libcc2rs/src/lib.rs @@ -40,7 +40,17 @@ mod fn_ptr; pub use fn_ptr::{FnPtr, Generic}; mod capture; -pub use capture::{Destructor, DestructorUnsafe, MoveCtor, MoveCtorUnsafe}; +pub use capture::{ + CopyAssign, CopyAssignUnsafe, Destructor, DestructorUnsafe, MoveAssign, MoveAssignUnsafe, + MoveCtor, MoveCtorUnsafe, +}; + +mod swap; +// Used by cpp_swap! and cpp_swap_unsafe!. +#[doc(hidden)] +pub mod __swap { + pub use crate::swap::*; +} // Used by lambda! and lambda_unsafe!. #[doc(hidden)] pub mod __capture { @@ -86,6 +96,7 @@ mod format; pub use format::*; pub use libcc2rs_macros::{ - ByteRepr, Destructor, DestructorUnsafe, FnPtrArg, MoveCtor, MoveCtorUnsafe, Record, VaArg, - goto, goto_block, lambda, lambda_unsafe, switch, + ByteRepr, CopyAssign, CopyAssignUnsafe, Destructor, DestructorUnsafe, FnPtrArg, MoveAssign, + MoveAssignUnsafe, MoveCtor, MoveCtorUnsafe, Record, VaArg, goto, goto_block, lambda, + lambda_unsafe, switch, }; diff --git a/libcc2rs/src/rc.rs b/libcc2rs/src/rc.rs index f0742fe5f..cf6b78b14 100644 --- a/libcc2rs/src/rc.rs +++ b/libcc2rs/src/rc.rs @@ -1096,6 +1096,107 @@ impl Ptr { } } +impl Ptr { + // Swaps the values that the pointers point to, as std::swap, which moves + // them instead of copying them, so no copy constructors are run. The + // values of reinterpret casts only exist as bytes, so their bytes are + // swapped. Two values in the same allocation can't be borrowed at once, + // and so, unless they are elements of the same array, they are swapped + // through a temporary that `take` moves the value of self into. + pub fn swap_with(&self, other: &Self, take: impl FnOnce(&Self) -> T) { + if matches!(self.kind, PtrKind::Reinterpreted(_)) + || matches!(other.kind, PtrKind::Reinterpreted(_)) + { + self.swap_bytes(other); + } else if self == other { + } else if root_address(&self.slice_root()) == root_address(&other.slice_root()) { + self.swap_in_root(other, take); + } else { + self.with_mut(|a| other.with_mut(|b| std::mem::swap(a, b))); + } + } + + fn swap_bytes(&self, other: &Self) { + let (a, a_offset) = self.original_alloc().unwrap_or_else(|| null_deref()); + let (b, b_offset) = other.original_alloc().unwrap_or_else(|| null_deref()); + let len = T::byte_size(); + with_scratch(2 * len, |buf: &mut [u8]| { + let (x, y) = buf.split_at_mut(len); + a.read_bytes(a_offset, x); + b.read_bytes(b_offset, y); + a.write_bytes(a_offset, y); + b.write_bytes(b_offset, x); + }); + } + + #[inline(never)] + fn swap_in_root(&self, other: &Self, take: impl FnOnce(&Self) -> T) { + match (&self.kind, &other.kind) { + ( + PtrKind::StackArray(a) | PtrKind::HeapArray(a), + PtrKind::StackArray(_) | PtrKind::HeapArray(_), + ) => { + let rc = a.upgrade().unwrap_or_else(|| dangling()); + rc.borrow_mut().swap(self.offset, other.offset); + } + ( + PtrKind::StackVec(a) | PtrKind::HeapVec(a), + PtrKind::StackVec(_) | PtrKind::HeapVec(_), + ) => { + let rc = a.upgrade().unwrap_or_else(|| dangling()); + rc.borrow_mut().swap(self.offset, other.offset); + } + _ => match (self.elem_parent(), other.elem_parent()) { + (Some(a), Some(b)) if a.address() == b.address() => { + let root = a.root(); + a.borrow_slice_mut(&root).swap(self.offset, other.offset); + } + _ => { + let mut tmp = take(self); + other.with_mut(|b| std::mem::swap(b, &mut tmp)); + self.with_mut(|a| std::mem::swap(a, &mut tmp)); + } + }, + } + } + + // The array or vector that the pointer points into, if it points to an + // element of a nested container or of an array or vector field. + fn elem_parent(&self) -> Option>> { + match &self.kind { + PtrKind::Nested(parent) => Some(parent.clone()), + PtrKind::Field(_, _, FieldShape::Array | FieldShape::Vec) => { + Some(self.field_elem_parent()) + } + _ => None, + } + } +} + +// The address of the RefCell that holds an allocation. +fn root_address(root: &SliceRoot) -> *const () { + match root { + SliceRoot::Alloc(rc) => Rc::as_ptr(rc) as *const (), + SliceRoot::Field(rc) => Rc::as_ptr(rc) as *const (), + } +} + +// Moves the element at(order[i]) to at(i), for every i, as std::sort does +// once it knows the order. The elements are swapped, which moves them instead +// of copying them. +pub fn reorder(mut order: Vec, at: impl Fn(isize) -> Ptr) { + for i in 0..order.len() { + let mut cur = i; + while order[cur] as usize != i { + let next = order[cur] as usize; + at(cur as isize).swap_with(&at(next as isize), Ptr::read); + order[cur] = cur as isize; + cur = next; + } + order[cur] = cur as isize; + } +} + impl Ptr { pub fn write_fmt(&self, args: std::fmt::Arguments<'_>) -> std::io::Result<()> { self.with_mut(|inner| inner.write_fmt(args)) @@ -1139,64 +1240,6 @@ impl Ptr { } } -impl Ptr { - pub fn sort_with_cmp(&self, last: usize, mut cmp: F) - where - F: FnMut(Ptr, Ptr) -> bool, - { - fn sort, Ptr) -> bool>( - slice: &mut [T], - offset: usize, - last: usize, - cmp: &mut F, - ) { - slice[offset..last].sort_by(|a, b| { - let val_a = Rc::new(RefCell::new(a.clone())); - let val_b = Rc::new(RefCell::new(b.clone())); - if cmp(val_a.as_pointer(), val_b.as_pointer()) { - std::cmp::Ordering::Less - } else if cmp(val_b.as_pointer(), val_a.as_pointer()) { - std::cmp::Ordering::Greater - } else { - std::cmp::Ordering::Equal - } - }); - } - match self.kind { - PtrKind::Null => panic!("ub: dereference of null pointer"), - PtrKind::StackSingle(_) - | PtrKind::HeapSingle(_) - | PtrKind::Field(_, _, FieldShape::Single) => { - panic!("only vecs and arrays can be sorted") - } - PtrKind::StackVec(ref weak) | PtrKind::HeapVec(ref weak) => { - let strong = weak.upgrade().expect("ub: dangling pointer"); - let mut borrow = strong.borrow_mut(); - sort(&mut borrow, self.get_offset(), last, &mut cmp); - } - PtrKind::Nested(ref parent) => { - let root = parent.root(); - let mut borrow = parent.borrow_slice_mut(&root); - sort(&mut borrow, self.get_offset(), last, &mut cmp); - } - PtrKind::Field(..) => { - let parent = self.field_elem_parent(); - let root = parent.root(); - let mut borrow = parent.borrow_slice_mut(&root); - sort(&mut borrow, self.get_offset(), last, &mut cmp); - } - PtrKind::StackArray(ref weak) | PtrKind::HeapArray(ref weak) => { - let strong = weak.upgrade().expect("ub: dangling pointer"); - let mut borrow = strong.borrow_mut(); - sort(&mut borrow, self.get_offset(), last, &mut cmp); - } - PtrKind::Reinterpreted(_) => { - panic!("sorting not supported for reinterpreted pointers") - } - } - } -} - impl IntoIterator for &Ptr where T: Clone, diff --git a/libcc2rs/src/swap.rs b/libcc2rs/src/swap.rs new file mode 100644 index 000000000..282626e56 --- /dev/null +++ b/libcc2rs/src/swap.rs @@ -0,0 +1,376 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +// std::swap, for the translation rules: cpp_swap!(a, b), or +// cpp_swap_unsafe!(a, b), swaps the values that a and b point to as C++ +// does: +// T tmp(std::move(a)); a = std::move(b); b = std::move(tmp); ~tmp +// Each step is done with the special member functions of the type that C++ +// picks, which may have side effects. The macros call +// `(&&&Construct(..)).construct()`, `(&&&&&Assign(..)).assign()` and +// `(&&Destroy(..)).destroy()`, and autoref specialization picks, among the +// impls below, the one with the most `&`s whose bounds the type satisfies: +// - the temporary is made with the move constructor (MoveCtor), or else +// with the copy constructor (Clone); +// - a value is assigned with the move assignment operator (MoveAssign), or +// else with the copy assignment operator (CopyAssign), as C++ copies the +// types without one; the other types are assigned as a whole, by moving +// the value with the move constructor (MoveCtor), or else by copying it +// (Clone); +// - the temporary is destroyed with the destructor, if any (Destructor). +// The values are accessed one at a time, so they may be in the same +// allocation, e.g., two fields of a struct. +// +// The types without any of those special members are only copied by C++, and +// so their values (or bytes, if reinterpreted) are swapped instead, without a +// temporary, as `(&&&&&Trivial(..)).is_trivial()` tells. The other steps are +// still compiled for them, and are unreachable if they can't be copied. + +#![allow(private_bounds, clippy::missing_safety_doc)] + +use std::cell::RefCell; +use std::rc::Rc; + +use crate::capture::{ + CopyAssign, CopyAssignUnsafe, Destructor, DestructorUnsafe, MoveAssign, MoveAssignUnsafe, + MoveCtor, MoveCtorUnsafe, +}; +use crate::rc::{AsPointer, Ptr, Value}; +use crate::reinterpret::ByteRepr; + +#[macro_export] +macro_rules! cpp_swap { + ($a:expr, $b:expr) => {{ + #[allow(unused_imports)] + use $crate::__swap::{ + AssignClone, AssignCopy, AssignMove, AssignMoveCtor, AssignNone, ConstructCopy, + ConstructMove, ConstructNone, DestroyNone, DestroyWithDtor, HasCopyAssign, + HasDestructor, HasMoveAssign, HasMoveCtor, HasNone, TakeClone, TakeNone, + }; + let __a = $a; + let __b = $b; + if (&&&&&$crate::__swap::Trivial(&__a)).is_trivial() { + __a.swap_with(&__b, (&&$crate::__swap::Take(&__a)).take()); + } else { + let __tmp = $crate::__swap::temporary((&&&$crate::__swap::Construct(&__a)).construct()); + let __tmp_ptr = $crate::__swap::pointer(&__tmp); + (&&&&&$crate::__swap::Assign(&__a, &__b)).assign(); + (&&&&&$crate::__swap::Assign(&__b, &__tmp_ptr)).assign(); + (&&$crate::__swap::Destroy(&__tmp_ptr)).destroy(); + } + }}; +} + +#[macro_export] +macro_rules! cpp_swap_unsafe { + ($a:expr, $b:expr) => {{ + #[allow(unused_imports)] + use $crate::__swap::{ + AssignCloneUnsafe, AssignCopyUnsafe, AssignMoveCtorUnsafe, AssignMoveUnsafe, + AssignNoneUnsafe, ConstructCopyUnsafe, ConstructMoveUnsafe, ConstructNoneUnsafe, + DestroyNoneUnsafe, DestroyWithDtorUnsafe, HasCopyAssignUnsafe, HasDestructorUnsafe, + HasMoveAssignUnsafe, HasMoveCtorUnsafe, HasNoneUnsafe, + }; + let __a: *mut _ = $a; + let __b: *mut _ = $b; + if (&&&&&$crate::__swap::TrivialUnsafe(&__a)).is_trivial() { + ::std::ptr::swap(__a, __b); + } else { + let mut __tmp = (&&&$crate::__swap::ConstructUnsafe(__a)).construct(); + let __tmp_ptr: *mut _ = &mut __tmp; + (&&&&&$crate::__swap::AssignUnsafe(__a, __b)).assign(); + (&&&&&$crate::__swap::AssignUnsafe(__b, __tmp_ptr)).assign(); + (&&$crate::__swap::DestroyUnsafe(__tmp_ptr)).destroy(); + } + }}; +} + +// Whether the type has none of the special members that the swap calls. +macro_rules! trivial { + ($wrapper:ident, $ptr:ty, $none:ident, $($tr:ident: $bound:ident for $recv:ty),*) => { + pub struct $wrapper<'a, T>(pub &'a $ptr); + $( + pub trait $tr { + fn is_trivial(self) -> bool; + } + + impl $tr for $recv { + fn is_trivial(self) -> bool { + false + } + } + )* + + pub trait $none { + fn is_trivial(self) -> bool; + } + + impl $none for &$wrapper<'_, T> { + fn is_trivial(self) -> bool { + true + } + } + }; +} + +trivial!(Trivial, Ptr, HasNone, + HasMoveCtor: MoveCtor for &&&&&Trivial<'_, T>, + HasMoveAssign: MoveAssign for &&&&Trivial<'_, T>, + HasCopyAssign: CopyAssign for &&&Trivial<'_, T>, + HasDestructor: Destructor for &&Trivial<'_, T> +); + +trivial!(TrivialUnsafe, *mut T, HasNoneUnsafe, + HasMoveCtorUnsafe: MoveCtorUnsafe for &&&&&TrivialUnsafe<'_, T>, + HasMoveAssignUnsafe: MoveAssignUnsafe for &&&&TrivialUnsafe<'_, T>, + HasCopyAssignUnsafe: CopyAssignUnsafe for &&&TrivialUnsafe<'_, T>, + HasDestructorUnsafe: DestructorUnsafe for &&TrivialUnsafe<'_, T> +); + +#[cold] +#[inline(never)] +fn not_swappable() -> ! { + panic!("std::swap of a type that can't be copied nor moved") +} + +// How Ptr::swap_with copies a value of a trivial type into a temporary, if +// it needs one. +pub struct Take<'a, T>(pub &'a Ptr); + +pub trait TakeClone { + fn take(self) -> fn(&Ptr) -> T; +} + +pub trait TakeNone { + fn take(self) -> fn(&Ptr) -> T; +} + +impl TakeClone for &&Take<'_, T> { + fn take(self) -> fn(&Ptr) -> T { + Ptr::read + } +} + +impl TakeNone for &Take<'_, T> { + fn take(self) -> fn(&Ptr) -> T { + |_| not_swappable() + } +} + +// The temporary of cpp_swap!, and a pointer to it. +pub fn temporary(value: T) -> Value { + Rc::new(RefCell::new(value)) +} + +pub fn pointer(value: &Value) -> Ptr { + as AsPointer>::as_pointer(value) +} + +pub struct Construct<'a, T>(pub &'a Ptr); + +pub trait ConstructMove { + fn construct(self) -> T; +} + +pub trait ConstructCopy { + fn construct(self) -> T; +} + +pub trait ConstructNone { + fn construct(self) -> T; +} + +impl ConstructMove for &&&Construct<'_, T> { + fn construct(self) -> T { + T::move_ctor(self.0.clone()) + } +} + +impl ConstructCopy for &&Construct<'_, T> { + fn construct(self) -> T { + self.0.read() + } +} + +impl ConstructNone for &Construct<'_, T> { + fn construct(self) -> T { + not_swappable() + } +} + +// Assigns the value that the second pointer points to to the first one. +pub struct Assign<'a, T>(pub &'a Ptr, pub &'a Ptr); + +pub trait AssignMove { + fn assign(self); +} + +pub trait AssignCopy { + fn assign(self); +} + +pub trait AssignMoveCtor { + fn assign(self); +} + +pub trait AssignClone { + fn assign(self); +} + +pub trait AssignNone { + fn assign(self); +} + +impl AssignMove for &&&&&Assign<'_, T> { + fn assign(self) { + T::move_assign(self.0, self.1.clone()) + } +} + +impl AssignCopy for &&&&Assign<'_, T> { + fn assign(self) { + T::copy_assign(self.0, self.1.clone()) + } +} + +impl AssignMoveCtor for &&&Assign<'_, T> { + fn assign(self) { + self.0.write(T::move_ctor(self.1.clone())) + } +} + +impl AssignClone for &&Assign<'_, T> { + fn assign(self) { + self.0.write(self.1.read()) + } +} + +impl AssignNone for &Assign<'_, T> { + fn assign(self) { + not_swappable() + } +} + +pub struct Destroy<'a, T>(pub &'a Ptr); + +pub trait DestroyWithDtor { + fn destroy(self); +} + +pub trait DestroyNone { + fn destroy(self); +} + +impl DestroyWithDtor for &&Destroy<'_, T> { + fn destroy(self) { + T::destroy(self.0.clone()) + } +} + +impl DestroyNone for &Destroy<'_, T> { + fn destroy(self) {} +} + +pub struct ConstructUnsafe(pub *mut T); + +pub trait ConstructMoveUnsafe { + unsafe fn construct(self) -> T; +} + +pub trait ConstructCopyUnsafe { + unsafe fn construct(self) -> T; +} + +pub trait ConstructNoneUnsafe { + unsafe fn construct(self) -> T; +} + +impl ConstructMoveUnsafe for &&&ConstructUnsafe { + unsafe fn construct(self) -> T { + unsafe { T::move_ctor(self.0) } + } +} + +impl ConstructCopyUnsafe for &&ConstructUnsafe { + unsafe fn construct(self) -> T { + unsafe { (*self.0).clone() } + } +} + +impl ConstructNoneUnsafe for &ConstructUnsafe { + unsafe fn construct(self) -> T { + not_swappable() + } +} + +pub struct AssignUnsafe(pub *mut T, pub *mut T); + +pub trait AssignMoveUnsafe { + unsafe fn assign(self); +} + +pub trait AssignCopyUnsafe { + unsafe fn assign(self); +} + +pub trait AssignMoveCtorUnsafe { + unsafe fn assign(self); +} + +pub trait AssignCloneUnsafe { + unsafe fn assign(self); +} + +pub trait AssignNoneUnsafe { + unsafe fn assign(self); +} + +impl AssignMoveUnsafe for &&&&&AssignUnsafe { + unsafe fn assign(self) { + unsafe { T::move_assign(self.0, self.1) } + } +} + +impl AssignCopyUnsafe for &&&&AssignUnsafe { + unsafe fn assign(self) { + unsafe { T::copy_assign(self.0, self.1) } + } +} + +impl AssignMoveCtorUnsafe for &&&AssignUnsafe { + unsafe fn assign(self) { + unsafe { *self.0 = T::move_ctor(self.1) } + } +} + +impl AssignCloneUnsafe for &&AssignUnsafe { + unsafe fn assign(self) { + unsafe { *self.0 = (*self.1).clone() } + } +} + +impl AssignNoneUnsafe for &AssignUnsafe { + unsafe fn assign(self) { + not_swappable() + } +} + +pub struct DestroyUnsafe(pub *mut T); + +pub trait DestroyWithDtorUnsafe { + unsafe fn destroy(self); +} + +pub trait DestroyNoneUnsafe { + unsafe fn destroy(self); +} + +impl DestroyWithDtorUnsafe for &&DestroyUnsafe { + unsafe fn destroy(self) { + unsafe { T::destroy(self.0) } + } +} + +impl DestroyNoneUnsafe for &DestroyUnsafe { + unsafe fn destroy(self) {} +} diff --git a/rules/algorithm/tgt_refcount.rs b/rules/algorithm/tgt_refcount.rs index 2374d6825..f2826a50e 100644 --- a/rules/algorithm/tgt_refcount.rs +++ b/rules/algorithm/tgt_refcount.rs @@ -13,10 +13,7 @@ fn f1, T2: Ord + Clone + ByteRepr>(a0: T1, a1: T a0.iter_at(__x) .with(|__a| a0.iter_at(__y).with(|__b| __a.cmp(__b))) }); - let __values: Vec<_> = __order.iter().map(|&__i| a0.iter_at(__i).read()).collect(); - for (__i, __v) in (0..__n).zip(__values) { - a0.iter_at(__i).write(__v); - } + reorder(__order, |__i| a0.iter_at(__i)); } fn f2< @@ -64,10 +61,7 @@ where std::cmp::Ordering::Equal } }); - let __values: Vec<_> = __order.iter().map(|&__i| a0.iter_at(__i).read()).collect(); - for (__i, __v) in (0..__n).zip(__values) { - a0.iter_at(__i).write(__v); - } + reorder(__order, |__i| a0.iter_at(__i)); } fn f8, T2: PartialOrd + ByteRepr>(a0: T1, a1: T1) -> T1 { @@ -89,9 +83,7 @@ fn f8, T2: PartialOrd + ByteRepr>(a0: T1, a1: T1) -> T1 } fn f9(a0: Ptr, a1: Ptr) { - let tmp = a0.read(); - a0.write(a1.read()); - a1.write(tmp); + cpp_swap!(a0, a1) } fn f10, T2: PartialEq + Clone + ByteRepr>(a0: T1, a1: T1) -> T1 { @@ -137,8 +129,21 @@ fn f14(a0: Ptr, a1: Ptr, a2: T2) where T2: Callable2, { - let fun = |x: Ptr, y: Ptr| a2.call((x.read()).clone(), (y.read()).clone()); - a0.sort_with_cmp(a1.get_offset(), fun) + let __cmp = a2; + let __n = a1.iter_distance(&a0); + let mut __order: Vec = (0..__n).collect(); + __order.sort_by(|&__x, &__y| { + let __a = a0.iter_at(__x); + let __b = a0.iter_at(__y); + if __cmp.call(__a.read(), __b.read()) { + std::cmp::Ordering::Less + } else if __cmp.call(__b.read(), __a.read()) { + std::cmp::Ordering::Greater + } else { + std::cmp::Ordering::Equal + } + }); + reorder(__order, |__i| a0.iter_at(__i)); } fn f16(a0: Ptr, a1: Ptr) -> Ptr { @@ -154,10 +159,6 @@ fn f18, T2: Clone + ByteRepr>(a0: T1, a1: T1) { let __random = std::hash::RandomState::new(); for __i in (1..__n).rev() { let __j = (std::hash::BuildHasher::hash_one(&__random, __i) % (__i + 1) as u64) as isize; - let __x = a0.iter_at(__i); - let __y = a0.iter_at(__j); - let __tmp = __x.read(); - __x.write(__y.read()); - __y.write(__tmp); + cpp_swap!(a0.iter_at(__i), a0.iter_at(__j)); } } diff --git a/rules/algorithm/tgt_unsafe.rs b/rules/algorithm/tgt_unsafe.rs index 169ec1d20..456d2d336 100644 --- a/rules/algorithm/tgt_unsafe.rs +++ b/rules/algorithm/tgt_unsafe.rs @@ -81,8 +81,8 @@ unsafe fn f8, T2: PartialOrd>(a0: T1, a1: T1) -> __best } -unsafe fn f9(a0: &mut T1, a1: &mut T1) { - std::mem::swap(&mut *a0, &mut *a1) +unsafe fn f9(a0: *mut T1, a1: *mut T1) { + cpp_swap_unsafe!(a0, a1) } unsafe fn f10, T2: PartialEq + Clone>(a0: T1, a1: T1) -> T1 { @@ -163,6 +163,6 @@ unsafe fn f18, T2>(a0: T1, a1: T1) { let __n = a1.iter_distance(&a0); for __i in (1..__n).rev() { let __j = libc::rand() as isize % (__i + 1); - std::ptr::swap(a0.iter_at(__i), a0.iter_at(__j)); + cpp_swap_unsafe!(a0.iter_at(__i), a0.iter_at(__j)); } } diff --git a/rules/builtin/src.c b/rules/builtin/src.c index 7dc2baacf..b4aebe2b3 100644 --- a/rules/builtin/src.c +++ b/rules/builtin/src.c @@ -31,7 +31,7 @@ int f13(long long a, long long b, long long *r) { void f11(void) { return __builtin_ia32_pause(); } #endif -void *f14(void *dst, const void *src, size_t n) { +void *f14(void *dst, const void *src, __SIZE_TYPE__ n) { return __builtin_memcpy(dst, src, n); } diff --git a/tests/multi-file/defaulted_move_cross_tu/out/refcount/defaulted_move_cross_tu.rs b/tests/multi-file/defaulted_move_cross_tu/out/refcount/defaulted_move_cross_tu.rs index eb7112d27..f3c326526 100644 --- a/tests/multi-file/defaulted_move_cross_tu/out/refcount/defaulted_move_cross_tu.rs +++ b/tests/multi-file/defaulted_move_cross_tu/out/refcount/defaulted_move_cross_tu.rs @@ -6,7 +6,7 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign)] #[byte_size(32)] pub struct S { #[offset(0)] diff --git a/tests/multi-file/defaulted_move_cross_tu/out/unsafe/defaulted_move_cross_tu.rs b/tests/multi-file/defaulted_move_cross_tu/out/unsafe/defaulted_move_cross_tu.rs index 327dee823..33041bb73 100644 --- a/tests/multi-file/defaulted_move_cross_tu/out/unsafe/defaulted_move_cross_tu.rs +++ b/tests/multi-file/defaulted_move_cross_tu/out/unsafe/defaulted_move_cross_tu.rs @@ -7,7 +7,7 @@ use std::io::{Read, Seek, Write}; use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct S { pub v: Vec, pub n: [i32; 2], diff --git a/tests/unit/copy_assign.cpp b/tests/unit/copy_assign.cpp index 6a5415842..64a11fc0d 100644 --- a/tests/unit/copy_assign.cpp +++ b/tests/unit/copy_assign.cpp @@ -44,6 +44,20 @@ struct Holder { Partial arr[2]; }; +static int copies = 0; + +// The copy assignment is implicit, and does not copy construct. +struct CopyCounted { + int v; + CopyCounted(int v) : v(v) {} + CopyCounted(const CopyCounted &o) : v(o.v) { ++copies; } +}; + +struct HasCopyCounted { + CopyCounted c; + CopyCounted arr[2]; +}; + int main() { Partial a(1, 100), b(2, 200), c(3, 300); a = b; @@ -86,5 +100,20 @@ int main() { RefQualified r, r1; r1 = r; assert(r1.mark == 1); + + Holder h2{Partial(7, 70), {Partial(8, 80), Partial(9, 90)}}; + h2 = h; + assert(h2.p.v == 2 && h2.p.keep == 70); + assert(h2.arr[1].v == 2 && h2.arr[1].keep == 90); + assert(assigns == 11); + + CopyCounted cc1(1), cc2(2); + cc1 = cc2; + assert(cc1.v == 2); + HasCopyCounted hc1{CopyCounted(1), {CopyCounted(2), CopyCounted(3)}}; + HasCopyCounted hc2{CopyCounted(4), {CopyCounted(5), CopyCounted(6)}}; + hc1 = hc2; + assert(hc1.c.v == 4 && hc1.arr[0].v == 5 && hc1.arr[1].v == 6); + assert(copies == 0); return 0; } diff --git a/tests/unit/out/refcount/copy_assign.rs b/tests/unit/out/refcount/copy_assign.rs index 750e6048a..7eda28563 100644 --- a/tests/unit/out/refcount/copy_assign.rs +++ b/tests/unit/out/refcount/copy_assign.rs @@ -9,7 +9,7 @@ use std::rc::{Rc, Weak}; thread_local!( pub static assigns_0: Value = Rc::new(RefCell::new(0)); ); -#[derive(Record, ByteRepr, VaArg, FnPtrArg, Default)] +#[derive(Record, ByteRepr, VaArg, FnPtrArg, CopyAssign, Default)] #[byte_size(8)] pub struct Partial { #[offset(0)] @@ -53,7 +53,7 @@ impl Default for NonConstAssign { { NonConstAssign::new() } } } -#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg)] +#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg, CopyAssign)] #[byte_size(4)] pub struct RefQualified { #[offset(0)] @@ -69,7 +69,7 @@ impl Default for RefQualified { { RefQualified::new() } } } -#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg)] +#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg, CopyAssign)] #[byte_size(24)] pub struct Holder { #[offset(0)] @@ -91,6 +91,55 @@ impl Default for Holder { } } } +thread_local!( + pub static copies_1: Value = Rc::new(RefCell::new(0)); +); +#[derive(Record, ByteRepr, VaArg, FnPtrArg, CopyAssign, Default)] +#[byte_size(4)] +pub struct CopyCounted { + #[offset(0)] + pub v: i32, +} +impl CopyCounted { + pub fn new(mut v: i32) -> Self { + Self { v: v } + } + pub fn copy_from(o: Ptr) -> Self { + let __this: CopyCounted = Self { + v: o.with(|__s| __s.v), + }; + (*copies_1.with(Value::clone).borrow_mut()).prefix_inc(); + __this + } +} +impl Clone for CopyCounted { + fn clone(&self) -> Self { + let __src: Value = Rc::new(RefCell::new(CopyCounted { v: self.v.clone() })); + CopyCounted::copy_from(__src.as_pointer()) + } +} +#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg, CopyAssign)] +#[byte_size(12)] +pub struct HasCopyCounted { + #[offset(0)] + #[byte_size(4)] + pub c: CopyCounted, + #[offset(4)] + #[byte_size(8)] + pub arr: Box<[CopyCounted]>, +} +impl Default for HasCopyCounted { + fn default() -> Self { + { + HasCopyCounted { + c: ::default(), + arr: (0..2) + .map(|_| ::default()) + .collect::>(), + } + } + } +} pub fn main() { __cpp2rust_init_globals(); std::process::exit(main_0()); @@ -163,8 +212,92 @@ fn main_0() -> i32 { let r1: Value = Rc::new(RefCell::new(RefQualified::new())); ({ RefQualifiedImpl::copy_assign(&r1.as_pointer(), r.as_pointer()) }); assert!(({ (*r1.borrow()).mark } == 1)); + let h2: Value = Rc::new(RefCell::new(Holder { + p: Partial::new({ 7 }, { 70 }), + arr: Box::new([Partial::new({ 8 }, { 80 }), Partial::new({ 9 }, { 90 })]), + })); + ({ HolderImpl::copy_assign(&h2.as_pointer(), h.as_pointer()) }); + assert!(({ (*h2.borrow()).p.v } == 2) && ({ (*h2.borrow()).p.keep } == 70)); + assert!( + (array_elem!(h2.as_pointer(), arr, 1).with(|__s| __s.v) == 2) + && (array_elem!(h2.as_pointer(), arr, 1).with(|__s| __s.keep) == 90) + ); + assert!((assigns_0.with(|rc| *rc.borrow()) == 11)); + let cc1: Value = Rc::new(RefCell::new(CopyCounted::new({ 1 }))); + let cc2: Value = Rc::new(RefCell::new(CopyCounted::new({ 2 }))); + ({ CopyCountedImpl::copy_assign(&cc1.as_pointer(), cc2.as_pointer()) }); + assert!(({ (*cc1.borrow()).v } == 2)); + let hc1: Value = Rc::new(RefCell::new(HasCopyCounted { + c: CopyCounted::new({ 1 }), + arr: Box::new([CopyCounted::new({ 2 }), CopyCounted::new({ 3 })]), + })); + let hc2: Value = Rc::new(RefCell::new(HasCopyCounted { + c: CopyCounted::new({ 4 }), + arr: Box::new([CopyCounted::new({ 5 }), CopyCounted::new({ 6 })]), + })); + ({ HasCopyCountedImpl::copy_assign(&hc1.as_pointer(), hc2.as_pointer()) }); + assert!( + (({ (*hc1.borrow()).c.v } == 4) + && (array_elem!(hc1.as_pointer(), arr, 0).with(|__s| __s.v) == 5)) + && (array_elem!(hc1.as_pointer(), arr, 1).with(|__s| __s.v) == 6) + ); + assert!((copies_1.with(|rc| *rc.borrow()) == 0)); return 0; } +pub trait CopyCountedImpl { + fn copy_assign(&self, _a0: Ptr) -> Ptr; +} +impl CopyCountedImpl for Ptr { + fn copy_assign(&self, _a0: Ptr) -> Ptr { + field!((*self), v).write({ _a0.with(|__s| __s.v) }); + return (*self).clone(); + } +} +pub trait HasCopyCountedImpl { + fn copy_assign(&self, _a0: Ptr) -> Ptr; +} +impl HasCopyCountedImpl for Ptr { + fn copy_assign(&self, _a0: Ptr) -> Ptr { + ({ + let _arg0: Ptr = field_ptr!(_a0, c); + CopyCountedImpl::copy_assign(&field_ptr!((*self), c), _arg0) + }); + { + ((array_field_ptr!((*self), arr)) as Ptr) + .to_any() + .memcpy( + &((array_field_ptr!(_a0, arr)) as Ptr).to_any(), + 8_usize as usize, + ); + ((array_field_ptr!((*self), arr)) as Ptr).to_any() + }; + return (*self).clone(); + } +} +pub trait HolderImpl { + fn copy_assign(&self, _a0: Ptr) -> Ptr; +} +impl HolderImpl for Ptr { + fn copy_assign(&self, _a0: Ptr) -> Ptr { + ({ + let _o: Ptr = field_ptr!(_a0, p); + PartialImpl::copy_assign(&field_ptr!((*self), p), _o) + }); + let mut __i0: usize = 0_usize; + 'loop_: while (__i0 != 2_usize) { + ({ + let _o: Ptr = + (array_field_ptr!(_a0, arr) as Ptr).offset((__i0) as isize); + PartialImpl::copy_assign( + &(array_field_ptr!((*self), arr) as Ptr).offset((__i0) as isize), + _o, + ) + }); + __i0.prefix_inc(); + } + return (*self).clone(); + } +} pub trait NonConstAssignImpl { fn operator_assign_2(&self, o: Ptr) -> Ptr; fn operator_assign_3(&self, o: Ptr) -> Ptr; @@ -203,4 +336,5 @@ impl RefQualifiedImpl for Ptr { } pub fn __cpp2rust_init_globals() { let _ = assigns_0.with(|_| ()); + let _ = copies_1.with(|_| ()); } diff --git a/tests/unit/out/refcount/copy_ctor.rs b/tests/unit/out/refcount/copy_ctor.rs index 99d2adc5e..26ad076be 100644 --- a/tests/unit/out/refcount/copy_ctor.rs +++ b/tests/unit/out/refcount/copy_ctor.rs @@ -9,7 +9,7 @@ use std::rc::{Rc, Weak}; thread_local!( pub static copies_0: Value = Rc::new(RefCell::new(0)); ); -#[derive(Record, ByteRepr, VaArg, FnPtrArg, Default)] +#[derive(Record, ByteRepr, VaArg, FnPtrArg, CopyAssign, Default)] #[byte_size(4)] pub struct Counted { #[offset(0)] @@ -33,7 +33,7 @@ impl Clone for Counted { Counted::copy_from(__src.as_pointer()) } } -#[derive(Record, ByteRepr, VaArg, FnPtrArg)] +#[derive(Record, ByteRepr, VaArg, FnPtrArg, CopyAssign)] #[byte_size(4)] pub struct NonConst { #[offset(0)] @@ -67,7 +67,7 @@ impl Default for NonConst { { NonConst::new() } } } -#[derive(Record, ByteRepr, VaArg, FnPtrArg, Default)] +#[derive(Record, ByteRepr, VaArg, FnPtrArg, CopyAssign, Default)] #[byte_size(4)] pub struct Ignored { #[offset(0)] @@ -89,7 +89,7 @@ impl Clone for Ignored { Ignored::copy_from(__src.as_pointer()) } } -#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg)] +#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg, CopyAssign)] #[byte_size(12)] pub struct Holder { #[offset(0)] @@ -155,7 +155,7 @@ impl Owner { } } } -#[derive(Record, ByteRepr, VaArg, FnPtrArg, Default)] +#[derive(Record, ByteRepr, VaArg, FnPtrArg, CopyAssign, Default)] #[byte_size(4)] pub struct OutOfLine { #[offset(0)] @@ -180,7 +180,7 @@ impl Clone for OutOfLine { } } impl OutOfLine {} -#[derive(Record, ByteRepr, VaArg, FnPtrArg)] +#[derive(Record, ByteRepr, VaArg, FnPtrArg, CopyAssign)] #[byte_size(4)] pub struct Tracked { #[offset(0)] @@ -284,6 +284,63 @@ fn main_0() -> i32 { assert!(({ (*ct.borrow()).copied_from } == 2)); return 0; } +pub trait CountedImpl { + fn copy_assign(&self, _a0: Ptr) -> Ptr; +} +impl CountedImpl for Ptr { + fn copy_assign(&self, _a0: Ptr) -> Ptr { + field!((*self), v).write({ _a0.with(|__s| __s.v) }); + return (*self).clone(); + } +} +pub trait HolderImpl { + fn copy_assign(&self, _a0: Ptr) -> Ptr; +} +impl HolderImpl for Ptr { + fn copy_assign(&self, _a0: Ptr) -> Ptr { + ({ + let _arg0: Ptr = field_ptr!(_a0, c); + CountedImpl::copy_assign(&field_ptr!((*self), c), _arg0) + }); + { + ((array_field_ptr!((*self), arr)) as Ptr) + .to_any() + .memcpy( + &((array_field_ptr!(_a0, arr)) as Ptr).to_any(), + 8_usize as usize, + ); + ((array_field_ptr!((*self), arr)) as Ptr).to_any() + }; + return (*self).clone(); + } +} +pub trait IgnoredImpl { + fn copy_assign(&self, _a0: Ptr) -> Ptr; +} +impl IgnoredImpl for Ptr { + fn copy_assign(&self, _a0: Ptr) -> Ptr { + field!((*self), v).write({ _a0.with(|__s| __s.v) }); + return (*self).clone(); + } +} +pub trait NonConstImpl { + fn copy_assign(&self, _a0: Ptr) -> Ptr; +} +impl NonConstImpl for Ptr { + fn copy_assign(&self, _a0: Ptr) -> Ptr { + field!((*self), mark).write({ _a0.with(|__s| __s.mark) }); + return (*self).clone(); + } +} +pub trait OutOfLineImpl { + fn copy_assign(&self, _a0: Ptr) -> Ptr; +} +impl OutOfLineImpl for Ptr { + fn copy_assign(&self, _a0: Ptr) -> Ptr { + field!((*self), v).write({ _a0.with(|__s| __s.v) }); + return (*self).clone(); + } +} pub trait TrackedImpl { fn copy_assign(&self, o: Ptr) -> Ptr; } diff --git a/tests/unit/out/refcount/copy_move_defaulted.rs b/tests/unit/out/refcount/copy_move_defaulted.rs index 087a0e844..43ab8ce3d 100644 --- a/tests/unit/out/refcount/copy_move_defaulted.rs +++ b/tests/unit/out/refcount/copy_move_defaulted.rs @@ -67,7 +67,7 @@ impl Default for Implicit { } } } -#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg, MoveCtor, Default)] +#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg, MoveCtor, MoveAssign, Default)] #[byte_size(4)] pub struct DefaultCopyUserMove { #[offset(0)] @@ -85,7 +85,7 @@ impl DefaultCopyUserMove { __this } } -#[derive(Record, ByteRepr, VaArg, FnPtrArg, MoveCtor, Default)] +#[derive(Record, ByteRepr, VaArg, FnPtrArg, MoveCtor, CopyAssign, MoveAssign, Default)] #[byte_size(4)] pub struct UserCopyDefaultMove { #[offset(0)] @@ -113,7 +113,7 @@ impl Clone for UserCopyDefaultMove { UserCopyDefaultMove::copy_from(__src.as_pointer()) } } -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign)] #[byte_size(64)] pub struct Buffer { #[offset(0)] @@ -166,7 +166,7 @@ impl Default for Buffer { } } } -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign)] #[byte_size(48)] pub struct Owner { #[offset(0)] @@ -205,7 +205,7 @@ impl Default for Owner { } } } -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, Destructor, Default)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign, Destructor, Default)] #[byte_size(32)] pub struct Holder { #[offset(0)] diff --git a/tests/unit/out/refcount/copy_move_deleted.rs b/tests/unit/out/refcount/copy_move_deleted.rs index 17e832aaf..10d02ffcf 100644 --- a/tests/unit/out/refcount/copy_move_deleted.rs +++ b/tests/unit/out/refcount/copy_move_deleted.rs @@ -6,7 +6,7 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, Default)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign, Default)] #[byte_size(4)] pub struct NoCopy { #[offset(0)] @@ -24,7 +24,7 @@ impl NoCopy { __this } } -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign)] #[byte_size(4)] pub struct PrivateCopy { #[offset(0)] @@ -63,7 +63,7 @@ impl Default for Immovable { { Immovable::new() } } } -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, Default)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign, Default)] #[byte_size(8)] pub struct Container { #[offset(0)] diff --git a/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs b/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs index ae79c0e9e..fe10340d3 100644 --- a/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs +++ b/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs @@ -38,11 +38,10 @@ fn main_0() -> i32 { for __i in (1..__n).rev() { let __j = (std::hash::BuildHasher::hash_one(&__random, __i) % (__i + 1) as u64) as isize; - let __x = (v.as_pointer() as Ptr).begin().iter_at(__i); - let __y = (v.as_pointer() as Ptr).begin().iter_at(__j); - let __tmp = __x.read(); - __x.write(__y.read()); - __y.write(__tmp); + cpp_swap!( + (v.as_pointer() as Ptr).begin().iter_at(__i), + (v.as_pointer() as Ptr).begin().iter_at(__j) + ); } }; { @@ -61,13 +60,9 @@ fn main_0() -> i32 { .with(|__b| __a.cmp(__b)) }) }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| (v.as_pointer() as Ptr).begin().iter_at(__i).read()) - .collect(); - for (__i, __v) in (0..__n).zip(__values) { - (v.as_pointer() as Ptr).begin().iter_at(__i).write(__v); - } + reorder(__order, |__i| { + (v.as_pointer() as Ptr).begin().iter_at(__i) + }); }; assert!(({ (*v.borrow())[0_usize] } == 4) && ({ (*v.borrow())[1_usize] } == 7)); return 0; diff --git a/tests/unit/out/refcount/fn_ptr_stable_sort.rs b/tests/unit/out/refcount/fn_ptr_stable_sort.rs index 377b0f76d..79439c98a 100644 --- a/tests/unit/out/refcount/fn_ptr_stable_sort.rs +++ b/tests/unit/out/refcount/fn_ptr_stable_sort.rs @@ -51,16 +51,9 @@ fn main_0() -> i32 { std::cmp::Ordering::Equal } }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| (v.as_pointer() as Ptr).begin().iter_at(__i).read()) - .collect(); - for (__i, __v) in (0..__n).zip(__values) { - (v.as_pointer() as Ptr) - .begin() - .iter_at(__i) - .write(__v); - } + reorder(__order, |__i| { + (v.as_pointer() as Ptr).begin().iter_at(__i) + }); }; assert!(({ (*v.borrow())[0_usize].key } == 1)); assert!(({ (*v.borrow())[1_usize].key } == 2)); diff --git a/tests/unit/out/refcount/huffman.rs b/tests/unit/out/refcount/huffman.rs index 92ba55003..b8ce918b3 100644 --- a/tests/unit/out/refcount/huffman.rs +++ b/tests/unit/out/refcount/huffman.rs @@ -44,7 +44,7 @@ pub fn Swap_0(a: Ptr, b: Ptr) { } }); } -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, Default)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign, Default)] #[byte_size(32)] pub struct MinHeap { #[offset(0)] diff --git a/tests/unit/out/refcount/kruskal.rs b/tests/unit/out/refcount/kruskal.rs index 1c5aebeaf..2e365dd58 100644 --- a/tests/unit/out/refcount/kruskal.rs +++ b/tests/unit/out/refcount/kruskal.rs @@ -146,7 +146,7 @@ pub fn quicksort_1(arr: Ptr>>>, mut start: i32, mut end quicksort_1(_arr, _start, _end) }); } -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, Default)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign, Default)] #[byte_size(24)] pub struct DisjointSet { #[offset(0)] @@ -167,7 +167,7 @@ impl DisjointSet { } } } -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, Default)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign, Default)] #[byte_size(16)] pub struct Graph { #[offset(0)] diff --git a/tests/unit/out/refcount/move_assign.rs b/tests/unit/out/refcount/move_assign.rs index 284faacb3..f87db9d1e 100644 --- a/tests/unit/out/refcount/move_assign.rs +++ b/tests/unit/out/refcount/move_assign.rs @@ -6,7 +6,7 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, Default)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign, Default)] #[byte_size(4)] pub struct MoveOnly { #[offset(0)] diff --git a/tests/unit/out/refcount/operator_comparison_nonbool.rs b/tests/unit/out/refcount/operator_comparison_nonbool.rs index bec98b4be..ab0a070d5 100644 --- a/tests/unit/out/refcount/operator_comparison_nonbool.rs +++ b/tests/unit/out/refcount/operator_comparison_nonbool.rs @@ -279,13 +279,7 @@ fn main_0() -> i32 { .with(|__b| __a.cmp(__b)) }) }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| (xs.as_pointer() as Ptr).iter_at(__i).read()) - .collect(); - for (__i, __v) in (0..__n).zip(__values) { - (xs.as_pointer() as Ptr).iter_at(__i).write(__v); - } + reorder(__order, |__i| (xs.as_pointer() as Ptr).iter_at(__i)); }; assert!( (({ (*xs.borrow())[(0) as usize].v } == 1) && ({ (*xs.borrow())[(1) as usize].v } == 2)) @@ -316,13 +310,7 @@ fn main_0() -> i32 { .with(|__b| __a.cmp(__b)) }) }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| (ms.as_pointer() as Ptr).iter_at(__i).read()) - .collect(); - for (__i, __v) in (0..__n).zip(__values) { - (ms.as_pointer() as Ptr).iter_at(__i).write(__v); - } + reorder(__order, |__i| (ms.as_pointer() as Ptr).iter_at(__i)); }; assert!( (({ (*ms.borrow())[(0) as usize].v } == 4) && ({ (*ms.borrow())[(1) as usize].v } == 5)) @@ -384,13 +372,9 @@ fn main_0() -> i32 { .with(|__b| __a.cmp(__b)) }) }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| (bs.as_pointer() as Ptr).iter_at(__i).read()) - .collect(); - for (__i, __v) in (0..__n).zip(__values) { - (bs.as_pointer() as Ptr).iter_at(__i).write(__v); - } + reorder(__order, |__i| { + (bs.as_pointer() as Ptr).iter_at(__i) + }); }; assert!( (({ (*bs.borrow())[(0) as usize].v } == 1) && ({ (*bs.borrow())[(1) as usize].v } == 2)) diff --git a/tests/unit/out/refcount/operator_traits.rs b/tests/unit/out/refcount/operator_traits.rs index 1c69bd9c9..c342e95fa 100644 --- a/tests/unit/out/refcount/operator_traits.rs +++ b/tests/unit/out/refcount/operator_traits.rs @@ -180,16 +180,9 @@ fn main_0() -> i32 { .with(|__b| __a.cmp(__b)) }) }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| (lts.as_pointer() as Ptr).begin().iter_at(__i).read()) - .collect(); - for (__i, __v) in (0..__n).zip(__values) { - (lts.as_pointer() as Ptr) - .begin() - .iter_at(__i) - .write(__v); - } + reorder(__order, |__i| { + (lts.as_pointer() as Ptr).begin().iter_at(__i) + }); }; assert!( (({ (*lts.borrow())[0_usize].v } == 1) && ({ (*lts.borrow())[1_usize].v } == 2)) @@ -248,16 +241,9 @@ fn main_0() -> i32 { .with(|__b| __a.cmp(__b)) }) }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| (cmps.as_pointer() as Ptr).begin().iter_at(__i).read()) - .collect(); - for (__i, __v) in (0..__n).zip(__values) { - (cmps.as_pointer() as Ptr) - .begin() - .iter_at(__i) - .write(__v); - } + reorder(__order, |__i| { + (cmps.as_pointer() as Ptr).begin().iter_at(__i) + }); }; assert!(({ (*cmps.borrow())[0_usize].v } == 1) && ({ (*cmps.borrow())[2_usize].v } == 3)); let mut three: Cmp = Cmp { v: 3 }; @@ -292,21 +278,9 @@ fn main_0() -> i32 { .with(|__b| __a.cmp(__b)) }) }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| { - (frees.as_pointer() as Ptr) - .begin() - .iter_at(__i) - .read() - }) - .collect(); - for (__i, __v) in (0..__n).zip(__values) { - (frees.as_pointer() as Ptr) - .begin() - .iter_at(__i) - .write(__v); - } + reorder(__order, |__i| { + (frees.as_pointer() as Ptr).begin().iter_at(__i) + }); }; assert!(({ (*frees.borrow())[0_usize].v } == 1)); let mut ftwo: Free = Free { v: 2 }; diff --git a/tests/unit/out/refcount/rule_of_five.rs b/tests/unit/out/refcount/rule_of_five.rs index a1a20d9db..ac6ea1da1 100644 --- a/tests/unit/out/refcount/rule_of_five.rs +++ b/tests/unit/out/refcount/rule_of_five.rs @@ -15,7 +15,7 @@ thread_local!( thread_local!( pub static moves_2: Value = Rc::new(RefCell::new(0)); ); -#[derive(Record, ByteRepr, VaArg, FnPtrArg, MoveCtor, Destructor)] +#[derive(Record, ByteRepr, VaArg, FnPtrArg, MoveCtor, CopyAssign, MoveAssign, Destructor)] #[byte_size(20)] pub struct Buffer { #[offset(0)] diff --git a/tests/unit/out/refcount/rule_of_three.rs b/tests/unit/out/refcount/rule_of_three.rs index 6518972bf..3909b1390 100644 --- a/tests/unit/out/refcount/rule_of_three.rs +++ b/tests/unit/out/refcount/rule_of_three.rs @@ -12,7 +12,7 @@ thread_local!( thread_local!( pub static copies_1: Value = Rc::new(RefCell::new(0)); ); -#[derive(Record, ByteRepr, VaArg, FnPtrArg, Destructor)] +#[derive(Record, ByteRepr, VaArg, FnPtrArg, CopyAssign, Destructor)] #[byte_size(20)] pub struct Buffer { #[offset(0)] diff --git a/tests/unit/out/refcount/sort.rs b/tests/unit/out/refcount/sort.rs index e04700c5c..90dd1059c 100644 --- a/tests/unit/out/refcount/sort.rs +++ b/tests/unit/out/refcount/sort.rs @@ -68,13 +68,9 @@ fn main_0() -> i32 { .with(|__b| __a.cmp(__b)) }) }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| (v.as_pointer() as Ptr).begin().iter_at(__i).read()) - .collect(); - for (__i, __v) in (0..__n).zip(__values) { - (v.as_pointer() as Ptr).begin().iter_at(__i).write(__v); - } + reorder(__order, |__i| { + (v.as_pointer() as Ptr).begin().iter_at(__i) + }); }; let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < ((*v.borrow()).len()).wrapping_sub(1_usize)) { diff --git a/tests/unit/out/refcount/sort_no_copy.rs b/tests/unit/out/refcount/sort_no_copy.rs new file mode 100644 index 000000000..327f7661e --- /dev/null +++ b/tests/unit/out/refcount/sort_no_copy.rs @@ -0,0 +1,291 @@ +extern crate libcc2rs; +use libcc2rs::*; +use std::cell::RefCell; +use std::collections::BTreeMap; +use std::io::prelude::*; +use std::io::{Read, Seek, Write}; +use std::os::fd::AsFd; +use std::rc::{Rc, Weak}; +thread_local!( + pub static copies_0: Value = Rc::new(RefCell::new(0)); +); +#[derive(Record, ByteRepr, VaArg, FnPtrArg, MoveCtor, CopyAssign, MoveAssign)] +#[byte_size(4)] +pub struct Tracked { + #[offset(0)] + pub v: i32, +} +impl Tracked { + pub fn new_1() -> Self { + Self { v: 0 } + } + pub fn new_2(mut v: i32) -> Self { + Self { v: v } + } + pub fn copy_from(o: Ptr) -> Self { + let __this: Tracked = Self { + v: o.with(|__s| __s.v), + }; + (*copies_0.with(Value::clone).borrow_mut()).prefix_inc(); + __this + } + pub fn move_from(o: Ptr) -> Self { + Self { + v: o.with(|__s| __s.v), + } + } +} +impl std::cmp::Ord for Tracked { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + { + if operator_lt_1( + Rc::new(RefCell::new(Tracked { v: self.v.clone() })).as_pointer(), + Rc::new(RefCell::new(Tracked { v: other.v.clone() })).as_pointer(), + ) { + std::cmp::Ordering::Less + } else if operator_lt_1( + Rc::new(RefCell::new(Tracked { v: other.v.clone() })).as_pointer(), + Rc::new(RefCell::new(Tracked { v: self.v.clone() })).as_pointer(), + ) { + std::cmp::Ordering::Greater + } else { + std::cmp::Ordering::Equal + } + } + } +} +impl std::cmp::PartialOrd for Tracked { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} +impl std::cmp::PartialEq for Tracked { + fn eq(&self, other: &Self) -> bool { + { + !(operator_lt_1( + Rc::new(RefCell::new(Tracked { v: self.v.clone() })).as_pointer(), + Rc::new(RefCell::new(Tracked { v: other.v.clone() })).as_pointer(), + )) && !(operator_lt_1( + Rc::new(RefCell::new(Tracked { v: other.v.clone() })).as_pointer(), + Rc::new(RefCell::new(Tracked { v: self.v.clone() })).as_pointer(), + )) + } + } +} +impl std::cmp::Eq for Tracked {} +impl Clone for Tracked { + fn clone(&self) -> Self { + let __src: Value = Rc::new(RefCell::new(Tracked { v: self.v.clone() })); + Tracked::copy_from(__src.as_pointer()) + } +} +impl Default for Tracked { + fn default() -> Self { + { Tracked::new_1() } + } +} +pub fn operator_lt_1(a: Ptr, b: Ptr) -> bool { + return ({ a.with(|__s| __s.v) } < { b.with(|__s| __s.v) }); +} +pub fn greater_2(a: Ptr, b: Ptr) -> bool { + return ({ a.with(|__s| __s.v) } > { b.with(|__s| __s.v) }); +} +pub fn main() { + __cpp2rust_init_globals(); + std::process::exit(main_0()); +} +fn main_0() -> i32 { + let arr: Value> = Rc::new(RefCell::new(Box::new([ + Tracked::new_2({ 3 }), + Tracked::new_2({ 1 }), + Tracked::new_2({ 4 }), + Tracked::new_2({ 1 }), + Tracked::new_2({ 5 }), + ]))); + { + let __n = (arr.as_pointer() as Ptr) + .offset((5) as isize) + .iter_distance(&(arr.as_pointer() as Ptr)); + let mut __order: Vec = (0..__n).collect(); + __order.sort_by(|&__x, &__y| { + (arr.as_pointer() as Ptr).iter_at(__x).with(|__a| { + (arr.as_pointer() as Ptr) + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) + }); + reorder(__order, |__i| { + (arr.as_pointer() as Ptr).iter_at(__i) + }); + }; + assert!( + (((({ (*arr.borrow())[(0) as usize].v } == 1) + && ({ (*arr.borrow())[(1) as usize].v } == 1)) + && ({ (*arr.borrow())[(2) as usize].v } == 3)) + && ({ (*arr.borrow())[(3) as usize].v } == 4)) + && ({ (*arr.borrow())[(4) as usize].v } == 5) + ); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + let vec_: Value> = Rc::new(RefCell::new(Vec::new())); + if 4_usize as usize > (*vec_.borrow()).capacity() as usize { + let len_0 = (*vec_.borrow()).len(); + (*vec_.borrow_mut()).reserve_exact(4_usize as usize - len_0 as usize); + }; + { + let __init = Tracked::new_2({ 2 }); + (*vec_.borrow_mut()).push(__init) + }; + { + let __init = Tracked::new_2({ 7 }); + (*vec_.borrow_mut()).push(__init) + }; + { + let __init = Tracked::new_2({ 1 }); + (*vec_.borrow_mut()).push(__init) + }; + { + let __init = Tracked::new_2({ 8 }); + (*vec_.borrow_mut()).push(__init) + }; + { + let __n = (vec_.as_pointer() as Ptr) + .end() + .iter_distance(&(vec_.as_pointer() as Ptr).begin()); + let mut __order: Vec = (0..__n).collect(); + __order.sort_by(|&__x, &__y| { + (vec_.as_pointer() as Ptr) + .begin() + .iter_at(__x) + .with(|__a| { + (vec_.as_pointer() as Ptr) + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) + }); + reorder(__order, |__i| { + (vec_.as_pointer() as Ptr).begin().iter_at(__i) + }); + }; + assert!( + ((({ (*vec_.borrow())[0_usize].v } == 1) && ({ (*vec_.borrow())[1_usize].v } == 2)) + && ({ (*vec_.borrow())[2_usize].v } == 7)) + && ({ (*vec_.borrow())[3_usize].v } == 8) + ); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + { + let __n = (vec_.as_pointer() as Ptr) + .end() + .iter_distance(&(vec_.as_pointer() as Ptr).begin()); + let mut __order: Vec = (0..__n).collect(); + __order.sort_by(|&__x, &__y| { + let __a = (vec_.as_pointer() as Ptr).begin().iter_at(__x); + let __b = (vec_.as_pointer() as Ptr).begin().iter_at(__y); + if greater_2.call(__a.clone(), __b.clone()) { + std::cmp::Ordering::Less + } else if greater_2.call(__b, __a) { + std::cmp::Ordering::Greater + } else { + std::cmp::Ordering::Equal + } + }); + reorder(__order, |__i| { + (vec_.as_pointer() as Ptr).begin().iter_at(__i) + }); + }; + assert!(({ (*vec_.borrow())[0_usize].v } == 8) && ({ (*vec_.borrow())[3_usize].v } == 1)); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + { + let __n = (vec_.as_pointer() as Ptr) + .end() + .iter_distance(&(vec_.as_pointer() as Ptr).begin()); + let mut __order: Vec = (0..__n).collect(); + __order.sort_by(|&__x, &__y| { + let __a = (vec_.as_pointer() as Ptr).begin().iter_at(__x); + let __b = (vec_.as_pointer() as Ptr).begin().iter_at(__y); + if FnPtr::, Ptr) -> bool>::new( + |a: Ptr, b: Ptr| -> bool { + { + return ({ a.with(|__s| __s.v) } < { b.with(|__s| __s.v) }); + } + }, + ) + .call(__a.clone(), __b.clone()) + { + std::cmp::Ordering::Less + } else if FnPtr::, Ptr) -> bool>::new( + |a: Ptr, b: Ptr| -> bool { + { + return ({ a.with(|__s| __s.v) } < { b.with(|__s| __s.v) }); + } + }, + ) + .call(__b, __a) + { + std::cmp::Ordering::Greater + } else { + std::cmp::Ordering::Equal + } + }); + reorder(__order, |__i| { + (vec_.as_pointer() as Ptr).begin().iter_at(__i) + }); + }; + assert!(({ (*vec_.borrow())[0_usize].v } == 1) && ({ (*vec_.borrow())[3_usize].v } == 8)); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + { + let __n = (vec_.as_pointer() as Ptr).end().iter_distance( + &(vec_.as_pointer() as Ptr) + .begin() + .iter_add(1_isize), + ); + let mut __order: Vec = (0..__n).collect(); + __order.sort_by(|&__x, &__y| { + let __a = (vec_.as_pointer() as Ptr) + .begin() + .iter_add(1_isize) + .iter_at(__x); + let __b = (vec_.as_pointer() as Ptr) + .begin() + .iter_add(1_isize) + .iter_at(__y); + if greater_2.call(__a.clone(), __b.clone()) { + std::cmp::Ordering::Less + } else if greater_2.call(__b, __a) { + std::cmp::Ordering::Greater + } else { + std::cmp::Ordering::Equal + } + }); + reorder(__order, |__i| { + (vec_.as_pointer() as Ptr) + .begin() + .iter_add(1_isize) + .iter_at(__i) + }); + }; + assert!( + (({ (*vec_.borrow())[0_usize].v } == 1) && ({ (*vec_.borrow())[1_usize].v } == 8)) + && ({ (*vec_.borrow())[3_usize].v } == 2) + ); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + return copies_0.with(|rc| *rc.borrow()); +} +pub trait TrackedImpl { + fn copy_assign(&self, o: Ptr) -> Ptr; + fn move_assign(&self, o: Ptr) -> Ptr; +} +impl TrackedImpl for Ptr { + fn copy_assign(&self, o: Ptr) -> Ptr { + field!((*self), v).write({ o.with(|__s| __s.v) }); + (*copies_0.with(Value::clone).borrow_mut()).prefix_inc(); + return (*self).clone(); + } + fn move_assign(&self, o: Ptr) -> Ptr { + field!((*self), v).write({ o.with(|__s| __s.v) }); + return (*self).clone(); + } +} +pub fn __cpp2rust_init_globals() { + let _ = copies_0.with(|_| ()); +} diff --git a/tests/unit/out/refcount/stable_sort.rs b/tests/unit/out/refcount/stable_sort.rs index 4af2f4243..6936f8a6b 100644 --- a/tests/unit/out/refcount/stable_sort.rs +++ b/tests/unit/out/refcount/stable_sort.rs @@ -13,20 +13,27 @@ pub fn main() { fn main_0() -> i32 { let arr1: Value> = Rc::new(RefCell::new(Box::new([5, 2, 8, 1, 3]))); { - let fun = |x: Ptr, y: Ptr| { - FnPtr:: bool>::new(|mut x: i32, mut y: i32| -> bool { - { - return (x < y); - } - }) - .call((x.read()).clone(), (y.read()).clone()) - }; - (arr1.as_pointer() as Ptr).sort_with_cmp( - (arr1.as_pointer() as Ptr) - .offset((5) as isize) - .get_offset(), - fun, - ) + let __cmp = FnPtr:: bool>::new(|mut x: i32, mut y: i32| -> bool { + { + return (x < y); + } + }); + let __n = (arr1.as_pointer() as Ptr) + .offset((5) as isize) + .iter_distance(&(arr1.as_pointer() as Ptr)); + let mut __order: Vec = (0..__n).collect(); + __order.sort_by(|&__x, &__y| { + let __a = (arr1.as_pointer() as Ptr).iter_at(__x); + let __b = (arr1.as_pointer() as Ptr).iter_at(__y); + if __cmp.call(__a.read(), __b.read()) { + std::cmp::Ordering::Less + } else if __cmp.call(__b.read(), __a.read()) { + std::cmp::Ordering::Greater + } else { + std::cmp::Ordering::Equal + } + }); + reorder(__order, |__i| (arr1.as_pointer() as Ptr).iter_at(__i)); }; return 0; } diff --git a/tests/unit/out/refcount/structured_binding_copy_ctor.rs b/tests/unit/out/refcount/structured_binding_copy_ctor.rs index 41d029a1f..1b75f6501 100644 --- a/tests/unit/out/refcount/structured_binding_copy_ctor.rs +++ b/tests/unit/out/refcount/structured_binding_copy_ctor.rs @@ -9,7 +9,7 @@ use std::rc::{Rc, Weak}; thread_local!( pub static copies_0: Value = Rc::new(RefCell::new(0)); ); -#[derive(Record, ByteRepr, VaArg, FnPtrArg, Default)] +#[derive(Record, ByteRepr, VaArg, FnPtrArg, CopyAssign, Default)] #[byte_size(8)] pub struct Counted { #[offset(0)] @@ -65,6 +65,16 @@ fn main_0() -> i32 { assert!(({ (*__decomp_5.borrow()).y } == 6)); return 0; } +pub trait CountedImpl { + fn copy_assign(&self, _a0: Ptr) -> Ptr; +} +impl CountedImpl for Ptr { + fn copy_assign(&self, _a0: Ptr) -> Ptr { + field!((*self), x).write({ _a0.with(|__s| __s.x) }); + field!((*self), y).write({ _a0.with(|__s| __s.y) }); + return (*self).clone(); + } +} pub fn __cpp2rust_init_globals() { let _ = copies_0.with(|_| ()); } diff --git a/tests/unit/out/refcount/swap_malloc.rs b/tests/unit/out/refcount/swap_malloc.rs new file mode 100644 index 000000000..469e84938 --- /dev/null +++ b/tests/unit/out/refcount/swap_malloc.rs @@ -0,0 +1,53 @@ +extern crate libcc2rs; +use libcc2rs::*; +use std::cell::RefCell; +use std::collections::BTreeMap; +use std::io::prelude::*; +use std::io::{Read, Seek, Write}; +use std::os::fd::AsFd; +use std::rc::{Rc, Weak}; +pub fn main() { + __cpp2rust_init_globals(); + std::process::exit(main_0()); +} +fn main_0() -> i32 { + let mut buf: Ptr = + libcc2rs::malloc_refcount((3_usize).wrapping_mul((::std::mem::size_of::() as usize))) + .reinterpret_cast::(); + elem!(buf, 0).write(1); + elem!(buf, 1).write(2); + elem!(buf, 2).write(3); + cpp_swap!(buf.offset((0) as isize), buf.offset((2) as isize)); + assert!( + (((elem!(buf, 0).read()) == 3) && ((elem!(buf, 1).read()) == 2)) + && ((elem!(buf, 2).read()) == 1) + ); + cpp_swap!(buf.offset((1) as isize), buf.offset((1) as isize)); + assert!(((elem!(buf, 1).read()) == 2)); + let local: Value = Rc::new(RefCell::new(4)); + cpp_swap!(buf.offset((1) as isize), local.as_pointer()); + assert!(((elem!(buf, 1).read()) == 4) && ((*local.borrow()) == 2)); + let mut other: Ptr = + libcc2rs::malloc_refcount(::std::mem::size_of::()).reinterpret_cast::(); + other.write(5); + cpp_swap!((buf).clone(), (other).clone()); + assert!(((elem!(buf, 0).read()) == 5) && ((other.read()) == 3)); + let mut bytes: Ptr = buf.reinterpret_cast::(); + elem!(bytes, 0).write(170_u8); + elem!(bytes, 4).write(187_u8); + cpp_swap!(bytes.offset((0) as isize), bytes.offset((4) as isize)); + assert!( + (((elem!(bytes, 0).read()) as i32) == 187) && (((elem!(bytes, 4).read()) as i32) == 170) + ); + let words: Value> = Rc::new(RefCell::new(Box::new([16909060_u32, 84281096_u32]))); + let mut halves: Ptr = (words.as_pointer() as Ptr).reinterpret_cast::(); + cpp_swap!(halves.offset((0) as isize), halves.offset((3) as isize)); + assert!( + ((*words.borrow())[(0) as usize] == 16909574_u32) + && ((*words.borrow())[(1) as usize] == 50595592_u32) + ); + libcc2rs::free_refcount((other).to_any()); + libcc2rs::free_refcount((buf).to_any()); + return 0; +} +pub fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/refcount/swap_map_no_copy.rs b/tests/unit/out/refcount/swap_map_no_copy.rs new file mode 100644 index 000000000..d3b699601 --- /dev/null +++ b/tests/unit/out/refcount/swap_map_no_copy.rs @@ -0,0 +1,891 @@ +extern crate libcc2rs; +use libcc2rs::*; +use std::cell::RefCell; +use std::collections::BTreeMap; +use std::io::prelude::*; +use std::io::{Read, Seek, Write}; +use std::os::fd::AsFd; +use std::rc::{Rc, Weak}; +thread_local!( + pub static copies_0: Value = Rc::new(RefCell::new(0)); +); +#[derive(Record, ByteRepr, VaArg, FnPtrArg, MoveCtor, CopyAssign, MoveAssign)] +#[byte_size(4)] +pub struct Tracked { + #[offset(0)] + pub v: i32, +} +impl Tracked { + pub fn new_1() -> Self { + Self { v: 0 } + } + pub fn new_2(mut v: i32) -> Self { + Self { v: v } + } + pub fn copy_from(o: Ptr) -> Self { + let __this: Tracked = Self { + v: o.with(|__s| __s.v), + }; + (*copies_0.with(Value::clone).borrow_mut()).prefix_inc(); + __this + } + pub fn move_from(o: Ptr) -> Self { + Self { + v: o.with(|__s| __s.v), + } + } +} +impl Clone for Tracked { + fn clone(&self) -> Self { + let __src: Value = Rc::new(RefCell::new(Tracked { v: self.v.clone() })); + Tracked::copy_from(__src.as_pointer()) + } +} +impl Default for Tracked { + fn default() -> Self { + { Tracked::new_1() } + } +} +#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg, MoveCtor, CopyAssign, MoveAssign, Default)] +#[byte_size(8)] +pub struct Pair { + #[offset(0)] + #[byte_size(4)] + pub x: Tracked, + #[offset(4)] + #[byte_size(4)] + pub y: Tracked, +} +impl Pair { + pub fn move_from(_a0: Ptr) -> Self { + Self { + x: Tracked::move_from({ field_ptr!(_a0, x) }), + y: Tracked::move_from({ field_ptr!(_a0, y) }), + } + } +} +#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg, CopyAssign)] +#[byte_size(16)] +pub struct Arrays { + #[offset(0)] + #[byte_size(8)] + pub a: Box<[Tracked]>, + #[offset(8)] + #[byte_size(8)] + pub b: Box<[Tracked]>, +} +impl Default for Arrays { + fn default() -> Self { + { + Arrays { + a: (0..2) + .map(|_| ::default()) + .collect::>(), + b: (0..2) + .map(|_| ::default()) + .collect::>(), + } + } + } +} +thread_local!( + pub static copy_only_copies_1: Value = Rc::new(RefCell::new(0)); +); +thread_local!( + pub static copy_only_dtors_2: Value = Rc::new(RefCell::new(0)); +); +#[derive(Record, ByteRepr, VaArg, FnPtrArg, CopyAssign, Destructor, Default)] +#[byte_size(4)] +pub struct CopyOnly { + #[offset(0)] + pub v: i32, +} +impl CopyOnly { + pub fn new(mut v: i32) -> Self { + Self { v: v } + } + pub fn copy_from(o: Ptr) -> Self { + let __this: CopyOnly = Self { + v: o.with(|__s| __s.v), + }; + (*copy_only_copies_1.with(Value::clone).borrow_mut()).prefix_inc(); + __this + } +} +impl Clone for CopyOnly { + fn clone(&self) -> Self { + let __src: Value = Rc::new(RefCell::new(CopyOnly { v: self.v.clone() })); + CopyOnly::copy_from(__src.as_pointer()) + } +} +#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg, CopyAssign, Destructor, Default)] +#[byte_size(8)] +pub struct CopyOnlyPair { + #[offset(0)] + #[byte_size(4)] + pub x: CopyOnly, + #[offset(4)] + #[byte_size(4)] + pub y: CopyOnly, +} +thread_local!( + pub static moves_3: Value = Rc::new(RefCell::new(0)); +); +thread_local!( + pub static move_assigns_4: Value = Rc::new(RefCell::new(0)); +); +thread_local!( + pub static moved_dtors_5: Value = Rc::new(RefCell::new(0)); +); +#[derive( + Record, ByteRepr, VaArg, FnPtrArg, MoveCtor, CopyAssign, MoveAssign, Destructor, Default, +)] +#[byte_size(4)] +pub struct Moved { + #[offset(0)] + pub v: i32, +} +impl Moved { + pub fn new(mut v: i32) -> Self { + Self { v: v } + } + pub fn copy_from(o: Ptr) -> Self { + let __this: Moved = Self { + v: o.with(|__s| __s.v), + }; + (*copies_0.with(Value::clone).borrow_mut()).prefix_inc(); + __this + } + pub fn move_from(o: Ptr) -> Self { + let __this: Moved = Self { + v: o.with(|__s| __s.v), + }; + field!(o, v).write(-1_i32); + (*moves_3.with(Value::clone).borrow_mut()).prefix_inc(); + __this + } +} +impl Clone for Moved { + fn clone(&self) -> Self { + let __src: Value = Rc::new(RefCell::new(Moved { v: self.v.clone() })); + Moved::copy_from(__src.as_pointer()) + } +} +#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg, CopyAssign, Destructor, Default)] +#[byte_size(8)] +pub struct MovedPair { + #[offset(0)] + #[byte_size(4)] + pub x: Moved, + #[offset(4)] + #[byte_size(4)] + pub y: Moved, +} +pub fn swapped_once_6() -> bool { + let mut ok: bool = ((moves_3.with(|rc| *rc.borrow()) == 1) + && (move_assigns_4.with(|rc| *rc.borrow()) == 2)) + && (moved_dtors_5.with(|rc| *rc.borrow()) == 1); + moves_3.with(|rc| { + *rc.borrow_mut() = { + move_assigns_4.with(|rc| { + *rc.borrow_mut() = { + moved_dtors_5.with(|rc| *rc.borrow_mut() = 0); + moved_dtors_5.with(|rc| *rc.borrow()) + } + }); + move_assigns_4.with(|rc| *rc.borrow()) + } + }); + return ok; +} +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign, Default)] +#[byte_size(8)] +pub struct Owner { + #[offset(0)] + #[byte_size(8)] + pub p: Option>, +} +impl Owner { + pub fn move_from(_a0: Ptr) -> Self { + Self { + p: field!(_a0, p).with_mut(|__v: &mut Option>| __v.take()), + } + } +} +#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg, Default)] +#[byte_size(96)] +pub struct Maps { + #[offset(0)] + #[byte_size(48)] + pub m1: Map, Value)>, + #[offset(48)] + #[byte_size(48)] + pub m2: Map, Value)>, +} +pub fn main() { + __cpp2rust_init_globals(); + std::process::exit(main_0()); +} +fn main_0() -> i32 { + let a: Value = Rc::new(RefCell::new(Tracked::new_2({ 1 }))); + let b: Value = Rc::new(RefCell::new(Tracked::new_2({ 2 }))); + cpp_swap!(a.as_pointer(), b.as_pointer()); + assert!(({ (*a.borrow()).v } == 2) && ({ (*b.borrow()).v } == 1)); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + let m1: Value, Value)>> = Rc::new(RefCell::new(Map::new())); + ({ + let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 10 }))); + TrackedImpl::move_assign( + &(m1.as_pointer() as Ptr, Value)>>).with_mut( + |__m: &mut Map, Value)>| { + __m.get_or_insert_with(1.clone(), || { + ( + Rc::new(RefCell::new(1)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }, + ), + _o.as_pointer(), + ) + }); + ({ + let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 20 }))); + TrackedImpl::move_assign( + &(m1.as_pointer() as Ptr, Value)>>).with_mut( + |__m: &mut Map, Value)>| { + __m.get_or_insert_with(2.clone(), || { + ( + Rc::new(RefCell::new(2)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }, + ), + _o.as_pointer(), + ) + }); + let m2: Value, Value)>> = Rc::new(RefCell::new(Map::new())); + ({ + let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 30 }))); + TrackedImpl::move_assign( + &(m2.as_pointer() as Ptr, Value)>>).with_mut( + |__m: &mut Map, Value)>| { + __m.get_or_insert_with(3.clone(), || { + ( + Rc::new(RefCell::new(3)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }, + ), + _o.as_pointer(), + ) + }); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + cpp_swap!( + (m1.as_pointer() as Ptr, Value)>>).with_mut( + |__m: &mut Map, Value)>| { + __m.get_or_insert_with(1.clone(), || { + ( + Rc::new(RefCell::new(1)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + } + ), + (m1.as_pointer() as Ptr, Value)>>).with_mut( + |__m: &mut Map, Value)>| { + __m.get_or_insert_with(2.clone(), || { + ( + Rc::new(RefCell::new(2)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + } + ) + ); + assert!( + ((m1.as_pointer() as Ptr, Value)>>) + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with(1.clone(), || { + ( + Rc::new(RefCell::new(1)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }) + .with(|__s| __s.v) + == 20) + && ((m1.as_pointer() as Ptr, Value)>>) + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with(2.clone(), || { + ( + Rc::new(RefCell::new(2)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }) + .with(|__s| __s.v) + == 10) + ); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + cpp_swap!(m1.as_pointer(), m2.as_pointer()); + assert!( + ((*m1.borrow()).len() == 1_usize) + && ((m1.as_pointer() as Ptr, Value)>>) + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with(3.clone(), || { + ( + Rc::new(RefCell::new(3)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }) + .with(|__s| __s.v) + == 30) + ); + assert!( + (((*m2.borrow()).len() == 2_usize) + && ((m2.as_pointer() as Ptr, Value)>>) + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with(1.clone(), || { + ( + Rc::new(RefCell::new(1)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }) + .with(|__s| __s.v) + == 20)) + && ((m2.as_pointer() as Ptr, Value)>>) + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with(2.clone(), || { + ( + Rc::new(RefCell::new(2)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }) + .with(|__s| __s.v) + == 10) + ); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + let arr: Value> = Rc::new(RefCell::new(Box::new([ + Tracked::new_2({ 1 }), + Tracked::new_2({ 2 }), + Tracked::new_2({ 3 }), + ]))); + cpp_swap!( + (arr.as_pointer() as Ptr).offset(0), + (arr.as_pointer() as Ptr).offset(2) + ); + assert!( + ({ (*arr.borrow())[(0) as usize].v } == 3) && ({ (*arr.borrow())[(2) as usize].v } == 1) + ); + cpp_swap!( + (arr.as_pointer() as Ptr).offset(1), + (arr.as_pointer() as Ptr).offset(1) + ); + assert!(({ (*arr.borrow())[(1) as usize].v } == 2)); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + let vec_: Value> = Rc::new(RefCell::new(Vec::new())); + { + let __init = Tracked::new_2({ 4 }); + (*vec_.borrow_mut()).push(__init) + }; + { + let __init = Tracked::new_2({ 5 }); + (*vec_.borrow_mut()).push(__init) + }; + cpp_swap!( + (vec_.as_pointer() as Ptr).offset(0_usize), + (vec_.as_pointer() as Ptr).offset(1_usize) + ); + assert!(({ (*vec_.borrow())[0_usize].v } == 5) && ({ (*vec_.borrow())[1_usize].v } == 4)); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + let pairs: Value> = Rc::new(RefCell::new(Box::new([ + Pair { + x: Tracked::new_2({ 6 }), + y: Tracked::new_2({ 7 }), + }, + Pair { + x: Tracked::new_2({ 8 }), + y: Tracked::new_2({ 9 }), + }, + ]))); + let p: Value = Rc::new(RefCell::new(Pair { + x: Tracked::new_2({ 10 }), + y: Tracked::new_2({ 11 }), + })); + cpp_swap!( + field_ptr!((pairs.as_pointer() as Ptr).offset(0), x), + field_ptr!(p.as_pointer(), y) + ); + assert!(({ (*pairs.borrow())[(0) as usize].x.v } == 11) && ({ (*p.borrow()).y.v } == 6)); + cpp_swap!( + (pairs.as_pointer() as Ptr).offset(0), + (pairs.as_pointer() as Ptr).offset(1) + ); + assert!( + ({ (*pairs.borrow())[(0) as usize].x.v } == 8) + && ({ (*pairs.borrow())[(1) as usize].x.v } == 11) + ); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + cpp_swap!(field_ptr!(p.as_pointer(), x), field_ptr!(p.as_pointer(), y)); + assert!(({ (*p.borrow()).x.v } == 6) && ({ (*p.borrow()).y.v } == 10)); + cpp_swap!( + field_ptr!((pairs.as_pointer() as Ptr).offset(0), x), + field_ptr!((pairs.as_pointer() as Ptr).offset(1), y) + ); + assert!( + ({ (*pairs.borrow())[(0) as usize].x.v } == 7) + && ({ (*pairs.borrow())[(1) as usize].y.v } == 8) + ); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + let arrays: Value = Rc::new(RefCell::new(::default())); + field!(array_elem!(arrays.as_pointer(), a, 0), v).write(1); + field!(array_elem!(arrays.as_pointer(), b, 1), v).write(2); + cpp_swap!( + (array_field_ptr!(arrays.as_pointer(), a) as Ptr).offset((0) as isize), + (array_field_ptr!(arrays.as_pointer(), b) as Ptr).offset((1) as isize) + ); + assert!( + (array_elem!(arrays.as_pointer(), a, 0).with(|__s| __s.v) == 2) + && (array_elem!(arrays.as_pointer(), b, 1).with(|__s| __s.v) == 1) + ); + cpp_swap!( + (array_field_ptr!(arrays.as_pointer(), a) as Ptr).offset((0) as isize), + (array_field_ptr!(arrays.as_pointer(), a) as Ptr).offset((1) as isize) + ); + assert!( + (array_elem!(arrays.as_pointer(), a, 0).with(|__s| __s.v) == 0) + && (array_elem!(arrays.as_pointer(), a, 1).with(|__s| __s.v) == 2) + ); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + let grid: Value>> = Rc::new(RefCell::new( + (0..(2_usize) as usize) + .map(|_| >::default()) + .collect::>(), + )); + { + let __init = Tracked::new_2({ 1 }); + elem!((grid.as_pointer() as Ptr>), 0_usize) + .with_mut(|__v: &mut Vec| __v.push(__init)) + }; + { + let __init = Tracked::new_2({ 2 }); + elem!((grid.as_pointer() as Ptr>), 0_usize) + .with_mut(|__v: &mut Vec| __v.push(__init)) + }; + { + let __init = Tracked::new_2({ 3 }); + elem!((grid.as_pointer() as Ptr>), 1_usize) + .with_mut(|__v: &mut Vec| __v.push(__init)) + }; + cpp_swap!( + ((grid.as_pointer() as Ptr>) + .offset(0_usize) + .as_pointer() as Ptr) + .offset(1_usize), + ((grid.as_pointer() as Ptr>) + .offset(1_usize) + .as_pointer() as Ptr) + .offset(0_usize) + ); + assert!( + (index!( + elem!((grid.as_pointer() as Ptr>), 0_usize), + 1_usize + ) + .with(|__s| __s.v) + == 3) + && (index!( + elem!((grid.as_pointer() as Ptr>), 1_usize), + 0_usize + ) + .with(|__s| __s.v) + == 2) + ); + cpp_swap!( + (grid.as_pointer() as Ptr>).offset(0_usize), + (grid.as_pointer() as Ptr>).offset(1_usize) + ); + assert!( + ((*((grid.as_pointer() as Ptr>) + .offset(0_usize) + .as_pointer() as Ptr>) + .upgrade() + .deref()) + .len() + == 1_usize) + && (index!( + elem!((grid.as_pointer() as Ptr>), 0_usize), + 0_usize + ) + .with(|__s| __s.v) + == 2) + ); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + let maps: Value = Rc::new(RefCell::new(::default())); + ({ + let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 1 }))); + TrackedImpl::move_assign( + &(field_ptr!(maps.as_pointer(), m1) as Ptr, Value)>>) + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with(1.clone(), || { + ( + Rc::new(RefCell::new(1)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }), + _o.as_pointer(), + ) + }); + ({ + let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 2 }))); + TrackedImpl::move_assign( + &(field_ptr!(maps.as_pointer(), m2) as Ptr, Value)>>) + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with(2.clone(), || { + ( + Rc::new(RefCell::new(2)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }), + _o.as_pointer(), + ) + }); + cpp_swap!( + field_ptr!(maps.as_pointer(), m1), + field_ptr!(maps.as_pointer(), m2) + ); + assert!( + ((*maps.borrow()).m1.len() == 1_usize) + && ((field_ptr!(maps.as_pointer(), m1) as Ptr, Value)>>) + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with(2.clone(), || { + ( + Rc::new(RefCell::new(2)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }) + .with(|__s| __s.v) + == 2) + ); + assert!( + ((*maps.borrow()).m2.len() == 1_usize) + && ((field_ptr!(maps.as_pointer(), m2) as Ptr, Value)>>) + .with_mut(|__m: &mut Map, Value)>| { + __m.get_or_insert_with(1.clone(), || { + ( + Rc::new(RefCell::new(1)), + Rc::new(RefCell::new(::default())), + ) + }) + .borrow() + .1 + .as_pointer() + }) + .with(|__s| __s.v) + == 1) + ); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + let c1: Value = Rc::new(RefCell::new(CopyOnly::new({ 1 }))); + let _dtor_c1 = ScopedDestructor::new(&c1, |__p| __p.destructor()); + let c2: Value = Rc::new(RefCell::new(CopyOnly::new({ 2 }))); + let _dtor_c2 = ScopedDestructor::new(&c2, |__p| __p.destructor()); + cpp_swap!(c1.as_pointer(), c2.as_pointer()); + assert!(({ (*c1.borrow()).v } == 2) && ({ (*c2.borrow()).v } == 1)); + assert!( + (copy_only_copies_1.with(|rc| *rc.borrow()) == 3) + && (copy_only_dtors_2.with(|rc| *rc.borrow()) == 1) + ); + let cp: Value = Rc::new(RefCell::new(CopyOnlyPair { + x: CopyOnly::new({ 3 }), + y: CopyOnly::new({ 4 }), + })); + let _dtor_cp = ScopedDestructor::new(&cp, |__p| __p.destructor()); + cpp_swap!( + field_ptr!(cp.as_pointer(), x), + field_ptr!(cp.as_pointer(), y) + ); + assert!(({ (*cp.borrow()).x.v } == 4) && ({ (*cp.borrow()).y.v } == 3)); + assert!( + (copy_only_copies_1.with(|rc| *rc.borrow()) == 6) + && (copy_only_dtors_2.with(|rc| *rc.borrow()) == 2) + ); + let carr: Value> = Rc::new(RefCell::new(Box::new([ + CopyOnly::new({ 5 }), + CopyOnly::new({ 6 }), + ]))); + cpp_swap!( + (carr.as_pointer() as Ptr).offset(0), + (carr.as_pointer() as Ptr).offset(1) + ); + assert!( + ({ (*carr.borrow())[(0) as usize].v } == 6) && ({ (*carr.borrow())[(1) as usize].v } == 5) + ); + assert!( + (copy_only_copies_1.with(|rc| *rc.borrow()) == 9) + && (copy_only_dtors_2.with(|rc| *rc.borrow()) == 3) + ); + let mv1: Value = Rc::new(RefCell::new(Moved::new({ 1 }))); + let _dtor_mv1 = ScopedDestructor::new(&mv1, |__p| __p.destructor()); + let mv2: Value = Rc::new(RefCell::new(Moved::new({ 2 }))); + let _dtor_mv2 = ScopedDestructor::new(&mv2, |__p| __p.destructor()); + cpp_swap!(mv1.as_pointer(), mv2.as_pointer()); + assert!(({ (*mv1.borrow()).v } == 2) && ({ (*mv2.borrow()).v } == 1)); + assert!(({ swapped_once_6() })); + let mp: Value = Rc::new(RefCell::new(MovedPair { + x: Moved::new({ 3 }), + y: Moved::new({ 4 }), + })); + let _dtor_mp = ScopedDestructor::new(&mp, |__p| __p.destructor()); + cpp_swap!( + field_ptr!(mp.as_pointer(), x), + field_ptr!(mp.as_pointer(), y) + ); + assert!(({ (*mp.borrow()).x.v } == 4) && ({ (*mp.borrow()).y.v } == 3)); + assert!(({ swapped_once_6() })); + let marr: Value> = Rc::new(RefCell::new(Box::new([ + Moved::new({ 5 }), + Moved::new({ 6 }), + ]))); + cpp_swap!( + (marr.as_pointer() as Ptr).offset(0), + (marr.as_pointer() as Ptr).offset(1) + ); + assert!( + ({ (*marr.borrow())[(0) as usize].v } == 6) && ({ (*marr.borrow())[(1) as usize].v } == 5) + ); + assert!(({ swapped_once_6() })); + cpp_swap!(mv1.as_pointer(), mv1.as_pointer()); + assert!(({ (*mv1.borrow()).v } == 2)); + assert!(({ swapped_once_6() })); + assert!((copies_0.with(|rc| *rc.borrow()) == 0)); + let o1: Value = Rc::new(RefCell::new(Owner { + p: Some(Rc::new(RefCell::new(1))), + })); + let o2: Value = Rc::new(RefCell::new(Owner { + p: Some(Rc::new(RefCell::new(2))), + })); + cpp_swap!(o1.as_pointer(), o2.as_pointer()); + assert!( + (({ (*o1.borrow()).p.clone() }.as_pointer().read()) == 2) + && (({ (*o2.borrow()).p.clone() }.as_pointer().read()) == 1) + ); + return copies_0.with(|rc| *rc.borrow()); +} +pub trait ArraysImpl { + fn copy_assign(&self, _a0: Ptr) -> Ptr; +} +impl ArraysImpl for Ptr { + fn copy_assign(&self, _a0: Ptr) -> Ptr { + let mut __i0: usize = 0_usize; + 'loop_: while (__i0 != 2_usize) { + ({ + let _o: Ptr = + (array_field_ptr!(_a0, a) as Ptr).offset((__i0) as isize); + TrackedImpl::copy_assign( + &(array_field_ptr!((*self), a) as Ptr).offset((__i0) as isize), + _o, + ) + }); + __i0.prefix_inc(); + } + let mut __i0: usize = 0_usize; + 'loop_: while (__i0 != 2_usize) { + ({ + let _o: Ptr = + (array_field_ptr!(_a0, b) as Ptr).offset((__i0) as isize); + TrackedImpl::copy_assign( + &(array_field_ptr!((*self), b) as Ptr).offset((__i0) as isize), + _o, + ) + }); + __i0.prefix_inc(); + } + return (*self).clone(); + } +} +pub trait CopyOnlyImpl { + fn destructor(&self); + fn copy_assign(&self, o: Ptr) -> Ptr; +} +impl CopyOnlyImpl for Ptr { + fn destructor(&self) { + (*copy_only_dtors_2.with(Value::clone).borrow_mut()).prefix_inc(); + } + fn copy_assign(&self, o: Ptr) -> Ptr { + field!((*self), v).write({ o.with(|__s| __s.v) }); + (*copy_only_copies_1.with(Value::clone).borrow_mut()).prefix_inc(); + return (*self).clone(); + } +} +pub trait CopyOnlyPairImpl { + fn copy_assign(&self, _a0: Ptr) -> Ptr; + fn destructor(&self); +} +impl CopyOnlyPairImpl for Ptr { + fn copy_assign(&self, _a0: Ptr) -> Ptr { + ({ + let _o: Ptr = field_ptr!(_a0, x); + CopyOnlyImpl::copy_assign(&field_ptr!((*self), x), _o) + }); + ({ + let _o: Ptr = field_ptr!(_a0, y); + CopyOnlyImpl::copy_assign(&field_ptr!((*self), y), _o) + }); + return (*self).clone(); + } + fn destructor(&self) { + field_ptr!(self, y).destructor(); + field_ptr!(self, x).destructor(); + } +} +pub trait MovedImpl { + fn copy_assign(&self, o: Ptr) -> Ptr; + fn move_assign(&self, o: Ptr) -> Ptr; + fn destructor(&self); +} +impl MovedImpl for Ptr { + fn copy_assign(&self, o: Ptr) -> Ptr { + field!((*self), v).write({ o.with(|__s| __s.v) }); + (*copies_0.with(Value::clone).borrow_mut()).prefix_inc(); + return (*self).clone(); + } + fn move_assign(&self, o: Ptr) -> Ptr { + field!((*self), v).write({ o.with(|__s| __s.v) }); + field!(o, v).write(-1_i32); + (*move_assigns_4.with(Value::clone).borrow_mut()).prefix_inc(); + return (*self).clone(); + } + fn destructor(&self) { + (*moved_dtors_5.with(Value::clone).borrow_mut()).prefix_inc(); + } +} +pub trait MovedPairImpl { + fn copy_assign(&self, _a0: Ptr) -> Ptr; + fn destructor(&self); +} +impl MovedPairImpl for Ptr { + fn copy_assign(&self, _a0: Ptr) -> Ptr { + ({ + let _o: Ptr = field_ptr!(_a0, x); + MovedImpl::copy_assign(&field_ptr!((*self), x), _o) + }); + ({ + let _o: Ptr = field_ptr!(_a0, y); + MovedImpl::copy_assign(&field_ptr!((*self), y), _o) + }); + return (*self).clone(); + } + fn destructor(&self) { + field_ptr!(self, y).destructor(); + field_ptr!(self, x).destructor(); + } +} +pub trait OwnerImpl { + fn move_assign(&self, _a0: Ptr) -> Ptr; +} +impl OwnerImpl for Ptr { + fn move_assign(&self, _a0: Ptr) -> Ptr { + (field_ptr!((*self), p) as Ptr>>) + .write(field!(_a0, p).with_mut(|__v: &mut Option>| __v.take())); + return (*self).clone(); + } +} +pub trait PairImpl { + fn copy_assign(&self, _a0: Ptr) -> Ptr; + fn move_assign(&self, _a0: Ptr) -> Ptr; +} +impl PairImpl for Ptr { + fn copy_assign(&self, _a0: Ptr) -> Ptr { + ({ + let _o: Ptr = field_ptr!(_a0, x); + TrackedImpl::copy_assign(&field_ptr!((*self), x), _o) + }); + ({ + let _o: Ptr = field_ptr!(_a0, y); + TrackedImpl::copy_assign(&field_ptr!((*self), y), _o) + }); + return (*self).clone(); + } + fn move_assign(&self, _a0: Ptr) -> Ptr { + ({ + let _o: Ptr = field_ptr!(_a0, x); + TrackedImpl::move_assign(&field_ptr!((*self), x), _o) + }); + ({ + let _o: Ptr = field_ptr!(_a0, y); + TrackedImpl::move_assign(&field_ptr!((*self), y), _o) + }); + return (*self).clone(); + } +} +pub trait TrackedImpl { + fn copy_assign(&self, o: Ptr) -> Ptr; + fn move_assign(&self, o: Ptr) -> Ptr; +} +impl TrackedImpl for Ptr { + fn copy_assign(&self, o: Ptr) -> Ptr { + field!((*self), v).write({ o.with(|__s| __s.v) }); + (*copies_0.with(Value::clone).borrow_mut()).prefix_inc(); + return (*self).clone(); + } + fn move_assign(&self, o: Ptr) -> Ptr { + field!((*self), v).write({ o.with(|__s| __s.v) }); + return (*self).clone(); + } +} +pub fn __cpp2rust_init_globals() { + let _ = copies_0.with(|_| ()); + let _ = copy_only_copies_1.with(|_| ()); + let _ = copy_only_dtors_2.with(|_| ()); + let _ = moves_3.with(|_| ()); + let _ = move_assigns_4.with(|_| ()); + let _ = moved_dtors_5.with(|_| ()); +} diff --git a/tests/unit/out/refcount/unique_ptr.rs b/tests/unit/out/refcount/unique_ptr.rs index c24143f43..4f40237f0 100644 --- a/tests/unit/out/refcount/unique_ptr.rs +++ b/tests/unit/out/refcount/unique_ptr.rs @@ -6,7 +6,7 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, Default)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign, Default)] #[byte_size(8)] pub struct SafePointer { #[offset(0)] diff --git a/tests/unit/out/refcount/unique_ptr_const_deref.rs b/tests/unit/out/refcount/unique_ptr_const_deref.rs index 9ad07cc00..b50c2c47d 100644 --- a/tests/unit/out/refcount/unique_ptr_const_deref.rs +++ b/tests/unit/out/refcount/unique_ptr_const_deref.rs @@ -6,7 +6,7 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, Default)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign, Default)] #[byte_size(8)] pub struct Holder { #[offset(0)] diff --git a/tests/unit/out/refcount/unique_ptr_field_reset.rs b/tests/unit/out/refcount/unique_ptr_field_reset.rs index 6db12088d..157ed5def 100644 --- a/tests/unit/out/refcount/unique_ptr_field_reset.rs +++ b/tests/unit/out/refcount/unique_ptr_field_reset.rs @@ -12,7 +12,7 @@ pub struct Data { #[offset(0)] pub v: i32, } -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, Default)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign, Default)] #[byte_size(16)] pub struct Holder { #[offset(0)] diff --git a/tests/unit/out/refcount/unique_ptr_nested.rs b/tests/unit/out/refcount/unique_ptr_nested.rs index 6969fc19a..67f8613d7 100644 --- a/tests/unit/out/refcount/unique_ptr_nested.rs +++ b/tests/unit/out/refcount/unique_ptr_nested.rs @@ -14,7 +14,7 @@ pub struct Inner { #[offset(4)] pub y: i32, } -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, Default)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign, Default)] #[byte_size(8)] pub struct Outer { #[offset(0)] diff --git a/tests/unit/out/refcount/vector_deque_vector_string.rs b/tests/unit/out/refcount/vector_deque_vector_string.rs index ee5cda203..dc1222c49 100644 --- a/tests/unit/out/refcount/vector_deque_vector_string.rs +++ b/tests/unit/out/refcount/vector_deque_vector_string.rs @@ -147,8 +147,7 @@ fn main_0() -> i32 { .offset(0_usize) .as_pointer() as Ptr>>), ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) + .offset(0_usize) as Ptr>) .write({ let mut __bytes = Ptr::::from_string_literal(b"z").to_c_bytes(); __bytes.push(0); @@ -160,8 +159,7 @@ fn main_0() -> i32 { .offset(0_usize) .as_pointer() as Ptr>>), ) as Ptr>) - .offset(1_usize) - .as_pointer() as Ptr>) + .offset(1_usize) as Ptr>) .upgrade() .deref()) .len() @@ -174,8 +172,7 @@ fn main_0() -> i32 { .offset(0_usize) .as_pointer() as Ptr>>), ) as Ptr>) - .offset(1_usize) - .as_pointer() as Ptr>) + .offset(1_usize) as Ptr>) .decay() .offset(0_usize as isize) } diff --git a/tests/unit/out/refcount/void_cast.rs b/tests/unit/out/refcount/void_cast.rs index 96d41f5b1..33d538629 100644 --- a/tests/unit/out/refcount/void_cast.rs +++ b/tests/unit/out/refcount/void_cast.rs @@ -35,7 +35,7 @@ pub struct Holder { #[offset(0)] pub field: i32, } -#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, Default)] +#[derive(Record, ByteRepr, FnPtrArg, MoveCtor, MoveAssign, Default)] #[byte_size(8)] pub struct NonCopyable { #[offset(0)] diff --git a/tests/unit/out/refcount/void_return.rs b/tests/unit/out/refcount/void_return.rs index 7a852ca37..7a2916348 100644 --- a/tests/unit/out/refcount/void_return.rs +++ b/tests/unit/out/refcount/void_return.rs @@ -22,13 +22,7 @@ pub fn f1_0(first: RandomAccessIterator, last: RandomAccessIterator) { .with(|__b| __a.cmp(__b)) }) }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| (*first.borrow()).clone().iter_at(__i).read()) - .collect(); - for (__i, __v) in (0..__n).zip(__values) { - (*first.borrow()).clone().iter_at(__i).write(__v); - } + reorder(__order, |__i| (*first.borrow()).clone().iter_at(__i)); }; return; } @@ -41,13 +35,7 @@ pub fn f1_1(mut first: Ptr, mut last: Ptr) { .iter_at(__x) .with(|__a| first.iter_at(__y).with(|__b| __a.cmp(__b))) }); - let __values: Vec<_> = __order - .iter() - .map(|&__i| first.iter_at(__i).read()) - .collect(); - for (__i, __v) in (0..__n).zip(__values) { - first.iter_at(__i).write(__v); - } + reorder(__order, |__i| first.iter_at(__i)); }; return; } diff --git a/tests/unit/out/unsafe/copy_assign.rs b/tests/unit/out/unsafe/copy_assign.rs index 4047b29cc..146600c93 100644 --- a/tests/unit/out/unsafe/copy_assign.rs +++ b/tests/unit/out/unsafe/copy_assign.rs @@ -8,7 +8,7 @@ use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; pub static mut assigns_0: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); #[repr(C)] -#[derive(VaArg, FnPtrArg, Default)] +#[derive(VaArg, FnPtrArg, CopyAssignUnsafe, Default)] pub struct Partial { pub v: i32, pub keep: i32, @@ -64,7 +64,7 @@ impl Default for NonConstAssign { } } #[repr(C)] -#[derive(Copy, Clone, VaArg, FnPtrArg)] +#[derive(Copy, Clone, VaArg, FnPtrArg, CopyAssignUnsafe)] pub struct RefQualified { pub mark: i32, } @@ -84,11 +84,79 @@ impl Default for RefQualified { } } #[repr(C)] -#[derive(Clone, VaArg, FnPtrArg, Default)] +#[derive(Clone, VaArg, FnPtrArg, CopyAssignUnsafe, Default)] pub struct Holder { pub p: Partial, pub arr: [Partial; 2], } +impl Holder { + pub unsafe fn copy_assign(&mut self, _a0: *const Holder) -> *mut Holder { + (unsafe { + let _o: *const Partial = &(*_a0).p; + Partial::copy_assign(&mut self.p, _o) + }); + let mut __i0: usize = 0_usize; + 'loop_: while ((__i0) != (2_usize)) { + (unsafe { + let _o: *const Partial = &(*_a0).arr[(__i0)]; + Partial::copy_assign(&mut self.arr[(__i0)], _o) + }); + __i0.prefix_inc(); + } + return &mut (*(self as *mut Holder)); + } +} +pub static mut copies_1: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); +#[repr(C)] +#[derive(VaArg, FnPtrArg, CopyAssignUnsafe, Default)] +pub struct CopyCounted { + pub v: i32, +} +impl CopyCounted { + pub unsafe fn new(mut v: i32) -> Self { + let mut this = Self { v: v }; + this + } + pub unsafe fn copy_from(o: *const CopyCounted) -> Self { + let mut this = Self { v: (*o).v }; + (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_1)).prefix_inc(); + this + } + pub unsafe fn copy_assign(&mut self, _a0: *const CopyCounted) -> *mut CopyCounted { + self.v = (*_a0).v; + return &mut (*(self as *mut CopyCounted)); + } +} +impl Clone for CopyCounted { + fn clone(&self) -> Self { + unsafe { CopyCounted::copy_from(self as *const CopyCounted) } + } +} +#[repr(C)] +#[derive(Clone, VaArg, FnPtrArg, CopyAssignUnsafe, Default)] +pub struct HasCopyCounted { + pub c: CopyCounted, + pub arr: [CopyCounted; 2], +} +impl HasCopyCounted { + pub unsafe fn copy_assign(&mut self, _a0: *const HasCopyCounted) -> *mut HasCopyCounted { + (unsafe { + let _arg0: *const CopyCounted = &(*_a0).c; + CopyCounted::copy_assign(&mut self.c, _arg0) + }); + { + if 8_usize != 0 { + ::std::ptr::copy_nonoverlapping( + ((&(*_a0).arr as *const [CopyCounted; 2]) as *const ::libc::c_void), + ((&mut self.arr as *mut [CopyCounted; 2]) as *mut ::libc::c_void), + 8_usize as usize, + ) + } + ((&mut self.arr as *mut [CopyCounted; 2]) as *mut ::libc::c_void) + }; + return &mut (*(self as *mut HasCopyCounted)); + } +} pub fn main() { unsafe { __cpp2rust_init_globals(); @@ -150,8 +218,35 @@ unsafe fn main_0() -> i32 { let mut r1: RefQualified = RefQualified::new(); (unsafe { RefQualified::copy_assign(&mut r1, &r) }); assert!(((r1.mark) == (1))); + let mut h2: Holder = Holder { + p: Partial::new({ 7 }, { 70 }), + arr: [Partial::new({ 8 }, { 80 }), Partial::new({ 9 }, { 90 })], + }; + (unsafe { Holder::copy_assign(&mut h2, &h) }); + assert!(((h2.p.v) == (2)) && ((h2.p.keep) == (70))); + assert!(((h2.arr[(1) as usize].v) == (2)) && ((h2.arr[(1) as usize].keep) == (90))); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut assigns_0)) == (11))); + let mut cc1: CopyCounted = CopyCounted::new({ 1 }); + let mut cc2: CopyCounted = CopyCounted::new({ 2 }); + (unsafe { CopyCounted::copy_assign(&mut cc1, &cc2) }); + assert!(((cc1.v) == (2))); + let mut hc1: HasCopyCounted = HasCopyCounted { + c: CopyCounted::new({ 1 }), + arr: [CopyCounted::new({ 2 }), CopyCounted::new({ 3 })], + }; + let mut hc2: HasCopyCounted = HasCopyCounted { + c: CopyCounted::new({ 4 }), + arr: [CopyCounted::new({ 5 }), CopyCounted::new({ 6 })], + }; + (unsafe { HasCopyCounted::copy_assign(&mut hc1, &hc2) }); + assert!( + (((hc1.c.v) == (4)) && ((hc1.arr[(0) as usize].v) == (5))) + && ((hc1.arr[(1) as usize].v) == (6)) + ); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_1)) == (0))); return 0; } pub unsafe fn __cpp2rust_init_globals() { std::cell::LazyCell::force(&*&raw const assigns_0); + std::cell::LazyCell::force(&*&raw const copies_1); } diff --git a/tests/unit/out/unsafe/copy_ctor.rs b/tests/unit/out/unsafe/copy_ctor.rs index d25d2dd8f..28350c356 100644 --- a/tests/unit/out/unsafe/copy_ctor.rs +++ b/tests/unit/out/unsafe/copy_ctor.rs @@ -8,7 +8,7 @@ use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; pub static mut copies_0: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); #[repr(C)] -#[derive(VaArg, FnPtrArg, Default)] +#[derive(VaArg, FnPtrArg, CopyAssignUnsafe, Default)] pub struct Counted { pub v: i32, } @@ -22,6 +22,10 @@ impl Counted { (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)).prefix_inc(); this } + pub unsafe fn copy_assign(&mut self, _a0: *const Counted) -> *mut Counted { + self.v = (*_a0).v; + return &mut (*(self as *mut Counted)); + } } impl Clone for Counted { fn clone(&self) -> Self { @@ -29,7 +33,7 @@ impl Clone for Counted { } } #[repr(C)] -#[derive(VaArg, FnPtrArg)] +#[derive(VaArg, FnPtrArg, CopyAssignUnsafe)] pub struct NonConst { pub mark: i32, } @@ -50,6 +54,10 @@ impl NonConst { }; this } + pub unsafe fn copy_assign(&mut self, _a0: *const NonConst) -> *mut NonConst { + self.mark = (*_a0).mark; + return &mut (*(self as *mut NonConst)); + } } impl Clone for NonConst { fn clone(&self) -> Self { @@ -62,7 +70,7 @@ impl Default for NonConst { } } #[repr(C)] -#[derive(VaArg, FnPtrArg, Default)] +#[derive(VaArg, FnPtrArg, CopyAssignUnsafe, Default)] pub struct Ignored { pub v: i32, } @@ -76,6 +84,10 @@ impl Ignored { (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)).prefix_inc(); this } + pub unsafe fn copy_assign(&mut self, _a0: *const Ignored) -> *mut Ignored { + self.v = (*_a0).v; + return &mut (*(self as *mut Ignored)); + } } impl Clone for Ignored { fn clone(&self) -> Self { @@ -83,11 +95,30 @@ impl Clone for Ignored { } } #[repr(C)] -#[derive(Clone, VaArg, FnPtrArg, Default)] +#[derive(Clone, VaArg, FnPtrArg, CopyAssignUnsafe, Default)] pub struct Holder { pub c: Counted, pub arr: [Counted; 2], } +impl Holder { + pub unsafe fn copy_assign(&mut self, _a0: *const Holder) -> *mut Holder { + (unsafe { + let _arg0: *const Counted = &(*_a0).c; + Counted::copy_assign(&mut self.c, _arg0) + }); + { + if 8_usize != 0 { + ::std::ptr::copy_nonoverlapping( + ((&(*_a0).arr as *const [Counted; 2]) as *const ::libc::c_void), + ((&mut self.arr as *mut [Counted; 2]) as *mut ::libc::c_void), + 8_usize as usize, + ) + } + ((&mut self.arr as *mut [Counted; 2]) as *mut ::libc::c_void) + }; + return &mut (*(self as *mut Holder)); + } +} #[repr(C)] #[derive(VaArg, FnPtrArg, MoveCtorUnsafe, Default)] pub struct Box_int_ { @@ -126,7 +157,7 @@ impl Owner { } } #[repr(C)] -#[derive(VaArg, FnPtrArg, Default)] +#[derive(VaArg, FnPtrArg, CopyAssignUnsafe, Default)] pub struct OutOfLine { pub v: i32, } @@ -142,6 +173,10 @@ impl OutOfLine { (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)).prefix_inc(); this } + pub unsafe fn copy_assign(&mut self, _a0: *const OutOfLine) -> *mut OutOfLine { + self.v = (*_a0).v; + return &mut (*(self as *mut OutOfLine)); + } } impl Clone for OutOfLine { fn clone(&self) -> Self { @@ -150,7 +185,7 @@ impl Clone for OutOfLine { } impl OutOfLine {} #[repr(C)] -#[derive(VaArg, FnPtrArg)] +#[derive(VaArg, FnPtrArg, CopyAssignUnsafe)] pub struct Tracked { pub copied_from: i32, } diff --git a/tests/unit/out/unsafe/copy_move_defaulted.rs b/tests/unit/out/unsafe/copy_move_defaulted.rs index 2083dd181..7a017405c 100644 --- a/tests/unit/out/unsafe/copy_move_defaulted.rs +++ b/tests/unit/out/unsafe/copy_move_defaulted.rs @@ -37,7 +37,7 @@ pub struct Implicit { pub arr: [i32; 2], } #[repr(C)] -#[derive(Copy, Clone, VaArg, FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(Copy, Clone, VaArg, FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct DefaultCopyUserMove { pub v: i32, } @@ -58,7 +58,7 @@ impl DefaultCopyUserMove { } } #[repr(C)] -#[derive(VaArg, FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(VaArg, FnPtrArg, MoveCtorUnsafe, CopyAssignUnsafe, MoveAssignUnsafe, Default)] pub struct UserCopyDefaultMove { pub v: i32, } @@ -98,7 +98,7 @@ impl Clone for UserCopyDefaultMove { } } #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct Buffer { pub data: Vec, pub rows: Vec>, @@ -146,7 +146,7 @@ impl Buffer { } } #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct Owner { pub data: Vec, pub n: i32, @@ -181,7 +181,7 @@ impl Owner { } } #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, DestructorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, DestructorUnsafe, Default)] pub struct Holder { pub inner: Inner, pub e: Explicit, diff --git a/tests/unit/out/unsafe/copy_move_deleted.rs b/tests/unit/out/unsafe/copy_move_deleted.rs index e13815983..8387b6370 100644 --- a/tests/unit/out/unsafe/copy_move_deleted.rs +++ b/tests/unit/out/unsafe/copy_move_deleted.rs @@ -7,7 +7,7 @@ use std::io::{Read, Seek, Write}; use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct NoCopy { pub v: i32, } @@ -28,7 +28,7 @@ impl NoCopy { } } #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe)] pub struct PrivateCopy { pub v: i32, } @@ -70,7 +70,7 @@ impl Default for Immovable { } } #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct Container { pub inner: NoCopy, pub tag: i32, diff --git a/tests/unit/out/unsafe/elidable_iterator_copy_cxx11.rs b/tests/unit/out/unsafe/elidable_iterator_copy_cxx11.rs index ff68cccfe..93d688ae4 100644 --- a/tests/unit/out/unsafe/elidable_iterator_copy_cxx11.rs +++ b/tests/unit/out/unsafe/elidable_iterator_copy_cxx11.rs @@ -35,7 +35,7 @@ unsafe fn main_0() -> i32 { let __n = v.end().iter_distance(&v.begin()); for __i in (1..__n).rev() { let __j = libc::rand() as isize % (__i + 1); - std::ptr::swap(v.begin().iter_at(__i), v.begin().iter_at(__j)); + cpp_swap_unsafe!(v.begin().iter_at(__i), v.begin().iter_at(__j)); } }; { diff --git a/tests/unit/out/unsafe/huffman.rs b/tests/unit/out/unsafe/huffman.rs index 9633487d8..865734fbc 100644 --- a/tests/unit/out/unsafe/huffman.rs +++ b/tests/unit/out/unsafe/huffman.rs @@ -40,7 +40,7 @@ pub unsafe fn Swap_0(a: *mut MinHeapNode, b: *mut MinHeapNode) { }; } #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct MinHeap { pub size: i32, pub capacity: i32, diff --git a/tests/unit/out/unsafe/kruskal.rs b/tests/unit/out/unsafe/kruskal.rs index 84cbdf95c..d8540ca8f 100644 --- a/tests/unit/out/unsafe/kruskal.rs +++ b/tests/unit/out/unsafe/kruskal.rs @@ -175,7 +175,7 @@ pub unsafe fn quicksort_1(arr: *mut Option>, mut start: i32, mut end }); } #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct DisjointSet { pub rank: Option>, pub parent: Option>, @@ -297,7 +297,7 @@ impl DisjointSet { } } #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct Graph { pub edges: Option>, pub V: i32, diff --git a/tests/unit/out/unsafe/move_assign.rs b/tests/unit/out/unsafe/move_assign.rs index c654195e9..04b824eae 100644 --- a/tests/unit/out/unsafe/move_assign.rs +++ b/tests/unit/out/unsafe/move_assign.rs @@ -7,7 +7,7 @@ use std::io::{Read, Seek, Write}; use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct MoveOnly { pub v: i32, } diff --git a/tests/unit/out/unsafe/rule_of_five.rs b/tests/unit/out/unsafe/rule_of_five.rs index 26a9cb3b7..669d0b683 100644 --- a/tests/unit/out/unsafe/rule_of_five.rs +++ b/tests/unit/out/unsafe/rule_of_five.rs @@ -10,7 +10,9 @@ pub static mut alive_0: std::cell::LazyCell = std::cell::LazyCell::new(|| u pub static mut copies_1: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); pub static mut moves_2: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); #[repr(C)] -#[derive(VaArg, FnPtrArg, MoveCtorUnsafe, DestructorUnsafe, Default)] +#[derive( + VaArg, FnPtrArg, MoveCtorUnsafe, CopyAssignUnsafe, MoveAssignUnsafe, DestructorUnsafe, Default, +)] pub struct Buffer { pub data: [i32; 4], pub size: i32, diff --git a/tests/unit/out/unsafe/rule_of_three.rs b/tests/unit/out/unsafe/rule_of_three.rs index 8ccb99ca6..b541fbdd9 100644 --- a/tests/unit/out/unsafe/rule_of_three.rs +++ b/tests/unit/out/unsafe/rule_of_three.rs @@ -9,7 +9,7 @@ use std::rc::Rc; pub static mut alive_0: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); pub static mut copies_1: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); #[repr(C)] -#[derive(VaArg, FnPtrArg, DestructorUnsafe, Default)] +#[derive(VaArg, FnPtrArg, CopyAssignUnsafe, DestructorUnsafe, Default)] pub struct Buffer { pub data: [i32; 4], pub size: i32, diff --git a/tests/unit/out/unsafe/sort_no_copy.rs b/tests/unit/out/unsafe/sort_no_copy.rs new file mode 100644 index 000000000..fc0c46284 --- /dev/null +++ b/tests/unit/out/unsafe/sort_no_copy.rs @@ -0,0 +1,262 @@ +extern crate libc; +use libc::*; +extern crate libcc2rs; +use libcc2rs::*; +use std::collections::BTreeMap; +use std::io::{Read, Seek, Write}; +use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; +use std::rc::Rc; +pub static mut copies_0: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); +#[repr(C)] +#[derive(VaArg, FnPtrArg, MoveCtorUnsafe, CopyAssignUnsafe, MoveAssignUnsafe)] +pub struct Tracked { + pub v: i32, +} +impl Tracked { + pub unsafe fn new_1() -> Self { + let mut this = Self { v: 0 }; + this + } + pub unsafe fn new_2(mut v: i32) -> Self { + let mut this = Self { v: v }; + this + } + pub unsafe fn copy_from(o: *const Tracked) -> Self { + let mut this = Self { v: (*o).v }; + (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)).prefix_inc(); + this + } + pub unsafe fn move_from(o: *mut Tracked) -> Self { + let mut this = Self { v: (*o).v }; + this + } + pub unsafe fn copy_assign(&mut self, o: *const Tracked) -> *mut Tracked { + self.v = (*o).v; + (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)).prefix_inc(); + return &mut (*(self as *mut Tracked)); + } + pub unsafe fn move_assign(&mut self, o: *mut Tracked) -> *mut Tracked { + self.v = (*o).v; + return &mut (*(self as *mut Tracked)); + } +} +impl std::cmp::Ord for Tracked { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + unsafe { + if operator_lt_1(self as *const Tracked, other as *const Tracked) { + std::cmp::Ordering::Less + } else if operator_lt_1(other as *const Tracked, self as *const Tracked) { + std::cmp::Ordering::Greater + } else { + std::cmp::Ordering::Equal + } + } + } +} +impl std::cmp::PartialOrd for Tracked { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} +impl std::cmp::PartialEq for Tracked { + fn eq(&self, other: &Self) -> bool { + unsafe { + !(operator_lt_1(self as *const Tracked, other as *const Tracked)) + && !(operator_lt_1(other as *const Tracked, self as *const Tracked)) + } + } +} +impl std::cmp::Eq for Tracked {} +impl Clone for Tracked { + fn clone(&self) -> Self { + unsafe { Tracked::copy_from(self as *const Tracked) } + } +} +impl Default for Tracked { + fn default() -> Self { + unsafe { Tracked::new_1() } + } +} +pub unsafe fn operator_lt_1(a: *const Tracked, b: *const Tracked) -> bool { + return (((*a).v) < ((*b).v)); +} +pub unsafe fn greater_2(a: *const Tracked, b: *const Tracked) -> bool { + return (((*a).v) > ((*b).v)); +} +pub fn main() { + unsafe { + __cpp2rust_init_globals(); + std::process::exit(main_0() as i32); + } +} +unsafe fn main_0() -> i32 { + let mut arr: [Tracked; 5] = [ + Tracked::new_2({ 3 }), + Tracked::new_2({ 1 }), + Tracked::new_2({ 4 }), + Tracked::new_2({ 1 }), + Tracked::new_2({ 5 }), + ]; + { + let __n = arr + .as_mut_ptr() + .offset((5) as isize) + .iter_distance(&arr.as_mut_ptr()); + let mut __order: Vec = (0..__n).collect(); + __order.sort_by(|&__x, &__y| { + (*arr.as_mut_ptr().iter_at(__x)).cmp(&*arr.as_mut_ptr().iter_at(__y)) + }); + let __values: Vec<_> = __order + .iter() + .map(|&__i| std::ptr::read(arr.as_mut_ptr().iter_at(__i))) + .collect(); + for (__i, __v) in (0..__n).zip(__values) { + std::ptr::write(arr.as_mut_ptr().iter_at(__i), __v); + } + }; + assert!( + (((((arr[(0) as usize].v) == (1)) && ((arr[(1) as usize].v) == (1))) + && ((arr[(2) as usize].v) == (3))) + && ((arr[(3) as usize].v) == (4))) + && ((arr[(4) as usize].v) == (5)) + ); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + let mut vec_: Vec = Vec::new(); + if 4_usize as usize > vec_.capacity() as usize { + let len_0 = vec_.len(); + vec_.reserve_exact(4_usize as usize - len_0 as usize); + }; + { + let __init = Tracked::new_2({ 2 }); + vec_.push(__init) + }; + { + let __init = Tracked::new_2({ 7 }); + vec_.push(__init) + }; + { + let __init = Tracked::new_2({ 1 }); + vec_.push(__init) + }; + { + let __init = Tracked::new_2({ 8 }); + vec_.push(__init) + }; + { + let __n = vec_.end().iter_distance(&vec_.begin()); + let mut __order: Vec = (0..__n).collect(); + __order.sort_by(|&__x, &__y| (*vec_.begin().iter_at(__x)).cmp(&*vec_.begin().iter_at(__y))); + let __values: Vec<_> = __order + .iter() + .map(|&__i| std::ptr::read(vec_.begin().iter_at(__i))) + .collect(); + for (__i, __v) in (0..__n).zip(__values) { + std::ptr::write(vec_.begin().iter_at(__i), __v); + } + }; + assert!( + ((((vec_[(0_usize)].v) == (1)) && ((vec_[(1_usize)].v) == (2))) + && ((vec_[(2_usize)].v) == (7))) + && ((vec_[(3_usize)].v) == (8)) + ); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + { + let __n = vec_.end().iter_distance(&vec_.begin()); + let mut __order: Vec = (0..__n).collect(); + __order.sort_by(|&__x, &__y| { + let __a = vec_.begin().iter_at(__x) as *const _; + let __b = vec_.begin().iter_at(__y) as *const _; + if (greater_2 as unsafe fn(*const Tracked, *const Tracked) -> bool).call(__a, __b) { + std::cmp::Ordering::Less + } else if (greater_2 as unsafe fn(*const Tracked, *const Tracked) -> bool) + .call(__b, __a) + { + std::cmp::Ordering::Greater + } else { + std::cmp::Ordering::Equal + } + }); + let __values: Vec<_> = __order + .iter() + .map(|&__i| std::ptr::read(vec_.begin().iter_at(__i))) + .collect(); + for (__i, __v) in (0..__n).zip(__values) { + std::ptr::write(vec_.begin().iter_at(__i), __v); + } + }; + assert!(((vec_[(0_usize)].v) == (8)) && ((vec_[(3_usize)].v) == (1))); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + { + let __n = vec_.end().iter_distance(&vec_.begin()); + let mut __order: Vec = (0..__n).collect(); + __order.sort_by(|&__x, &__y| { + let __a = vec_.begin().iter_at(__x) as *const _; + let __b = vec_.begin().iter_at(__y) as *const _; + if FnPtr:: bool>::new( + |a: *const Tracked, b: *const Tracked| -> bool { + unsafe { + return (((*a).v) < ((*b).v)); + } + }, + ) + .call(__a, __b) + { + std::cmp::Ordering::Less + } else if FnPtr:: bool>::new( + |a: *const Tracked, b: *const Tracked| -> bool { + unsafe { + return (((*a).v) < ((*b).v)); + } + }, + ) + .call(__b, __a) + { + std::cmp::Ordering::Greater + } else { + std::cmp::Ordering::Equal + } + }); + let __values: Vec<_> = __order + .iter() + .map(|&__i| std::ptr::read(vec_.begin().iter_at(__i))) + .collect(); + for (__i, __v) in (0..__n).zip(__values) { + std::ptr::write(vec_.begin().iter_at(__i), __v); + } + }; + assert!(((vec_[(0_usize)].v) == (1)) && ((vec_[(3_usize)].v) == (8))); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + { + let __n = vec_.end().iter_distance(&vec_.begin().iter_add(1_isize)); + let mut __order: Vec = (0..__n).collect(); + __order.sort_by(|&__x, &__y| { + let __a = vec_.begin().iter_add(1_isize).iter_at(__x) as *const _; + let __b = vec_.begin().iter_add(1_isize).iter_at(__y) as *const _; + if (greater_2 as unsafe fn(*const Tracked, *const Tracked) -> bool).call(__a, __b) { + std::cmp::Ordering::Less + } else if (greater_2 as unsafe fn(*const Tracked, *const Tracked) -> bool) + .call(__b, __a) + { + std::cmp::Ordering::Greater + } else { + std::cmp::Ordering::Equal + } + }); + let __values: Vec<_> = __order + .iter() + .map(|&__i| std::ptr::read(vec_.begin().iter_add(1_isize).iter_at(__i))) + .collect(); + for (__i, __v) in (0..__n).zip(__values) { + std::ptr::write(vec_.begin().iter_add(1_isize).iter_at(__i), __v); + } + }; + assert!( + (((vec_[(0_usize)].v) == (1)) && ((vec_[(1_usize)].v) == (8))) + && ((vec_[(3_usize)].v) == (2)) + ); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + return (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)); +} +pub unsafe fn __cpp2rust_init_globals() { + std::cell::LazyCell::force(&*&raw const copies_0); +} diff --git a/tests/unit/out/unsafe/structured_binding_copy_ctor.rs b/tests/unit/out/unsafe/structured_binding_copy_ctor.rs index 003a2be14..cdbeebc6b 100644 --- a/tests/unit/out/unsafe/structured_binding_copy_ctor.rs +++ b/tests/unit/out/unsafe/structured_binding_copy_ctor.rs @@ -8,7 +8,7 @@ use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; pub static mut copies_0: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); #[repr(C)] -#[derive(VaArg, FnPtrArg, Default)] +#[derive(VaArg, FnPtrArg, CopyAssignUnsafe, Default)] pub struct Counted { pub x: i32, pub y: i32, @@ -26,6 +26,11 @@ impl Counted { (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)).prefix_inc(); this } + pub unsafe fn copy_assign(&mut self, _a0: *const Counted) -> *mut Counted { + self.x = (*_a0).x; + self.y = (*_a0).y; + return &mut (*(self as *mut Counted)); + } } impl Clone for Counted { fn clone(&self) -> Self { diff --git a/tests/unit/out/unsafe/swap_malloc.rs b/tests/unit/out/unsafe/swap_malloc.rs new file mode 100644 index 000000000..57de44933 --- /dev/null +++ b/tests/unit/out/unsafe/swap_malloc.rs @@ -0,0 +1,52 @@ +extern crate libc; +use libc::*; +extern crate libcc2rs; +use libcc2rs::*; +use std::collections::BTreeMap; +use std::io::{Read, Seek, Write}; +use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; +use std::rc::Rc; +pub fn main() { + unsafe { + __cpp2rust_init_globals(); + std::process::exit(main_0() as i32); + } +} +unsafe fn main_0() -> i32 { + let mut buf: *mut i32 = + (libcc2rs::malloc_unsafe((3_usize).wrapping_mul((::std::mem::size_of::() as usize))) + as *mut i32); + (*buf.offset((0) as isize)) = 1; + (*buf.offset((1) as isize)) = 2; + (*buf.offset((2) as isize)) = 3; + cpp_swap_unsafe!(buf.offset((0) as isize), buf.offset((2) as isize)); + assert!( + (((*buf.offset((0) as isize)) == (3)) && ((*buf.offset((1) as isize)) == (2))) + && ((*buf.offset((2) as isize)) == (1)) + ); + cpp_swap_unsafe!(buf.offset((1) as isize), buf.offset((1) as isize)); + assert!(((*buf.offset((1) as isize)) == (2))); + let mut local: i32 = 4; + cpp_swap_unsafe!(buf.offset((1) as isize), &mut local); + assert!(((*buf.offset((1) as isize)) == (4)) && ((local) == (2))); + let mut other: *mut i32 = (libcc2rs::malloc_unsafe(::std::mem::size_of::()) as *mut i32); + (*other) = 5; + cpp_swap_unsafe!(buf, other); + assert!(((*buf.offset((0) as isize)) == (5)) && ((*other) == (3))); + let mut bytes: *mut u8 = (buf as *mut u8); + (*bytes.offset((0) as isize)) = 170_u8; + (*bytes.offset((4) as isize)) = 187_u8; + cpp_swap_unsafe!(bytes.offset((0) as isize), bytes.offset((4) as isize)); + assert!( + (((*bytes.offset((0) as isize)) as i32) == (187)) + && (((*bytes.offset((4) as isize)) as i32) == (170)) + ); + let mut words: [u32; 2] = [16909060_u32, 84281096_u32]; + let mut halves: *mut u16 = (words.as_mut_ptr() as *mut u16); + cpp_swap_unsafe!(halves.offset((0) as isize), halves.offset((3) as isize)); + assert!(((words[(0) as usize]) == (16909574_u32)) && ((words[(1) as usize]) == (50595592_u32))); + libcc2rs::free_unsafe((other as *mut ::libc::c_void)); + libcc2rs::free_unsafe((buf as *mut ::libc::c_void)); + return 0; +} +pub unsafe fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/unsafe/swap_map_no_copy.rs b/tests/unit/out/unsafe/swap_map_no_copy.rs new file mode 100644 index 000000000..b6d48583c --- /dev/null +++ b/tests/unit/out/unsafe/swap_map_no_copy.rs @@ -0,0 +1,546 @@ +extern crate libc; +use libc::*; +extern crate libcc2rs; +use libcc2rs::*; +use std::collections::BTreeMap; +use std::io::{Read, Seek, Write}; +use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; +use std::rc::Rc; +pub static mut copies_0: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); +#[repr(C)] +#[derive(VaArg, FnPtrArg, MoveCtorUnsafe, CopyAssignUnsafe, MoveAssignUnsafe)] +pub struct Tracked { + pub v: i32, +} +impl Tracked { + pub unsafe fn new_1() -> Self { + let mut this = Self { v: 0 }; + this + } + pub unsafe fn new_2(mut v: i32) -> Self { + let mut this = Self { v: v }; + this + } + pub unsafe fn copy_from(o: *const Tracked) -> Self { + let mut this = Self { v: (*o).v }; + (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)).prefix_inc(); + this + } + pub unsafe fn move_from(o: *mut Tracked) -> Self { + let mut this = Self { v: (*o).v }; + this + } + pub unsafe fn copy_assign(&mut self, o: *const Tracked) -> *mut Tracked { + self.v = (*o).v; + (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)).prefix_inc(); + return &mut (*(self as *mut Tracked)); + } + pub unsafe fn move_assign(&mut self, o: *mut Tracked) -> *mut Tracked { + self.v = (*o).v; + return &mut (*(self as *mut Tracked)); + } +} +impl Clone for Tracked { + fn clone(&self) -> Self { + unsafe { Tracked::copy_from(self as *const Tracked) } + } +} +impl Default for Tracked { + fn default() -> Self { + unsafe { Tracked::new_1() } + } +} +#[repr(C)] +#[derive(Clone, VaArg, FnPtrArg, MoveCtorUnsafe, CopyAssignUnsafe, MoveAssignUnsafe, Default)] +pub struct Pair { + pub x: Tracked, + pub y: Tracked, +} +impl Pair { + pub unsafe fn move_from(_a0: *mut Pair) -> Self { + let mut this = Self { + x: Tracked::move_from({ &mut (*_a0).x }), + y: Tracked::move_from({ &mut (*_a0).y }), + }; + this + } + pub unsafe fn copy_assign(&mut self, _a0: *const Pair) -> *mut Pair { + (unsafe { + let _o: *const Tracked = &(*_a0).x; + Tracked::copy_assign(&mut self.x, _o) + }); + (unsafe { + let _o: *const Tracked = &(*_a0).y; + Tracked::copy_assign(&mut self.y, _o) + }); + return &mut (*(self as *mut Pair)); + } + pub unsafe fn move_assign(&mut self, _a0: *mut Pair) -> *mut Pair { + (unsafe { + let _o: *mut Tracked = &mut (*_a0).x; + Tracked::move_assign(&mut self.x, _o) + }); + (unsafe { + let _o: *mut Tracked = &mut (*_a0).y; + Tracked::move_assign(&mut self.y, _o) + }); + return &mut (*(self as *mut Pair)); + } +} +#[repr(C)] +#[derive(Clone, VaArg, FnPtrArg, CopyAssignUnsafe, Default)] +pub struct Arrays { + pub a: [Tracked; 2], + pub b: [Tracked; 2], +} +impl Arrays { + pub unsafe fn copy_assign(&mut self, _a0: *const Arrays) -> *mut Arrays { + let mut __i0: usize = 0_usize; + 'loop_: while ((__i0) != (2_usize)) { + (unsafe { + let _o: *const Tracked = &(*_a0).a[(__i0)]; + Tracked::copy_assign(&mut self.a[(__i0)], _o) + }); + __i0.prefix_inc(); + } + let mut __i0: usize = 0_usize; + 'loop_: while ((__i0) != (2_usize)) { + (unsafe { + let _o: *const Tracked = &(*_a0).b[(__i0)]; + Tracked::copy_assign(&mut self.b[(__i0)], _o) + }); + __i0.prefix_inc(); + } + return &mut (*(self as *mut Arrays)); + } +} +pub static mut copy_only_copies_1: std::cell::LazyCell = + std::cell::LazyCell::new(|| unsafe { 0 }); +pub static mut copy_only_dtors_2: std::cell::LazyCell = + std::cell::LazyCell::new(|| unsafe { 0 }); +#[repr(C)] +#[derive(VaArg, FnPtrArg, CopyAssignUnsafe, DestructorUnsafe, Default)] +pub struct CopyOnly { + pub v: i32, +} +impl CopyOnly { + pub unsafe fn new(mut v: i32) -> Self { + let mut this = Self { v: v }; + this + } + pub unsafe fn copy_from(o: *const CopyOnly) -> Self { + let mut this = Self { v: (*o).v }; + (*std::cell::LazyCell::force_mut(&mut *&raw mut copy_only_copies_1)).prefix_inc(); + this + } + pub unsafe fn destructor(&mut self) { + (*std::cell::LazyCell::force_mut(&mut *&raw mut copy_only_dtors_2)).prefix_inc(); + } + pub unsafe fn copy_assign(&mut self, o: *const CopyOnly) -> *mut CopyOnly { + self.v = (*o).v; + (*std::cell::LazyCell::force_mut(&mut *&raw mut copy_only_copies_1)).prefix_inc(); + return &mut (*(self as *mut CopyOnly)); + } +} +impl Clone for CopyOnly { + fn clone(&self) -> Self { + unsafe { CopyOnly::copy_from(self as *const CopyOnly) } + } +} +#[repr(C)] +#[derive(Clone, VaArg, FnPtrArg, CopyAssignUnsafe, DestructorUnsafe, Default)] +pub struct CopyOnlyPair { + pub x: CopyOnly, + pub y: CopyOnly, +} +impl CopyOnlyPair { + pub unsafe fn copy_assign(&mut self, _a0: *const CopyOnlyPair) -> *mut CopyOnlyPair { + (unsafe { + let _o: *const CopyOnly = &(*_a0).x; + CopyOnly::copy_assign(&mut self.x, _o) + }); + (unsafe { + let _o: *const CopyOnly = &(*_a0).y; + CopyOnly::copy_assign(&mut self.y, _o) + }); + return &mut (*(self as *mut CopyOnlyPair)); + } +} +impl CopyOnlyPair { + pub unsafe fn destructor(&mut self) { + CopyOnly::destructor(&mut self.y); + CopyOnly::destructor(&mut self.x); + } +} +pub static mut moves_3: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); +pub static mut move_assigns_4: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); +pub static mut moved_dtors_5: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); +#[repr(C)] +#[derive( + VaArg, FnPtrArg, MoveCtorUnsafe, CopyAssignUnsafe, MoveAssignUnsafe, DestructorUnsafe, Default, +)] +pub struct Moved { + pub v: i32, +} +impl Moved { + pub unsafe fn new(mut v: i32) -> Self { + let mut this = Self { v: v }; + this + } + pub unsafe fn copy_from(o: *const Moved) -> Self { + let mut this = Self { v: (*o).v }; + (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)).prefix_inc(); + this + } + pub unsafe fn move_from(o: *mut Moved) -> Self { + let mut this = Self { v: (*o).v }; + (*o).v = -1_i32; + (*std::cell::LazyCell::force_mut(&mut *&raw mut moves_3)).prefix_inc(); + this + } + pub unsafe fn copy_assign(&mut self, o: *const Moved) -> *mut Moved { + self.v = (*o).v; + (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)).prefix_inc(); + return &mut (*(self as *mut Moved)); + } + pub unsafe fn move_assign(&mut self, o: *mut Moved) -> *mut Moved { + self.v = (*o).v; + (*o).v = -1_i32; + (*std::cell::LazyCell::force_mut(&mut *&raw mut move_assigns_4)).prefix_inc(); + return &mut (*(self as *mut Moved)); + } + pub unsafe fn destructor(&mut self) { + (*std::cell::LazyCell::force_mut(&mut *&raw mut moved_dtors_5)).prefix_inc(); + } +} +impl Clone for Moved { + fn clone(&self) -> Self { + unsafe { Moved::copy_from(self as *const Moved) } + } +} +#[repr(C)] +#[derive(Clone, VaArg, FnPtrArg, CopyAssignUnsafe, DestructorUnsafe, Default)] +pub struct MovedPair { + pub x: Moved, + pub y: Moved, +} +impl MovedPair { + pub unsafe fn copy_assign(&mut self, _a0: *const MovedPair) -> *mut MovedPair { + (unsafe { + let _o: *const Moved = &(*_a0).x; + Moved::copy_assign(&mut self.x, _o) + }); + (unsafe { + let _o: *const Moved = &(*_a0).y; + Moved::copy_assign(&mut self.y, _o) + }); + return &mut (*(self as *mut MovedPair)); + } +} +impl MovedPair { + pub unsafe fn destructor(&mut self) { + Moved::destructor(&mut self.y); + Moved::destructor(&mut self.x); + } +} +pub unsafe fn swapped_once_6() -> bool { + let mut ok: bool = (((*std::cell::LazyCell::force_mut(&mut *&raw mut moves_3)) == (1)) + && ((*std::cell::LazyCell::force_mut(&mut *&raw mut move_assigns_4)) == (2))) + && ((*std::cell::LazyCell::force_mut(&mut *&raw mut moved_dtors_5)) == (1)); + (*std::cell::LazyCell::force_mut(&mut *&raw mut moves_3)) = { + (*std::cell::LazyCell::force_mut(&mut *&raw mut move_assigns_4)) = { + (*std::cell::LazyCell::force_mut(&mut *&raw mut moved_dtors_5)) = 0; + (*std::cell::LazyCell::force_mut(&mut *&raw mut moved_dtors_5)) + }; + (*std::cell::LazyCell::force_mut(&mut *&raw mut move_assigns_4)) + }; + return ok; +} +#[repr(C)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] +pub struct Owner { + pub p: Option>, +} +impl Owner { + pub unsafe fn move_from(_a0: *mut Owner) -> Self { + let mut this = Self { p: (*_a0).p.take() }; + this + } + pub unsafe fn move_assign(&mut self, _a0: *mut Owner) -> *mut Owner { + self.p = (*_a0).p.take(); + return &mut (*(self as *mut Owner)); + } +} +#[repr(C)] +#[derive(Clone, VaArg, FnPtrArg, Default)] +pub struct Maps { + pub m1: UnsafeMap, + pub m2: UnsafeMap, +} +pub fn main() { + unsafe { + __cpp2rust_init_globals(); + std::process::exit(main_0() as i32); + } +} +unsafe fn main_0() -> i32 { + let mut a: Tracked = Tracked::new_2({ 1 }); + let mut b: Tracked = Tracked::new_2({ 2 }); + cpp_swap_unsafe!(&mut a, &mut b); + assert!(((a.v) == (2)) && ((b.v) == (1))); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + let mut m1: UnsafeMap = UnsafeMap::new(); + (unsafe { + let mut _o: Tracked = Tracked::new_2({ 10 }); + Tracked::move_assign( + &mut (*m1.get_or_insert_with(1.clone(), || (1, ::default()))).1, + &mut _o, + ) + }); + (unsafe { + let mut _o: Tracked = Tracked::new_2({ 20 }); + Tracked::move_assign( + &mut (*m1.get_or_insert_with(2.clone(), || (2, ::default()))).1, + &mut _o, + ) + }); + let mut m2: UnsafeMap = UnsafeMap::new(); + (unsafe { + let mut _o: Tracked = Tracked::new_2({ 30 }); + Tracked::move_assign( + &mut (*m2.get_or_insert_with(3.clone(), || (3, ::default()))).1, + &mut _o, + ) + }); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + cpp_swap_unsafe!( + &mut (*m1.get_or_insert_with(1.clone(), || (1, ::default()))).1, + &mut (*m1.get_or_insert_with(2.clone(), || (2, ::default()))).1 + ); + assert!( + (((*m1.get_or_insert_with(1.clone(), || (1, ::default()))) + .1 + .v) + == (20)) + && (((*m1.get_or_insert_with(2.clone(), || (2, ::default()))) + .1 + .v) + == (10)) + ); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + cpp_swap_unsafe!(&mut m1, &mut m2); + assert!( + ((m1.len()) == (1_usize)) + && (((*m1.get_or_insert_with(3.clone(), || (3, ::default()))) + .1 + .v) + == (30)) + ); + assert!( + (((m2.len()) == (2_usize)) + && (((*m2.get_or_insert_with(1.clone(), || (1, ::default()))) + .1 + .v) + == (20))) + && (((*m2.get_or_insert_with(2.clone(), || (2, ::default()))) + .1 + .v) + == (10)) + ); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + let mut arr: [Tracked; 3] = [ + Tracked::new_2({ 1 }), + Tracked::new_2({ 2 }), + Tracked::new_2({ 3 }), + ]; + cpp_swap_unsafe!(&mut arr[(0) as usize], &mut arr[(2) as usize]); + assert!(((arr[(0) as usize].v) == (3)) && ((arr[(2) as usize].v) == (1))); + cpp_swap_unsafe!(&mut arr[(1) as usize], &mut arr[(1) as usize]); + assert!(((arr[(1) as usize].v) == (2))); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + let mut vec_: Vec = Vec::new(); + { + let __init = Tracked::new_2({ 4 }); + vec_.push(__init) + }; + { + let __init = Tracked::new_2({ 5 }); + vec_.push(__init) + }; + cpp_swap_unsafe!(&mut vec_[(0_usize)], &mut vec_[(1_usize)]); + assert!(((vec_[(0_usize)].v) == (5)) && ((vec_[(1_usize)].v) == (4))); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + let mut pairs: [Pair; 2] = [ + Pair { + x: Tracked::new_2({ 6 }), + y: Tracked::new_2({ 7 }), + }, + Pair { + x: Tracked::new_2({ 8 }), + y: Tracked::new_2({ 9 }), + }, + ]; + let mut p: Pair = Pair { + x: Tracked::new_2({ 10 }), + y: Tracked::new_2({ 11 }), + }; + cpp_swap_unsafe!(&mut pairs[(0) as usize].x, &mut p.y); + assert!(((pairs[(0) as usize].x.v) == (11)) && ((p.y.v) == (6))); + cpp_swap_unsafe!(&mut pairs[(0) as usize], &mut pairs[(1) as usize]); + assert!(((pairs[(0) as usize].x.v) == (8)) && ((pairs[(1) as usize].x.v) == (11))); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + cpp_swap_unsafe!(&mut p.x, &mut p.y); + assert!(((p.x.v) == (6)) && ((p.y.v) == (10))); + cpp_swap_unsafe!(&mut pairs[(0) as usize].x, &mut pairs[(1) as usize].y); + assert!(((pairs[(0) as usize].x.v) == (7)) && ((pairs[(1) as usize].y.v) == (8))); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + let mut arrays: Arrays = ::default(); + arrays.a[(0) as usize].v = 1; + arrays.b[(1) as usize].v = 2; + cpp_swap_unsafe!(&mut arrays.a[(0) as usize], &mut arrays.b[(1) as usize]); + assert!(((arrays.a[(0) as usize].v) == (2)) && ((arrays.b[(1) as usize].v) == (1))); + cpp_swap_unsafe!(&mut arrays.a[(0) as usize], &mut arrays.a[(1) as usize]); + assert!(((arrays.a[(0) as usize].v) == (0)) && ((arrays.a[(1) as usize].v) == (2))); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + let mut grid: Vec> = (0..(2_usize) as usize) + .map(|_| >::default()) + .collect::>(); + { + let __init = Tracked::new_2({ 1 }); + grid[(0_usize)].push(__init) + }; + { + let __init = Tracked::new_2({ 2 }); + grid[(0_usize)].push(__init) + }; + { + let __init = Tracked::new_2({ 3 }); + grid[(1_usize)].push(__init) + }; + cpp_swap_unsafe!( + &mut grid[(0_usize)][(1_usize)], + &mut grid[(1_usize)][(0_usize)] + ); + assert!(((grid[(0_usize)][(1_usize)].v) == (3)) && ((grid[(1_usize)][(0_usize)].v) == (2))); + cpp_swap_unsafe!(&mut grid[(0_usize)], &mut grid[(1_usize)]); + assert!(((grid[(0_usize)].len()) == (1_usize)) && ((grid[(0_usize)][(0_usize)].v) == (2))); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + let mut maps: Maps = ::default(); + (unsafe { + let mut _o: Tracked = Tracked::new_2({ 1 }); + Tracked::move_assign( + &mut (*maps + .m1 + .get_or_insert_with(1.clone(), || (1, ::default()))) + .1, + &mut _o, + ) + }); + (unsafe { + let mut _o: Tracked = Tracked::new_2({ 2 }); + Tracked::move_assign( + &mut (*maps + .m2 + .get_or_insert_with(2.clone(), || (2, ::default()))) + .1, + &mut _o, + ) + }); + cpp_swap_unsafe!(&mut maps.m1, &mut maps.m2); + assert!( + ((maps.m1.len()) == (1_usize)) + && (((*maps + .m1 + .get_or_insert_with(2.clone(), || (2, ::default()))) + .1 + .v) == (2)) + ); + assert!( + ((maps.m2.len()) == (1_usize)) + && (((*maps + .m2 + .get_or_insert_with(1.clone(), || (1, ::default()))) + .1 + .v) == (1)) + ); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + let mut c1: CopyOnly = CopyOnly::new({ 1 }); + let _dtor_c1 = ScopedDestructorUnsafe::new(&raw mut c1, CopyOnly::destructor); + let mut c2: CopyOnly = CopyOnly::new({ 2 }); + let _dtor_c2 = ScopedDestructorUnsafe::new(&raw mut c2, CopyOnly::destructor); + cpp_swap_unsafe!(&mut c1, &mut c2); + assert!(((c1.v) == (2)) && ((c2.v) == (1))); + assert!( + ((*std::cell::LazyCell::force_mut(&mut *&raw mut copy_only_copies_1)) == (3)) + && ((*std::cell::LazyCell::force_mut(&mut *&raw mut copy_only_dtors_2)) == (1)) + ); + let mut cp: CopyOnlyPair = CopyOnlyPair { + x: CopyOnly::new({ 3 }), + y: CopyOnly::new({ 4 }), + }; + let _dtor_cp = ScopedDestructorUnsafe::new(&raw mut cp, CopyOnlyPair::destructor); + cpp_swap_unsafe!(&mut cp.x, &mut cp.y); + assert!(((cp.x.v) == (4)) && ((cp.y.v) == (3))); + assert!( + ((*std::cell::LazyCell::force_mut(&mut *&raw mut copy_only_copies_1)) == (6)) + && ((*std::cell::LazyCell::force_mut(&mut *&raw mut copy_only_dtors_2)) == (2)) + ); + let mut carr: [CopyOnly; 2] = [CopyOnly::new({ 5 }), CopyOnly::new({ 6 })]; + cpp_swap_unsafe!(&mut carr[(0) as usize], &mut carr[(1) as usize]); + assert!(((carr[(0) as usize].v) == (6)) && ((carr[(1) as usize].v) == (5))); + assert!( + ((*std::cell::LazyCell::force_mut(&mut *&raw mut copy_only_copies_1)) == (9)) + && ((*std::cell::LazyCell::force_mut(&mut *&raw mut copy_only_dtors_2)) == (3)) + ); + let mut mv1: Moved = Moved::new({ 1 }); + let _dtor_mv1 = ScopedDestructorUnsafe::new(&raw mut mv1, Moved::destructor); + let mut mv2: Moved = Moved::new({ 2 }); + let _dtor_mv2 = ScopedDestructorUnsafe::new(&raw mut mv2, Moved::destructor); + cpp_swap_unsafe!(&mut mv1, &mut mv2); + assert!(((mv1.v) == (2)) && ((mv2.v) == (1))); + assert!((unsafe { swapped_once_6() })); + let mut mp: MovedPair = MovedPair { + x: Moved::new({ 3 }), + y: Moved::new({ 4 }), + }; + let _dtor_mp = ScopedDestructorUnsafe::new(&raw mut mp, MovedPair::destructor); + cpp_swap_unsafe!(&mut mp.x, &mut mp.y); + assert!(((mp.x.v) == (4)) && ((mp.y.v) == (3))); + assert!((unsafe { swapped_once_6() })); + let mut marr: [Moved; 2] = [Moved::new({ 5 }), Moved::new({ 6 })]; + cpp_swap_unsafe!(&mut marr[(0) as usize], &mut marr[(1) as usize]); + assert!(((marr[(0) as usize].v) == (6)) && ((marr[(1) as usize].v) == (5))); + assert!((unsafe { swapped_once_6() })); + cpp_swap_unsafe!(&mut mv1, &mut mv1); + assert!(((mv1.v) == (2))); + assert!((unsafe { swapped_once_6() })); + assert!(((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == (0))); + let mut o1: Owner = Owner { + p: Some(Box::new(1)), + }; + let mut o2: Owner = Owner { + p: Some(Box::new(2)), + }; + cpp_swap_unsafe!(&mut o1, &mut o2); + assert!( + ((*o1 + .p + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + == (2)) + && ((*o2 + .p + .as_deref() + .map_or(::std::ptr::null_mut(), |v| v as *const i32 as *mut i32)) + == (1)) + ); + return (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)); +} +pub unsafe fn __cpp2rust_init_globals() { + std::cell::LazyCell::force(&*&raw const copies_0); + std::cell::LazyCell::force(&*&raw const copy_only_copies_1); + std::cell::LazyCell::force(&*&raw const copy_only_dtors_2); + std::cell::LazyCell::force(&*&raw const moves_3); + std::cell::LazyCell::force(&*&raw const move_assigns_4); + std::cell::LazyCell::force(&*&raw const moved_dtors_5); +} diff --git a/tests/unit/out/unsafe/unique_ptr.rs b/tests/unit/out/unsafe/unique_ptr.rs index 853490b81..1f2d16faa 100644 --- a/tests/unit/out/unsafe/unique_ptr.rs +++ b/tests/unit/out/unsafe/unique_ptr.rs @@ -7,7 +7,7 @@ use std::io::{Read, Seek, Write}; use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct SafePointer { pub ptr: Option>, } diff --git a/tests/unit/out/unsafe/unique_ptr_const_deref.rs b/tests/unit/out/unsafe/unique_ptr_const_deref.rs index 9f93c6ff2..0aeedf23c 100644 --- a/tests/unit/out/unsafe/unique_ptr_const_deref.rs +++ b/tests/unit/out/unsafe/unique_ptr_const_deref.rs @@ -7,7 +7,7 @@ use std::io::{Read, Seek, Write}; use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct Holder { pub val: Option>, } diff --git a/tests/unit/out/unsafe/unique_ptr_field_reset.rs b/tests/unit/out/unsafe/unique_ptr_field_reset.rs index 342681996..119c4b91a 100644 --- a/tests/unit/out/unsafe/unique_ptr_field_reset.rs +++ b/tests/unit/out/unsafe/unique_ptr_field_reset.rs @@ -12,7 +12,7 @@ pub struct Data { pub v: i32, } #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct Holder { pub data: Option>, pub n: i32, diff --git a/tests/unit/out/unsafe/unique_ptr_nested.rs b/tests/unit/out/unsafe/unique_ptr_nested.rs index 114cce9e9..6d35cf2ba 100644 --- a/tests/unit/out/unsafe/unique_ptr_nested.rs +++ b/tests/unit/out/unsafe/unique_ptr_nested.rs @@ -13,7 +13,7 @@ pub struct Inner { pub y: i32, } #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct Outer { pub inner: Option>, } diff --git a/tests/unit/out/unsafe/void_cast.rs b/tests/unit/out/unsafe/void_cast.rs index 954c2b7c3..8536e3a41 100644 --- a/tests/unit/out/unsafe/void_cast.rs +++ b/tests/unit/out/unsafe/void_cast.rs @@ -32,7 +32,7 @@ pub struct Holder { pub field: i32, } #[repr(C)] -#[derive(FnPtrArg, MoveCtorUnsafe, Default)] +#[derive(FnPtrArg, MoveCtorUnsafe, MoveAssignUnsafe, Default)] pub struct NonCopyable { pub value: Option>, } diff --git a/tests/unit/sort_no_copy.cpp b/tests/unit/sort_no_copy.cpp new file mode 100644 index 000000000..1d9815253 --- /dev/null +++ b/tests/unit/sort_no_copy.cpp @@ -0,0 +1,59 @@ +#include +#include +#include + +static int copies = 0; + +struct Tracked { + int v; + Tracked() : v(0) {} + Tracked(int v) : v(v) {} + Tracked(const Tracked &o) : v(o.v) { ++copies; } + Tracked(Tracked &&o) noexcept : v(o.v) {} + Tracked &operator=(const Tracked &o) { + v = o.v; + ++copies; + return *this; + } + Tracked &operator=(Tracked &&o) noexcept { + v = o.v; + return *this; + } +}; + +bool operator<(const Tracked &a, const Tracked &b) { return a.v < b.v; } + +bool greater(const Tracked &a, const Tracked &b) { return a.v > b.v; } + +int main() { + Tracked arr[5] = {Tracked(3), Tracked(1), Tracked(4), Tracked(1), Tracked(5)}; + std::sort(arr, arr + 5); + assert(arr[0].v == 1 && arr[1].v == 1 && arr[2].v == 3 && arr[3].v == 4 && + arr[4].v == 5); + assert(copies == 0); + + std::vector vec; + vec.reserve(4); + vec.emplace_back(2); + vec.emplace_back(7); + vec.emplace_back(1); + vec.emplace_back(8); + std::sort(vec.begin(), vec.end()); + assert(vec[0].v == 1 && vec[1].v == 2 && vec[2].v == 7 && vec[3].v == 8); + assert(copies == 0); + + std::stable_sort(vec.begin(), vec.end(), greater); + assert(vec[0].v == 8 && vec[3].v == 1); + assert(copies == 0); + + std::stable_sort( + vec.begin(), vec.end(), + [](const Tracked &a, const Tracked &b) { return a.v < b.v; }); + assert(vec[0].v == 1 && vec[3].v == 8); + assert(copies == 0); + + std::stable_sort(vec.begin() + 1, vec.end(), greater); + assert(vec[0].v == 1 && vec[1].v == 8 && vec[3].v == 2); + assert(copies == 0); + return copies; +} diff --git a/tests/unit/swap_malloc.cpp b/tests/unit/swap_malloc.cpp new file mode 100644 index 000000000..eb6515e01 --- /dev/null +++ b/tests/unit/swap_malloc.cpp @@ -0,0 +1,38 @@ +#include +#include +#include + +int main() { + int *buf = static_cast(malloc(3 * sizeof(int))); + buf[0] = 1; + buf[1] = 2; + buf[2] = 3; + std::swap(buf[0], buf[2]); + assert(buf[0] == 3 && buf[1] == 2 && buf[2] == 1); + std::swap(buf[1], buf[1]); + assert(buf[1] == 2); + + int local = 4; + std::swap(buf[1], local); + assert(buf[1] == 4 && local == 2); + + int *other = static_cast(malloc(sizeof(int))); + *other = 5; + std::swap(*buf, *other); + assert(buf[0] == 5 && *other == 3); + + unsigned char *bytes = reinterpret_cast(buf); + bytes[0] = 0xAA; + bytes[4] = 0xBB; + std::swap(bytes[0], bytes[4]); + assert(bytes[0] == 0xBB && bytes[4] == 0xAA); + + unsigned words[2] = {0x01020304, 0x05060708}; + unsigned short *halves = reinterpret_cast(words); + std::swap(halves[0], halves[3]); + assert(words[0] == 0x01020506 && words[1] == 0x03040708); + + free(other); + free(buf); + return 0; +} diff --git a/tests/unit/swap_map_no_copy.cpp b/tests/unit/swap_map_no_copy.cpp new file mode 100644 index 000000000..d9f62e77d --- /dev/null +++ b/tests/unit/swap_map_no_copy.cpp @@ -0,0 +1,219 @@ +#include +#include +#include +#include +#include +#include + +static int copies = 0; + +struct Tracked { + int v; + Tracked() : v(0) {} + Tracked(int v) : v(v) {} + Tracked(const Tracked &o) : v(o.v) { ++copies; } + Tracked(Tracked &&o) noexcept : v(o.v) {} + Tracked &operator=(const Tracked &o) { + v = o.v; + ++copies; + return *this; + } + Tracked &operator=(Tracked &&o) noexcept { + v = o.v; + return *this; + } +}; + +struct Pair { + Tracked x; + Tracked y; +}; + +struct Arrays { + Tracked a[2]; + Tracked b[2]; +}; + +static int copy_only_copies = 0; +static int copy_only_dtors = 0; + +// The copy constructor suppresses the move constructor, so std::swap copies. +struct CopyOnly { + int v; + CopyOnly(int v) : v(v) {} + CopyOnly(const CopyOnly &o) : v(o.v) { ++copy_only_copies; } + ~CopyOnly() { ++copy_only_dtors; } + CopyOnly &operator=(const CopyOnly &o) { + v = o.v; + ++copy_only_copies; + return *this; + } +}; + +struct CopyOnlyPair { + CopyOnly x; + CopyOnly y; +}; + +static int moves = 0; +static int move_assigns = 0; +static int moved_dtors = 0; + +// std::swap moves into a temporary, move assigns twice, and destroys the +// temporary. +struct Moved { + int v; + Moved(int v) : v(v) {} + Moved(const Moved &o) : v(o.v) { ++copies; } + Moved(Moved &&o) noexcept : v(o.v) { + o.v = -1; + ++moves; + } + Moved &operator=(const Moved &o) { + v = o.v; + ++copies; + return *this; + } + Moved &operator=(Moved &&o) noexcept { + v = o.v; + o.v = -1; + ++move_assigns; + return *this; + } + ~Moved() { ++moved_dtors; } +}; + +struct MovedPair { + Moved x; + Moved y; +}; + +static bool swapped_once() { + bool ok = moves == 1 && move_assigns == 2 && moved_dtors == 1; + moves = move_assigns = moved_dtors = 0; + return ok; +} + +struct Owner { + std::unique_ptr p; +}; + +struct Maps { + std::map m1; + std::map m2; +}; + +int main() { + Tracked a(1); + Tracked b(2); + std::swap(a, b); + assert(a.v == 2 && b.v == 1); + assert(copies == 0); + + std::map m1; + m1[1] = Tracked(10); + m1[2] = Tracked(20); + std::map m2; + m2[3] = Tracked(30); + assert(copies == 0); + std::swap(m1[1], m1[2]); + assert(m1[1].v == 20 && m1[2].v == 10); + assert(copies == 0); + std::swap(m1, m2); + assert(m1.size() == 1 && m1[3].v == 30); + assert(m2.size() == 2 && m2[1].v == 20 && m2[2].v == 10); + assert(copies == 0); + + Tracked arr[3] = {Tracked(1), Tracked(2), Tracked(3)}; + std::swap(arr[0], arr[2]); + assert(arr[0].v == 3 && arr[2].v == 1); + std::swap(arr[1], arr[1]); + assert(arr[1].v == 2); + assert(copies == 0); + + std::vector vec; + vec.emplace_back(4); + vec.emplace_back(5); + std::swap(vec[0], vec[1]); + assert(vec[0].v == 5 && vec[1].v == 4); + assert(copies == 0); + + Pair pairs[2] = {{Tracked(6), Tracked(7)}, {Tracked(8), Tracked(9)}}; + Pair p{Tracked(10), Tracked(11)}; + std::swap(pairs[0].x, p.y); + assert(pairs[0].x.v == 11 && p.y.v == 6); + std::swap(pairs[0], pairs[1]); + assert(pairs[0].x.v == 8 && pairs[1].x.v == 11); + assert(copies == 0); + + std::swap(p.x, p.y); + assert(p.x.v == 6 && p.y.v == 10); + std::swap(pairs[0].x, pairs[1].y); + assert(pairs[0].x.v == 7 && pairs[1].y.v == 8); + assert(copies == 0); + + Arrays arrays; + arrays.a[0].v = 1; + arrays.b[1].v = 2; + std::swap(arrays.a[0], arrays.b[1]); + assert(arrays.a[0].v == 2 && arrays.b[1].v == 1); + std::swap(arrays.a[0], arrays.a[1]); + assert(arrays.a[0].v == 0 && arrays.a[1].v == 2); + assert(copies == 0); + + std::vector> grid(2); + grid[0].emplace_back(1); + grid[0].emplace_back(2); + grid[1].emplace_back(3); + std::swap(grid[0][1], grid[1][0]); + assert(grid[0][1].v == 3 && grid[1][0].v == 2); + std::swap(grid[0], grid[1]); + assert(grid[0].size() == 1 && grid[0][0].v == 2); + assert(copies == 0); + + Maps maps; + maps.m1[1] = Tracked(1); + maps.m2[2] = Tracked(2); + std::swap(maps.m1, maps.m2); + assert(maps.m1.size() == 1 && maps.m1[2].v == 2); + assert(maps.m2.size() == 1 && maps.m2[1].v == 1); + assert(copies == 0); + + CopyOnly c1(1); + CopyOnly c2(2); + std::swap(c1, c2); + assert(c1.v == 2 && c2.v == 1); + assert(copy_only_copies == 3 && copy_only_dtors == 1); + CopyOnlyPair cp{CopyOnly(3), CopyOnly(4)}; + std::swap(cp.x, cp.y); + assert(cp.x.v == 4 && cp.y.v == 3); + assert(copy_only_copies == 6 && copy_only_dtors == 2); + CopyOnly carr[2] = {CopyOnly(5), CopyOnly(6)}; + std::swap(carr[0], carr[1]); + assert(carr[0].v == 6 && carr[1].v == 5); + assert(copy_only_copies == 9 && copy_only_dtors == 3); + + Moved mv1(1); + Moved mv2(2); + std::swap(mv1, mv2); + assert(mv1.v == 2 && mv2.v == 1); + assert(swapped_once()); + MovedPair mp{Moved(3), Moved(4)}; + std::swap(mp.x, mp.y); + assert(mp.x.v == 4 && mp.y.v == 3); + assert(swapped_once()); + Moved marr[2] = {Moved(5), Moved(6)}; + std::swap(marr[0], marr[1]); + assert(marr[0].v == 6 && marr[1].v == 5); + assert(swapped_once()); + std::swap(mv1, mv1); + assert(mv1.v == 2); + assert(swapped_once()); + assert(copies == 0); + + Owner o1{std::make_unique(1)}; + Owner o2{std::make_unique(2)}; + std::swap(o1, o2); + assert(*o1.p == 2 && *o2.p == 1); + return copies; +} From eb7a3347368803585eb543fe6669d50974de081b Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 16:02:01 +0100 Subject: [PATCH 35/62] Update tests --- tests/unit/out/refcount/class_templates.rs | 8 +- tests/unit/out/refcount/clone_vs_move.rs | 60 ++----- .../unit/out/refcount/compound_assign_ref.rs | 4 +- tests/unit/out/refcount/copy_ctor.rs | 4 +- .../unit/out/refcount/copy_move_defaulted.rs | 9 +- tests/unit/out/refcount/implicit_autoref.rs | 10 +- tests/unit/out/refcount/inet_pton_ntop.rs | 8 +- .../out/refcount/inline_container_fields.rs | 38 ++++- tests/unit/out/refcount/map.rs | 4 +- tests/unit/out/refcount/push_emplace_back.rs | 62 +++++-- tests/unit/out/refcount/ret_rvalue_ref.rs | 2 +- tests/unit/out/refcount/rvalue_ref_general.rs | 4 +- .../refcount/split_binop_aliased_borrows.rs | 2 +- tests/unit/out/refcount/string.rs | 8 +- tests/unit/out/refcount/string2.rs | 2 +- tests/unit/out/refcount/sys_stat.rs | 16 +- .../refcount/unboxed_conditional_iterator.rs | 2 +- tests/unit/out/refcount/unboxed_locals.rs | 9 +- tests/unit/out/refcount/vector.rs | 11 +- tests/unit/out/refcount/vector2.rs | 8 +- tests/unit/out/refcount/vector3.rs | 12 +- .../refcount/vector_deque_vector_string.rs | 157 ++++++++---------- .../out/refcount/vector_subscript_borrow.rs | 16 +- .../out/refcount/vector_subscript_direct.rs | 38 ++--- .../out/refcount/vector_with_allocator.rs | 19 ++- tests/unit/out/unsafe/class_templates.rs | 6 +- tests/unit/out/unsafe/clone_vs_move.rs | 6 +- tests/unit/out/unsafe/compound_assign_ref.rs | 2 +- tests/unit/out/unsafe/copy_ctor.rs | 2 +- tests/unit/out/unsafe/implicit_autoref.rs | 14 +- .../out/unsafe/inline_container_fields.rs | 8 +- tests/unit/out/unsafe/map.rs | 2 +- tests/unit/out/unsafe/ret_rvalue_ref.rs | 2 +- tests/unit/out/unsafe/rvalue_ref_general.rs | 4 +- .../out/unsafe/split_binop_aliased_borrows.rs | 2 +- tests/unit/out/unsafe/string.rs | 44 ++--- tests/unit/out/unsafe/string2.rs | 2 +- .../unsafe/unboxed_conditional_iterator.rs | 2 +- tests/unit/out/unsafe/unboxed_locals.rs | 9 +- tests/unit/out/unsafe/unique_ptr.rs | 2 +- tests/unit/out/unsafe/vector.rs | 31 ++-- tests/unit/out/unsafe/vector2.rs | 8 +- tests/unit/out/unsafe/vector3.rs | 6 +- tests/unit/out/unsafe/vector_addr_of_back.rs | 2 +- .../out/unsafe/vector_deque_vector_string.rs | 2 +- .../out/unsafe/vector_subscript_borrow.rs | 16 +- .../out/unsafe/vector_subscript_direct.rs | 22 +-- .../unit/out/unsafe/vector_with_allocator.rs | 39 ++--- 48 files changed, 387 insertions(+), 359 deletions(-) diff --git a/tests/unit/out/refcount/class_templates.rs b/tests/unit/out/refcount/class_templates.rs index 03f32dca7..543db803d 100644 --- a/tests/unit/out/refcount/class_templates.rs +++ b/tests/unit/out/refcount/class_templates.rs @@ -231,7 +231,7 @@ impl MyContainer_char_Impl for Ptr { return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { - return field_ref!((*self), vec_).as_pointer().decay().to_last(); + return (field_ref!((*self), vec_).as_pointer().decay().to_last()).reinterpret_cast::(); } fn pop_back(&self) { field!((*self), vec_).with_mut(|__v: &mut Vec| __v.pop()); @@ -262,7 +262,8 @@ impl MyContainer_float_Impl for Ptr { return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { - return field_ref!((*self), vec_).as_pointer().decay().to_last(); + return (field_ref!((*self), vec_).as_pointer().decay().to_last()) + .reinterpret_cast::(); } fn pop_back(&self) { field!((*self), vec_).with_mut(|__v: &mut Vec| __v.pop()); @@ -293,7 +294,8 @@ impl MyContainer_int_Impl for Ptr { return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { - return field_ref!((*self), vec_).as_pointer().decay().to_last(); + return (field_ref!((*self), vec_).as_pointer().decay().to_last()) + .reinterpret_cast::(); } fn pop_back(&self) { field!((*self), vec_).with_mut(|__v: &mut Vec| __v.pop()); diff --git a/tests/unit/out/refcount/clone_vs_move.rs b/tests/unit/out/refcount/clone_vs_move.rs index 90888f52f..5401aeba8 100644 --- a/tests/unit/out/refcount/clone_vs_move.rs +++ b/tests/unit/out/refcount/clone_vs_move.rs @@ -160,33 +160,15 @@ fn main_0() -> i32 { let m2: Value>> = Rc::new(RefCell::new((*m1.borrow()).clone())); let mut i: i32 = 0; 'loop_: while (i < N) { - assert!( - ((*m1 - .as_pointer() - .decay() - .offset((i as usize)) - .upgrade() - .deref()) - .len() - == 10_usize) - ); - assert!( - ((*m2 - .as_pointer() - .decay() - .offset((i as usize)) - .upgrade() - .deref()) - .len() - == 10_usize) - ); + assert!(((*m1.borrow())[(i as usize)].len() == 10_usize)); + assert!(((*m2.borrow())[(i as usize)].len() == 10_usize)); let mut j: i32 = 0; 'loop_: while (j < 10) { assert!( - ((index!(elem!(m1.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 0) + ((elem!(m1.as_pointer().decay().offset((i as usize)), (j as usize)).read()) == 0) ); assert!( - ((index!(elem!(m2.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 0) + ((elem!(m2.as_pointer().decay().offset((i as usize)), (j as usize)).read()) == 0) ); j.prefix_inc(); } @@ -196,7 +178,7 @@ fn main_0() -> i32 { 'loop_: while (i < N) { let mut j: i32 = 0; 'loop_: while (j < 10) { - index!(elem!(m2.as_pointer().decay(), (i as usize)), (j as usize)) + elem!(m2.as_pointer().decay().offset((i as usize)), (j as usize)) .with_mut(|__v| __v.postfix_inc()); j.prefix_inc(); } @@ -204,33 +186,15 @@ fn main_0() -> i32 { } let mut i: i32 = 0; 'loop_: while (i < N) { - assert!( - ((*m1 - .as_pointer() - .decay() - .offset((i as usize)) - .upgrade() - .deref()) - .len() - == 10_usize) - ); - assert!( - ((*m2 - .as_pointer() - .decay() - .offset((i as usize)) - .upgrade() - .deref()) - .len() - == 10_usize) - ); + assert!(((*m1.borrow())[(i as usize)].len() == 10_usize)); + assert!(((*m2.borrow())[(i as usize)].len() == 10_usize)); let mut j: i32 = 0; 'loop_: while (j < 10) { assert!( - ((index!(elem!(m1.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 0) + ((elem!(m1.as_pointer().decay().offset((i as usize)), (j as usize)).read()) == 0) ); assert!( - ((index!(elem!(m2.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 1) + ((elem!(m2.as_pointer().decay().offset((i as usize)), (j as usize)).read()) == 1) ); j.prefix_inc(); } @@ -372,9 +336,9 @@ fn main_0() -> i32 { .chain(std::iter::once(0)) .collect(); let mut s2: Vec = (s1).clone(); - s2[0_usize] = ('b' as i8); - s2[1_usize] = ('b' as i8); - s2[2_usize] = ('b' as i8); + s2[0_usize] = (('b' as i8) as i8); + s2[1_usize] = (('b' as i8) as i8); + s2[2_usize] = (('b' as i8) as i8); assert!(((s2[0_usize] as i32) == (('b' as i8) as i32))); assert!(((s2[1_usize] as i32) == (('b' as i8) as i32))); assert!(((s2[2_usize] as i32) == (('b' as i8) as i32))); diff --git a/tests/unit/out/refcount/compound_assign_ref.rs b/tests/unit/out/refcount/compound_assign_ref.rs index c00bc8aba..ab7cf5cdd 100644 --- a/tests/unit/out/refcount/compound_assign_ref.rs +++ b/tests/unit/out/refcount/compound_assign_ref.rs @@ -17,7 +17,9 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; { - v.as_pointer().decay().with_mut(|__v| *__v = *__v + 5) + v.as_pointer() + .decay() + .with_mut(|__v| *__v = *__v + (5 as i32)) }; assert!(((v.as_pointer().decay().read()) == 15)); return 0; diff --git a/tests/unit/out/refcount/copy_ctor.rs b/tests/unit/out/refcount/copy_ctor.rs index 99d2adc5e..719cda7d8 100644 --- a/tests/unit/out/refcount/copy_ctor.rs +++ b/tests/unit/out/refcount/copy_ctor.rs @@ -120,7 +120,9 @@ pub struct Box_int_ { impl Box_int_ { pub fn new(v: i32) -> Self { let v: Value = Rc::new(RefCell::new(v)); - Self { val: (*v.borrow()) } + Self { + val: ((*v.borrow()) as i32), + } } pub fn copy_from(o: Ptr) -> Self { Self { diff --git a/tests/unit/out/refcount/copy_move_defaulted.rs b/tests/unit/out/refcount/copy_move_defaulted.rs index 2423c64aa..db8d9b0da 100644 --- a/tests/unit/out/refcount/copy_move_defaulted.rs +++ b/tests/unit/out/refcount/copy_move_defaulted.rs @@ -340,14 +340,7 @@ fn main_0() -> i32 { ); assert!( (((*r.borrow()).rows.len() == 1_usize) - && ((*field_ref!(r.as_pointer(), rows) - .as_pointer() - .decay() - .offset(0_usize) - .upgrade() - .deref()) - .len() - == 3_usize)) + && ((*vec_elem!(r.as_pointer(), rows, 0_usize).upgrade().deref()).len() == 3_usize)) && ((*q.borrow()).rows.is_empty()) ); let bufs: Value> = Rc::new(RefCell::new(Vec::new())); diff --git a/tests/unit/out/refcount/implicit_autoref.rs b/tests/unit/out/refcount/implicit_autoref.rs index 02a1b2ea5..d8dc77112 100644 --- a/tests/unit/out/refcount/implicit_autoref.rs +++ b/tests/unit/out/refcount/implicit_autoref.rs @@ -31,8 +31,8 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; let mut p: Ptr> = (v.as_pointer()); - let mut a: i32 = (index!(p, 0_usize).read()); - index!(p, 1_usize).write(30); + let mut a: i32 = ((index!(p, 0_usize).read()) as i32); + index!(p, 1_usize).write((30 as i32)); let h: Value = Rc::new(RefCell::new(::default())); { let __a1 = 40; @@ -43,13 +43,13 @@ fn main_0() -> i32 { (*h.borrow_mut()).v.push(__a1) }; let mut hp: Ptr = (h.as_pointer()); - let mut b: i32 = (vec_elem!((hp), v, 0_usize).read()); - vec_elem!((hp), v, 1_usize).write(60); + let mut b: i32 = ((vec_elem!((hp), v, 0_usize).read()) as i32); + vec_elem!((hp), v, 1_usize).write((60 as i32)); assert!((a == 10)); assert!(((index!(p, 1_usize).read()) == 30)); assert!((b == 40)); assert!(((vec_elem!((hp), v, 1_usize).read()) == 60)); - ({ write_through_0((p.decay().offset(0_usize as isize))) }); + ({ write_through_0((p.decay().offset(0_usize as isize)).reinterpret_cast::()) }); assert!(((index!(p, 0_usize).read()) == 42)); return 0; } diff --git a/tests/unit/out/refcount/inet_pton_ntop.rs b/tests/unit/out/refcount/inet_pton_ntop.rs index f62541cec..9fbda7344 100644 --- a/tests/unit/out/refcount/inet_pton_ntop.rs +++ b/tests/unit/out/refcount/inet_pton_ntop.rs @@ -312,7 +312,8 @@ fn main_0() -> i32 { }; match __text { Some(__s) - if (__s.len() as u32) < (::std::mem::size_of::<[i8; 64]>() as u32) => + if (__s.len() as u32) + < (::std::mem::size_of::<[i8; 64]>() as libc::socklen_t) => { let __n = __s.len(); (text.as_pointer() as Ptr).write_c_bytes(__s.as_bytes()); @@ -369,7 +370,8 @@ fn main_0() -> i32 { }; match __text { Some(__s) - if (__s.len() as u32) < (::std::mem::size_of::<[i8; 64]>() as u32) => + if (__s.len() as u32) + < (::std::mem::size_of::<[i8; 64]>() as libc::socklen_t) => { let __n = __s.len(); (text.as_pointer() as Ptr).write_c_bytes(__s.as_bytes()); @@ -419,7 +421,7 @@ fn main_0() -> i32 { None }; match __text { - Some(__s) if (__s.len() as u32) < 4_u32 => { + Some(__s) if (__s.len() as u32) < (4 as libc::socklen_t) => { let __n = __s.len(); (text.as_pointer() as Ptr).write_c_bytes(__s.as_bytes()); elem!((text.as_pointer() as Ptr::), __n).write(0); diff --git a/tests/unit/out/refcount/inline_container_fields.rs b/tests/unit/out/refcount/inline_container_fields.rs index 5474cbf60..864eb6e4c 100644 --- a/tests/unit/out/refcount/inline_container_fields.rs +++ b/tests/unit/out/refcount/inline_container_fields.rs @@ -128,7 +128,8 @@ fn main_0() -> i32 { .decay() .offset(2_usize)); let mut h: Ptr = (array_field_ptr!(e, hist) as Ptr); - let mut c: Ptr = (field_ref!(e, coeffs).as_pointer().decay().offset(1_usize)); + let mut c: Ptr = + (field_ref!(e, coeffs).as_pointer().decay().offset(1_usize)).reinterpret_cast::(); let mut id: Ptr = (field_ptr!( field_ref!(s.as_pointer(), elems) .as_pointer() @@ -184,18 +185,43 @@ fn main_0() -> i32 { .as_pointer() .decay() .offset(0_usize) - .decay() - .offset(0_usize)); + .offset(0_usize)) + .reinterpret_cast::(); elem!(row, 2).write(9); - assert!(((index!(vec_elem!(s.as_pointer(), rows, 0_usize), 2_usize).read()) == 9)); + assert!( + ((elem!( + field_ref!(s.as_pointer(), rows) + .as_pointer() + .decay() + .offset(0_usize), + 2_usize + ) + .read()) + == 9) + ); let t: Value = Rc::new(RefCell::new((*s.borrow()).clone())); index!(field!(vec_elem!(t.as_pointer(), elems, 2_usize), hist), 0).write(100); (*t.borrow_mut()).grid[(0) as usize][(0) as usize] = 100; - index!(vec_elem!(t.as_pointer(), rows, 0_usize), 0_usize).write(100); + elem!( + field_ref!(t.as_pointer(), rows) + .as_pointer() + .decay() + .offset(0_usize), + 0_usize + ) + .write((100 as i32)); assert!( (((index!(field!(vec_elem!(s.as_pointer(), elems, 2_usize), hist), 0).read()) == 0) && ((*s.borrow()).grid[(0) as usize][(0) as usize] == 0)) - && ((index!(vec_elem!(s.as_pointer(), rows, 0_usize), 0_usize).read()) == 1) + && ((elem!( + field_ref!(s.as_pointer(), rows) + .as_pointer() + .decay() + .offset(0_usize), + 0_usize + ) + .read()) + == 1) ); assert!( (((index!( diff --git a/tests/unit/out/refcount/map.rs b/tests/unit/out/refcount/map.rs index 7c4a13b67..96f1b16be 100644 --- a/tests/unit/out/refcount/map.rs +++ b/tests/unit/out/refcount/map.rs @@ -651,9 +651,9 @@ fn main_0() -> i32 { let __rhs = ((i).wrapping_rem(2_u32) != 0); m2.as_pointer() .with_mut(|__m: &mut Map, Value)>| { - __m.get_or_insert_with(indexes[(i as usize)].clone(), || { + __m.get_or_insert_with((indexes[(i as usize)] as i32).clone(), || { ( - Rc::new(RefCell::new(indexes[(i as usize)])), + Rc::new(RefCell::new((indexes[(i as usize)] as i32))), Rc::new(RefCell::new(::default())), ) }) diff --git a/tests/unit/out/refcount/push_emplace_back.rs b/tests/unit/out/refcount/push_emplace_back.rs index 69597b478..892d37621 100644 --- a/tests/unit/out/refcount/push_emplace_back.rs +++ b/tests/unit/out/refcount/push_emplace_back.rs @@ -179,28 +179,49 @@ fn main_0() -> i32 { let vecs: Value>> = Rc::new(RefCell::new(Vec::new())); ({ push_param_0((vecs.as_pointer())) }); assert!(((*vecs.borrow()).len() == 1_usize)); - assert!((*vecs.as_pointer().decay().offset(0_usize).upgrade().deref()).is_empty()); + assert!((*vecs.borrow())[0_usize].is_empty()); let jpg: Value = Rc::new(RefCell::new(::default())); ({ push_local_from_field_1((jpg.as_pointer()), true) }); assert!(((*jpg.borrow()).com_data.len() == 1_usize)); assert!( - ((*field_ref!(jpg.as_pointer(), com_data) - .as_pointer() - .decay() - .offset(0_usize) + ((*vec_elem!(jpg.as_pointer(), com_data, 0_usize) .upgrade() .deref()) .len() == 3_usize) ); assert!( - (((index!(vec_elem!(jpg.as_pointer(), com_data, 0_usize), 0_usize).read()) as i32) == 1) + (((elem!( + field_ref!(jpg.as_pointer(), com_data) + .as_pointer() + .decay() + .offset(0_usize), + 0_usize + ) + .read()) as i32) + == 1) ); assert!( - (((index!(vec_elem!(jpg.as_pointer(), com_data, 0_usize), 1_usize).read()) as i32) == 2) + (((elem!( + field_ref!(jpg.as_pointer(), com_data) + .as_pointer() + .decay() + .offset(0_usize), + 1_usize + ) + .read()) as i32) + == 2) ); assert!( - (((index!(vec_elem!(jpg.as_pointer(), com_data, 0_usize), 2_usize).read()) as i32) == 3) + (((elem!( + field_ref!(jpg.as_pointer(), com_data) + .as_pointer() + .decay() + .offset(0_usize), + 2_usize + ) + .read()) as i32) + == 3) ); assert!((*jpg.borrow()).app_data.is_empty()); let chunks: Value> = Rc::new(RefCell::new(Vec::new())); @@ -215,20 +236,33 @@ fn main_0() -> i32 { ({ emplace_local_from_field_4((jpg.as_pointer()), false) }); assert!(((*jpg.borrow()).app_data.len() == 1_usize)); assert!( - ((*field_ref!(jpg.as_pointer(), app_data) - .as_pointer() - .decay() - .offset(0_usize) + ((*vec_elem!(jpg.as_pointer(), app_data, 0_usize) .upgrade() .deref()) .len() == 3_usize) ); assert!( - (((index!(vec_elem!(jpg.as_pointer(), app_data, 0_usize), 0_usize).read()) as i32) == 1) + (((elem!( + field_ref!(jpg.as_pointer(), app_data) + .as_pointer() + .decay() + .offset(0_usize), + 0_usize + ) + .read()) as i32) + == 1) ); assert!( - (((index!(vec_elem!(jpg.as_pointer(), app_data, 0_usize), 2_usize).read()) as i32) == 3) + (((elem!( + field_ref!(jpg.as_pointer(), app_data) + .as_pointer() + .decay() + .offset(0_usize), + 2_usize + ) + .read()) as i32) + == 3) ); assert!(((*jpg.borrow()).com_data.len() == 1_usize)); (*w.borrow_mut()).chunk.data = 99; diff --git a/tests/unit/out/refcount/ret_rvalue_ref.rs b/tests/unit/out/refcount/ret_rvalue_ref.rs index 8b37ac616..912016862 100644 --- a/tests/unit/out/refcount/ret_rvalue_ref.rs +++ b/tests/unit/out/refcount/ret_rvalue_ref.rs @@ -17,7 +17,7 @@ fn main_0() -> i32 { let __tmp_0: Value = Rc::new(RefCell::new(5)); let i2: Ptr = __tmp_0.as_pointer(); assert!(((i2.read()) == 5)); - let mut i3: i32 = ({ foo_0((i2).clone()) }); + let mut i3: i32 = ({ foo_0((i2).reinterpret_cast::()) }); assert!((i3 == 5)); assert!( (({ diff --git a/tests/unit/out/refcount/rvalue_ref_general.rs b/tests/unit/out/refcount/rvalue_ref_general.rs index 1df1e30a2..69ff289f1 100644 --- a/tests/unit/out/refcount/rvalue_ref_general.rs +++ b/tests/unit/out/refcount/rvalue_ref_general.rs @@ -12,7 +12,7 @@ pub fn main() { } fn main_0() -> i32 { let i1: Value = Rc::new(RefCell::new(3)); - let mut i2: i32 = (*i1.borrow()); + let mut i2: i32 = ((*i1.borrow()) as i32); assert!(((*i1.borrow()) == 3)); assert!((i2 == 3)); let __tmp_0: Value = Rc::new(RefCell::new(40)); @@ -31,7 +31,7 @@ fn main_0() -> i32 { assert!(({ (i6.read()) } == { (i3.read()) })); assert!(({ (i7.read()) } == { (i4.read()) })); let i8: Value = Rc::new(RefCell::new(3)); - let i9: Ptr = i8.as_pointer(); + let i9: Ptr = (i8.as_pointer()).reinterpret_cast::(); assert!(((i9.read()) == 3)); let mut p1: Ptr = (i1.as_pointer()); let mut p2: Ptr = (i3).clone(); diff --git a/tests/unit/out/refcount/split_binop_aliased_borrows.rs b/tests/unit/out/refcount/split_binop_aliased_borrows.rs index dff87f776..b60c058ca 100644 --- a/tests/unit/out/refcount/split_binop_aliased_borrows.rs +++ b/tests/unit/out/refcount/split_binop_aliased_borrows.rs @@ -14,7 +14,7 @@ fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::from([1, 2]))); let p: Value> = Rc::new(RefCell::new(v.as_pointer().decay().begin())); let r: Ptr = v.as_pointer().decay().offset(1_usize); - let __rhs = (r.read()); + let __rhs = ((r.read()) as i32); (*p.borrow()).iter_deref().write(__rhs); assert!(({ (*v.borrow())[0_usize] } == 2)); return 0; diff --git a/tests/unit/out/refcount/string.rs b/tests/unit/out/refcount/string.rs index dd9392010..e27f504fd 100644 --- a/tests/unit/out/refcount/string.rs +++ b/tests/unit/out/refcount/string.rs @@ -61,8 +61,8 @@ fn main_0() -> i32 { } assert!((((*s2.borrow()).len() - 1) == 10_usize)); assert!((((*s2.borrow()).len() - 1) == ((*s2.borrow()).len() - 1))); - (*s2.borrow_mut())[0_usize] = ('b' as i8); - (*s2.borrow_mut())[1_usize] = ('c' as i8); + (*s2.borrow_mut())[0_usize] = (('b' as i8) as i8); + (*s2.borrow_mut())[1_usize] = (('c' as i8) as i8); assert!((({ (*s2.borrow())[0_usize] } as i32) == (('b' as i8) as i32))); assert!((({ (*s2.borrow())[1_usize] } as i32) == (('c' as i8) as i32))); let mut i: u32 = 2_u32; @@ -185,8 +185,8 @@ fn main_0() -> i32 { assert!(((string[2_usize] as i32) == (('r' as i8) as i32))); assert!(((string[3_usize] as i32) == 0)); assert!(((string[4_usize] as i32) == 0)); - string[3_usize] = ('a' as i8); - string[4_usize] = ('b' as i8); + string[3_usize] = (('a' as i8) as i8); + string[4_usize] = (('b' as i8) as i8); assert!(((string[3_usize] as i32) == (('a' as i8) as i32))); assert!(((string[4_usize] as i32) == (('b' as i8) as i32))); string[3_usize] = 0_i8; diff --git a/tests/unit/out/refcount/string2.rs b/tests/unit/out/refcount/string2.rs index c712c9d97..6e66e524a 100644 --- a/tests/unit/out/refcount/string2.rs +++ b/tests/unit/out/refcount/string2.rs @@ -16,7 +16,7 @@ fn main_0() -> i32 { __bytes.push(0); __bytes })); - (*arr.borrow_mut())[1_usize] = ('b' as i8); + (*arr.borrow_mut())[1_usize] = (('b' as i8) as i8); let mut p: Ptr = arr.as_pointer().decay().offset((1) as isize); assert!((((p.read()) as i32) == (('b' as i8) as i32))); assert!( diff --git a/tests/unit/out/refcount/sys_stat.rs b/tests/unit/out/refcount/sys_stat.rs index 25445bb2c..45e28f069 100644 --- a/tests/unit/out/refcount/sys_stat.rs +++ b/tests/unit/out/refcount/sys_stat.rs @@ -122,14 +122,16 @@ pub fn test_st_mtime_access_2() { field_ptr!(st.as_pointer(), st_mtime).with_mut(|__v| __v.postfix_inc()); field_ptr!(sp, st_mtime).with_mut(|__v| __v.prefix_inc()); assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 9_i64) as i32) != 0)); - let mut mtime: Ptr = (field_ptr!(st.as_pointer(), st_mtime)); - mtime.write(10_i64); + let mut mtime: Ptr<::libc::time_t> = + (field_ptr!(st.as_pointer(), st_mtime)).reinterpret_cast::<::libc::time_t>(); + mtime.write((10 as ::libc::time_t)); assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 10_i64) as i32) != 0)); - let mut mtime_via_ptr: Ptr = (field_ptr!(sp, st_mtime)); - mtime_via_ptr.write(11_i64); - assert!(((((mtime.read()) == 11_i64) as i32) != 0)); - let mut copy: i64 = (field_ptr!(sp, st_mtime).read()); - assert!((((copy == 11_i64) as i32) != 0)); + let mut mtime_via_ptr: Ptr<::libc::time_t> = + (field_ptr!(sp, st_mtime)).reinterpret_cast::<::libc::time_t>(); + mtime_via_ptr.write((11 as ::libc::time_t)); + assert!(((((mtime.read()) == (11 as ::libc::time_t)) as i32) != 0)); + let mut copy: ::libc::time_t = ((field_ptr!(sp, st_mtime).read()) as ::libc::time_t); + assert!((((copy == (11 as ::libc::time_t)) as i32) != 0)); } pub fn main() { __cpp2rust_init_globals(); diff --git a/tests/unit/out/refcount/unboxed_conditional_iterator.rs b/tests/unit/out/refcount/unboxed_conditional_iterator.rs index 7d2ecb313..84d9957ea 100644 --- a/tests/unit/out/refcount/unboxed_conditional_iterator.rs +++ b/tests/unit/out/refcount/unboxed_conditional_iterator.rs @@ -41,7 +41,7 @@ pub fn lehmer_2(mut sigma: Ptr, mut len: u32, mut code: Ptr) { )); let mut i: u32 = 0_u32; 'loop_: while (i < len) { - let __rhs = i; + let __rhs = (i as u32); (*items.borrow_mut())[(i as usize)] = __rhs; i.prefix_inc(); } diff --git a/tests/unit/out/refcount/unboxed_locals.rs b/tests/unit/out/refcount/unboxed_locals.rs index 76b2e4137..8d569ae6e 100644 --- a/tests/unit/out/refcount/unboxed_locals.rs +++ b/tests/unit/out/refcount/unboxed_locals.rs @@ -136,7 +136,7 @@ fn main_0() -> i32 { let a0_clone = four.clone(); vec_.push(a0_clone) }; - let __rhs = (vec_[3_usize] + 1); + let __rhs = (((vec_[3_usize] as i32) + 1) as i32); vec_[0_usize] = __rhs; vec_[1_usize].postfix_inc(); assert!(((vec_.len() == 4_usize) && (vec_[0_usize] == 5)) && (vec_[1_usize] == 2)); @@ -154,7 +154,12 @@ fn main_0() -> i32 { let by_ref: Value> = Rc::new(RefCell::new(vec![3; 2_usize as usize])); assert!((({ total_2(by_ref.as_pointer(),) }) == 6)); let elem_ptr: Value> = Rc::new(RefCell::new(vec![0; 2_usize as usize])); - ({ set_0((elem_ptr.as_pointer().decay().offset(1_usize)), 7) }); + ({ + set_0( + (elem_ptr.as_pointer().decay().offset(1_usize)).reinterpret_cast::(), + 7, + ) + }); assert!(({ (*elem_ptr.borrow())[1_usize] } == 7)); let data: Value> = Rc::new(RefCell::new(vec![0; 2_usize as usize])); ({ set_0(data.as_pointer().decay(), 8) }); diff --git a/tests/unit/out/refcount/vector.rs b/tests/unit/out/refcount/vector.rs index 3a981103c..251d4e389 100644 --- a/tests/unit/out/refcount/vector.rs +++ b/tests/unit/out/refcount/vector.rs @@ -35,8 +35,8 @@ fn main_0() -> i32 { }; assert!((v1.len() == 100_usize)); assert!((v1[99_usize] == 0)); - v1[0_usize] = 40; - v1[99_usize] = 50; + v1[0_usize] = (40 as i32); + v1[99_usize] = (50 as i32); assert!((v1[0_usize] == 40)); assert!((v1[99_usize] == 50)); let v2: Value> = Rc::new(RefCell::new(Vec::new())); @@ -252,7 +252,7 @@ fn main_0() -> i32 { assert!((v4.as_pointer().decay().to_last().read()).is_null()); assert!((v5.as_pointer().decay().to_last().read()).is_null()); assert!(((v6.as_pointer().decay().to_last().read()) == 2_f64)); - let ref0: Ptr = v6.as_pointer().decay().to_last(); + let ref0: Ptr = (v6.as_pointer().decay().to_last()).reinterpret_cast::(); ref0.write(5_f64); assert!(((v6.as_pointer().decay().to_last().read()) == 5_f64)); let mut x0: f64 = (v6.as_pointer().decay().to_last().read()); @@ -274,10 +274,11 @@ fn main_0() -> i32 { .read()) == 5_f64) ); - let ref1: Ptr = v6 + let ref1: Ptr = (v6 .as_pointer() .decay() - .offset((s2).wrapping_sub(1_usize) as isize); + .offset((s2).wrapping_sub(1_usize) as isize)) + .reinterpret_cast::(); { ref1.with_mut(|__v| *__v = *__v + 1.5_f64) }; diff --git a/tests/unit/out/refcount/vector2.rs b/tests/unit/out/refcount/vector2.rs index ee6a0c4e0..898f5bb05 100644 --- a/tests/unit/out/refcount/vector2.rs +++ b/tests/unit/out/refcount/vector2.rs @@ -27,8 +27,8 @@ pub fn fn_0(v: Ptr>, v3: Vec) { let __a1 = 3; (*v2.borrow_mut()).push(__a1) }; - x = (index!(v, 2_usize).read()); - (*v2.borrow_mut())[0_usize] = 1; + x = ((index!(v, 2_usize).read()) as i32); + (*v2.borrow_mut())[0_usize] = (1 as i32); elem!( (if true { (Ptr::>::decay(&(v3.as_pointer()))) @@ -37,9 +37,9 @@ pub fn fn_0(v: Ptr>, v3: Vec) { }), 0_usize ) - .write(7); + .write((7 as i32)); v2.as_pointer().write((*v.upgrade().deref()).clone()); - index!(v4, 1_usize).write(13); + index!(v4, 1_usize).write((13 as i32)); assert!((x == 6)); assert!(((v.decay().read()) == 4)); assert!(((index!(v, 1_usize).read()) == 5)); diff --git a/tests/unit/out/refcount/vector3.rs b/tests/unit/out/refcount/vector3.rs index 2cede07ce..f571df0d5 100644 --- a/tests/unit/out/refcount/vector3.rs +++ b/tests/unit/out/refcount/vector3.rs @@ -18,17 +18,15 @@ fn main_0() -> i32 { }; { let __a0 = 2_usize as usize; - elem!(v.as_pointer().decay(), 0_usize) - .with_mut(|__v: &mut Vec| __v.resize_with(__a0, || ::default())) + (*v.borrow_mut())[0_usize].resize_with(__a0, || ::default()) }; { let __a0 = 1_usize as usize; - elem!(v.as_pointer().decay(), 1_usize) - .with_mut(|__v: &mut Vec| __v.resize_with(__a0, || ::default())) + (*v.borrow_mut())[1_usize].resize_with(__a0, || ::default()) }; - index!(elem!(v.as_pointer().decay(), 0_usize), 0_usize).write(1); - index!(elem!(v.as_pointer().decay(), 0_usize), 1_usize).write(5); - index!(elem!(v.as_pointer().decay(), 1_usize), 0_usize).write(6); + elem!(v.as_pointer().decay().offset(0_usize), 0_usize).write((1 as i32)); + elem!(v.as_pointer().decay().offset(0_usize), 1_usize).write((5 as i32)); + elem!(v.as_pointer().decay().offset(1_usize), 0_usize).write((6 as i32)); 'loop_: for v2 in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) { let v2: Ptr> = v2.iter_deref(); 'loop_: for i in IterRange::new(v2.decay().begin(), v2.decay().end()) { diff --git a/tests/unit/out/refcount/vector_deque_vector_string.rs b/tests/unit/out/refcount/vector_deque_vector_string.rs index 334c682fe..25f411ebf 100644 --- a/tests/unit/out/refcount/vector_deque_vector_string.rs +++ b/tests/unit/out/refcount/vector_deque_vector_string.rs @@ -37,8 +37,7 @@ fn main_0() -> i32 { }; (*row.borrow_mut()).push(__a1) }; - elem!(v.as_pointer().decay(), 0_usize) - .with_mut(|__v: &mut Vec>>| __v.push((*row.borrow()).clone())); + (*v.borrow_mut())[0_usize].push((*row.borrow()).clone()); { let __a1 = { let mut __bytes = Ptr::::from_string_literal(b"def").to_c_bytes(); @@ -47,21 +46,14 @@ fn main_0() -> i32 { }; (*row.borrow_mut()).push(__a1) }; - elem!(v.as_pointer().decay(), 1_usize) - .with_mut(|__v: &mut Vec>>| __v.push((*row.borrow()).clone())); + (*v.borrow_mut())[1_usize].push((*row.borrow()).clone()); { let __init = Vec::new(); - elem!(v.as_pointer().decay(), 1_usize) - .with_mut(|__v: &mut Vec>>| __v.push(__init)) + (*v.borrow_mut())[1_usize].push(__init) }; { let __a1 = { - let mut r = - (*Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).decay())) - .offset(1_usize) - .upgrade() - .deref()) - .clone(); + let mut r = elem!(v.as_pointer().decay().offset(0_usize).decay(), 1_usize).read(); r.pop(); Ptr::::from_string_literal(b"x").with_c_str(|__s| r.extend_from_slice(__s)); r.push(0); @@ -93,29 +85,28 @@ fn main_0() -> i32 { .deref()) .len() == 3_usize) - && (Ptr::::from_string_literal(b"def").with_c_str(|__s| { - (*Ptr::>>::decay(&(v.as_pointer().decay().offset(1_usize).decay())) - .offset(2_usize) - .upgrade() - .deref())[..(*Ptr::>>::decay( - &(v.as_pointer().decay().offset(1_usize).decay()), - ) - .offset(2_usize) + && (Ptr::::from_string_literal(b"def").with_c_str(|__s| (*elem!( + v.as_pointer().decay().offset(1_usize).decay(), + 2_usize + ) + .upgrade() + .deref())[..(*elem!(v.as_pointer().decay().offset(1_usize).decay(), 2_usize) .upgrade() .deref()) - .len() - .saturating_sub(1)] - == *__s - })) + .len() + .saturating_sub(1)] + == *__s)) ); assert!(Ptr::::from_string_literal(b"bcx").with_c_str(|__s| { - (*Ptr::>>::decay(&(v.as_pointer().decay().offset(1_usize).decay().to_last())) - .offset(0_usize) - .upgrade() - .deref())[..(*Ptr::>>::decay( - &(v.as_pointer().decay().offset(1_usize).decay().to_last()), + (*elem!( + v.as_pointer().decay().offset(1_usize).decay().to_last(), + 0_usize + ) + .upgrade() + .deref())[..(*elem!( + v.as_pointer().decay().offset(1_usize).decay().to_last(), + 0_usize ) - .offset(0_usize) .upgrade() .deref()) .len() @@ -123,7 +114,10 @@ fn main_0() -> i32 { == *__s })); let copy: Value>>>> = Rc::new(RefCell::new((*v.borrow()).clone())); - Ptr::>>::decay(&(copy.as_pointer().decay().offset(0_usize).decay())) + copy.as_pointer() + .decay() + .offset(0_usize) + .decay() .offset(0_usize) .write({ let mut __bytes = Ptr::::from_string_literal(b"z").to_c_bytes(); @@ -131,7 +125,11 @@ fn main_0() -> i32 { __bytes }); if 0_usize as usize - >= (*Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).decay())) + >= (*v + .as_pointer() + .decay() + .offset(0_usize) + .decay() .offset(1_usize) .upgrade() .deref()) @@ -140,85 +138,70 @@ fn main_0() -> i32 { { panic!("out of bounds access") } else { - Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).decay())) + v.as_pointer() + .decay() + .offset(0_usize) + .decay() .offset(1_usize) .decay() .offset(0_usize as isize) } - .write(('B' as i8)); + .write((('B' as i8) as i8)); assert!( - (Ptr::::from_string_literal(b"a").with_c_str(|__s| (*Ptr::>>::decay( - &(v.as_pointer().decay().offset(0_usize).decay()) + (Ptr::::from_string_literal(b"a").with_c_str(|__s| (*elem!( + v.as_pointer().decay().offset(0_usize).decay(), + 0_usize ) - .offset(0_usize) - .upgrade() - .deref())[..(*Ptr::>>::decay( - &(v.as_pointer().decay().offset(0_usize).decay()) - ) - .offset(0_usize) .upgrade() - .deref()) + .deref())[..(*elem!(v.as_pointer().decay().offset(0_usize).decay(), 0_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s)) - && (Ptr::::from_string_literal(b"z").with_c_str( - |__s| (*Ptr::>>::decay( - &(copy.as_pointer().decay().offset(0_usize).decay()) - ) - .offset(0_usize) - .upgrade() - .deref())[..(*Ptr::>>::decay( - &(copy.as_pointer().decay().offset(0_usize).decay()) - ) - .offset(0_usize) + && (Ptr::::from_string_literal(b"z").with_c_str(|__s| (*elem!( + copy.as_pointer().decay().offset(0_usize).decay(), + 0_usize + ) + .upgrade() + .deref())[..(*elem!(copy.as_pointer().decay().offset(0_usize).decay(), 0_usize) .upgrade() .deref()) - .len() - .saturating_sub(1)] - == *__s - )) + .len() + .saturating_sub(1)] + == *__s)) ); assert!( - (Ptr::::from_string_literal(b"Bc").with_c_str(|__s| (*Ptr::>>::decay( - &(v.as_pointer().decay().offset(0_usize).decay()) + (Ptr::::from_string_literal(b"Bc").with_c_str(|__s| (*elem!( + v.as_pointer().decay().offset(0_usize).decay(), + 1_usize ) - .offset(1_usize) .upgrade() - .deref())[..(*Ptr::>>::decay( - &(v.as_pointer().decay().offset(0_usize).decay()) - ) - .offset(1_usize) - .upgrade() - .deref()) + .deref())[..(*elem!(v.as_pointer().decay().offset(0_usize).decay(), 1_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s)) - && (Ptr::::from_string_literal(b"bc").with_c_str(|__s| { - (*Ptr::>>::decay(&(copy.as_pointer().decay().offset(0_usize).decay())) - .offset(1_usize) - .upgrade() - .deref())[..(*Ptr::>>::decay( - &(copy.as_pointer().decay().offset(0_usize).decay()), - ) - .offset(1_usize) + && (Ptr::::from_string_literal(b"bc").with_c_str(|__s| (*elem!( + copy.as_pointer().decay().offset(0_usize).decay(), + 1_usize + ) + .upgrade() + .deref())[..(*elem!(copy.as_pointer().decay().offset(0_usize).decay(), 1_usize) .upgrade() .deref()) - .len() - .saturating_sub(1)] - == *__s - })) + .len() + .saturating_sub(1)] + == *__s)) ); - elem!(v.as_pointer().decay(), 1_usize).with_mut(|__v: &mut Vec>>| __v.remove(0)); + (*v.borrow_mut())[1_usize].remove(0); assert!(Ptr::::from_string_literal(b"bcx").with_c_str(|__s| { - (*Ptr::>>::decay(&(v.as_pointer().decay().offset(1_usize).decay())) - .offset(0_usize) + (*elem!(v.as_pointer().decay().offset(1_usize).decay(), 0_usize) .upgrade() - .deref())[..(*Ptr::>>::decay( - &(v.as_pointer().decay().offset(1_usize).decay()), - ) - .offset(0_usize) - .upgrade() - .deref()) + .deref())[..(*elem!(v.as_pointer().decay().offset(1_usize).decay(), 0_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s diff --git a/tests/unit/out/refcount/vector_subscript_borrow.rs b/tests/unit/out/refcount/vector_subscript_borrow.rs index 72499bfd6..7a068b2a0 100644 --- a/tests/unit/out/refcount/vector_subscript_borrow.rs +++ b/tests/unit/out/refcount/vector_subscript_borrow.rs @@ -11,7 +11,7 @@ thread_local!( ); pub fn bump_1(mut v: Ptr>, mut x: i32) -> i32 { { - let __rhs = x; + let __rhs = (x as i32); index!(v, 0_usize).with_mut(|__v| *__v = *__v + __rhs) }; return (*next_0.with(Value::clone).borrow_mut()).postfix_inc(); @@ -27,7 +27,7 @@ fn main_0() -> i32 { .collect::>(); let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < items.len()) { - let __rhs = (i).wrapping_mul(2_u32); + let __rhs = ((i).wrapping_mul(2_u32) as u32); items[(i as usize)] = __rhs; i.prefix_inc(); } @@ -41,27 +41,27 @@ fn main_0() -> i32 { v.as_pointer().decay(), ({ (*v.borrow())[0_usize] } as usize) ) - .write(3); - let __rhs = ({ (*v.borrow())[1_usize] } + 4); + .write((3 as i32)); + let __rhs = ((({ (*v.borrow())[1_usize] } as i32) + 4) as i32); elem!( v.as_pointer().decay(), ({ (*v.borrow())[1_usize] } as usize) ) .write(__rhs); assert!(({ (*v.borrow())[1_usize] } == 3) && ({ (*v.borrow())[3_usize] } == 7)); - let mut p: Ptr = (v.as_pointer().decay().offset(0_usize)); - elem!(v.as_pointer().decay(), ((p.read()) as usize)).write(9); + let mut p: Ptr = (v.as_pointer().decay().offset(0_usize)).reinterpret_cast::(); + elem!(v.as_pointer().decay(), ((p.read()) as usize)).write((9 as i32)); assert!(({ (*v.borrow())[1_usize] } == 9)); elem!( v.as_pointer().decay(), (({ bump_1((v.as_pointer()), 10,) }) as usize) ) - .write(2); + .write((2 as i32)); assert!(({ (*v.borrow())[0_usize] } == 2)); assert!( (({ let _v: Ptr> = (v.as_pointer()); - let _x: i32 = { (*v.borrow())[2_usize] }; + let _x: i32 = ({ (*v.borrow())[2_usize] } as i32); bump_1(_v, _x) }) == 1) && ({ (*v.borrow())[0_usize] } == 3) diff --git a/tests/unit/out/refcount/vector_subscript_direct.rs b/tests/unit/out/refcount/vector_subscript_direct.rs index 3bb1e60cf..72338c52e 100644 --- a/tests/unit/out/refcount/vector_subscript_direct.rs +++ b/tests/unit/out/refcount/vector_subscript_direct.rs @@ -35,7 +35,7 @@ pub fn sum_ref_1(v: Ptr>) -> i32 { let mut s: i32 = 0; let mut i: usize = 0_usize; 'loop_: while ({ i } < { (*v.upgrade().deref()).len() }) { - s += (index!(v, i).read()); + s += ((index!(v, i).read()) as i32); i.prefix_inc(); } return s; @@ -46,15 +46,15 @@ pub fn main() { } fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::from([1, 2, 3]))); - (*v.borrow_mut())[0_usize] = 10; + (*v.borrow_mut())[0_usize] = (10 as i32); assert!(({ (*v.borrow())[0_usize] } == 10)); - (*v.borrow_mut())[1_usize] += 5; + (*v.borrow_mut())[1_usize] += (5 as i32); (*v.borrow_mut())[2_usize].postfix_inc(); assert!(({ (*v.borrow())[1_usize] } == 7) && ({ (*v.borrow())[2_usize] } == 4)); let __rhs = { (*v.borrow())[1_usize] }; (*v.borrow_mut())[0_usize] = __rhs; assert!(({ (*v.borrow())[0_usize] } == 7)); - (*v.borrow_mut())[1_usize] = 0; + (*v.borrow_mut())[1_usize] = (0 as i32); assert!( ((elem!( v.as_pointer().decay(), @@ -64,7 +64,7 @@ fn main_0() -> i32 { == 7) ); let mut i: i32 = 0; - elem!(v.as_pointer().decay(), (i.postfix_inc() as usize)).write(3); + elem!(v.as_pointer().decay(), (i.postfix_inc() as usize)).write((3 as i32)); assert!((i == 1) && ({ (*v.borrow())[0_usize] } == 3)); assert!( ((elem!( @@ -78,9 +78,9 @@ fn main_0() -> i32 { v.as_pointer().decay(), (({ push_and_index_0(v.as_pointer(),) }) as usize) ) - .write(5); + .write((5 as i32)); assert!(((*v.borrow()).len() == 5_usize) && ({ (*v.borrow())[4_usize] } == 5)); - let mut p: Ptr = (v.as_pointer().decay().offset(2_usize)); + let mut p: Ptr = (v.as_pointer().decay().offset(2_usize)).reinterpret_cast::(); p.write(9); assert!(({ (*v.borrow())[2_usize] } == 9)); assert!((({ sum_ref_1(v.as_pointer(),) }) == ((((3 + 0) + 9) + 42) + 5))); @@ -91,7 +91,7 @@ fn main_0() -> i32 { .values .resize_with(__a0, || ::default()) }; - vec_elem!(h.as_pointer(), values, 1_usize).write(6); + vec_elem!(h.as_pointer(), values, 1_usize).write((6 as i32)); { let __a1 = Point { x: 1, y: 2 }; (*h.borrow_mut()).points.push(__a1) @@ -109,9 +109,9 @@ fn main_0() -> i32 { }) == 6) ); let mut hp: Ptr = (h.as_pointer()); - let __rhs = ((vec_elem!(hp, values, 1_usize).read()) + 1); + let __rhs = ((((vec_elem!(hp, values, 1_usize).read()) as i32) + 1) as i32); vec_elem!(hp, values, 0_usize).write(__rhs); - let __rhs = (vec_elem!(hp, values, 0_usize).read()); + let __rhs = ((vec_elem!(hp, values, 0_usize).read()) as i32); field!(vec_elem!(hp, points, 0_usize), x).write(__rhs); assert!( ((vec_elem!(h.as_pointer(), values, 0_usize).read()) == 7) @@ -129,21 +129,21 @@ fn main_0() -> i32 { let __a1 = vec![0; 3_usize as usize]; (*grid.borrow_mut()).push(__a1) }; - index!(elem!(grid.as_pointer().decay(), 1_usize), 2_usize).write(8); + elem!(grid.as_pointer().decay().offset(1_usize), 2_usize).write((8 as i32)); assert!( - ((index!(elem!(grid.as_pointer().decay(), 1_usize), 2_usize).read()) == 8) - && ((index!(elem!(grid.as_pointer().decay(), 0_usize), 2_usize).read()) == 0) + ((elem!(grid.as_pointer().decay().offset(1_usize), 2_usize).read()) == 8) + && ((elem!(grid.as_pointer().decay().offset(0_usize), 2_usize).read()) == 0) ); - let __rhs = (index!(elem!(grid.as_pointer().decay(), 1_usize), 2_usize).read()); - index!(elem!(grid.as_pointer().decay(), 0_usize), 1_usize).write(__rhs); - let __rhs = (index!(elem!(grid.as_pointer().decay(), 0_usize), 1_usize).read()); + let __rhs = (elem!(grid.as_pointer().decay().offset(1_usize), 2_usize).read()); + elem!(grid.as_pointer().decay().offset(0_usize), 1_usize).write(__rhs); + let __rhs = (elem!(grid.as_pointer().decay().offset(0_usize), 1_usize).read()); { - index!(elem!(grid.as_pointer().decay(), 1_usize), 0_usize) + elem!(grid.as_pointer().decay().offset(1_usize), 0_usize) .with_mut(|__v| *__v = *__v + __rhs) }; assert!( - ((index!(elem!(grid.as_pointer().decay(), 0_usize), 1_usize).read()) == 8) - && ((index!(elem!(grid.as_pointer().decay(), 1_usize), 0_usize).read()) == 8) + ((elem!(grid.as_pointer().decay().offset(0_usize), 1_usize).read()) == 8) + && ((elem!(grid.as_pointer().decay().offset(1_usize), 0_usize).read()) == 8) ); let a: Value> = Rc::new(RefCell::new(Vec::from([4, 5, 6]))); let __rhs = ({ (*a.borrow())[0_usize] } + { (*a.borrow())[2_usize] }); diff --git a/tests/unit/out/refcount/vector_with_allocator.rs b/tests/unit/out/refcount/vector_with_allocator.rs index 9ca0b0f17..a423f8cda 100644 --- a/tests/unit/out/refcount/vector_with_allocator.rs +++ b/tests/unit/out/refcount/vector_with_allocator.rs @@ -34,8 +34,8 @@ pub fn fn_1(v: Ptr>, v3: Vec) { let __a1 = 3; v2.push(__a1) }; - x = (index!(v, 2_usize).read()); - v2[0_usize] = 1; + x = ((index!(v, 2_usize).read()) as i32); + v2[0_usize] = (1 as i32); elem!( (if true { (Ptr::>::decay(&(v3.as_pointer()))) @@ -44,8 +44,8 @@ pub fn fn_1(v: Ptr>, v3: Vec) { }), 0_usize ) - .write(7); - index!(v4, 1_usize).write(13); + .write((7 as i32)); + index!(v4, 1_usize).write((13 as i32)); assert!((x == 6)); assert!(((v.decay().read()) == 4)); assert!(((index!(v, 1_usize).read()) == 5)); @@ -80,8 +80,8 @@ fn main_0() -> i32 { }; assert!((v1.len() == 100_usize)); assert!((v1[99_usize] == 0)); - v1[0_usize] = 40; - v1[99_usize] = 50; + v1[0_usize] = (40 as i32); + v1[99_usize] = (50 as i32); assert!((v1[0_usize] == 40)); assert!((v1[99_usize] == 50)); let v2: Value> = Rc::new(RefCell::new(Vec::new())); @@ -176,7 +176,7 @@ fn main_0() -> i32 { assert!(((v2.as_pointer().decay().to_last().read()) == 3)); assert!(((v3.as_pointer().decay().to_last().read()) == 1)); assert!(((v6.as_pointer().decay().to_last().read()) == 2_f64)); - let ref0: Ptr = v6.as_pointer().decay().to_last(); + let ref0: Ptr = (v6.as_pointer().decay().to_last()).reinterpret_cast::(); ref0.write(5_f64); assert!(((v6.as_pointer().decay().to_last().read()) == 5_f64)); let mut x0: f64 = (v6.as_pointer().decay().to_last().read()); @@ -198,10 +198,11 @@ fn main_0() -> i32 { .read()) == 5_f64) ); - let ref1: Ptr = v6 + let ref1: Ptr = (v6 .as_pointer() .decay() - .offset((s2).wrapping_sub(1_usize) as isize); + .offset((s2).wrapping_sub(1_usize) as isize)) + .reinterpret_cast::(); { ref1.with_mut(|__v| *__v = *__v + 1.5_f64) }; diff --git a/tests/unit/out/unsafe/class_templates.rs b/tests/unit/out/unsafe/class_templates.rs index 070681fcf..0de6550ba 100644 --- a/tests/unit/out/unsafe/class_templates.rs +++ b/tests/unit/out/unsafe/class_templates.rs @@ -19,7 +19,7 @@ impl MyContainer_int_ { return self.vec_.len(); } pub unsafe fn back_4(&mut self) -> *mut i32 { - return ((self.vec_).last_mut().unwrap()); + return (((self.vec_).last_mut().unwrap()) as *mut i32).cast::(); } pub unsafe fn pop_back(&mut self) { self.vec_.pop(); @@ -45,7 +45,7 @@ impl MyContainer_char_ { return self.vec_.len(); } pub unsafe fn back_4(&mut self) -> *mut libc::c_char { - return ((self.vec_).last_mut().unwrap()); + return (((self.vec_).last_mut().unwrap()) as *mut libc::c_char).cast::(); } pub unsafe fn pop_back(&mut self) { self.vec_.pop(); @@ -71,7 +71,7 @@ impl MyContainer_float_ { return self.vec_.len(); } pub unsafe fn back_4(&mut self) -> *mut f32 { - return ((self.vec_).last_mut().unwrap()); + return (((self.vec_).last_mut().unwrap()) as *mut f32).cast::(); } pub unsafe fn pop_back(&mut self) { self.vec_.pop(); diff --git a/tests/unit/out/unsafe/clone_vs_move.rs b/tests/unit/out/unsafe/clone_vs_move.rs index b962a6cfe..b66671c6e 100644 --- a/tests/unit/out/unsafe/clone_vs_move.rs +++ b/tests/unit/out/unsafe/clone_vs_move.rs @@ -219,9 +219,9 @@ unsafe fn main_0() -> i32 { .chain(std::iter::once(0)) .collect(); let mut s2: Vec = s1.clone(); - s2[(0_usize)] = ('b' as libc::c_char); - s2[(1_usize)] = ('b' as libc::c_char); - s2[(2_usize)] = ('b' as libc::c_char); + s2[(0_usize)] = (('b' as libc::c_char) as libc::c_char); + s2[(1_usize)] = (('b' as libc::c_char) as libc::c_char); + s2[(2_usize)] = (('b' as libc::c_char) as libc::c_char); assert!(((s2[(0_usize)] as i32) == (('b' as libc::c_char) as i32))); assert!(((s2[(1_usize)] as i32) == (('b' as libc::c_char) as i32))); assert!(((s2[(2_usize)] as i32) == (('b' as libc::c_char) as i32))); diff --git a/tests/unit/out/unsafe/compound_assign_ref.rs b/tests/unit/out/unsafe/compound_assign_ref.rs index 10ef93fbf..1d28aeb93 100644 --- a/tests/unit/out/unsafe/compound_assign_ref.rs +++ b/tests/unit/out/unsafe/compound_assign_ref.rs @@ -18,7 +18,7 @@ unsafe fn main_0() -> i32 { let __a1 = 10; v.push(__a1) }; - (*((v).first_mut().unwrap())) += 5; + (*((v).first_mut().unwrap())) += (5 as i32); assert!(((*((v).first_mut().unwrap())) == (15))); return 0; } diff --git a/tests/unit/out/unsafe/copy_ctor.rs b/tests/unit/out/unsafe/copy_ctor.rs index d25d2dd8f..7693dceb8 100644 --- a/tests/unit/out/unsafe/copy_ctor.rs +++ b/tests/unit/out/unsafe/copy_ctor.rs @@ -95,7 +95,7 @@ pub struct Box_int_ { } impl Box_int_ { pub unsafe fn new(mut v: i32) -> Self { - let mut this = Self { val: v }; + let mut this = Self { val: (v as i32) }; this } pub unsafe fn copy_from(o: *const Box_int_) -> Self { diff --git a/tests/unit/out/unsafe/implicit_autoref.rs b/tests/unit/out/unsafe/implicit_autoref.rs index c22119465..1cbd318fb 100644 --- a/tests/unit/out/unsafe/implicit_autoref.rs +++ b/tests/unit/out/unsafe/implicit_autoref.rs @@ -31,8 +31,8 @@ unsafe fn main_0() -> i32 { v.push(__a1) }; let mut p: *mut Vec = (&mut v as *mut Vec); - let mut a: i32 = (&mut (*p))[(0_usize)]; - (&mut (*p))[(1_usize)] = 30; + let mut a: i32 = ((&mut (*p))[(0_usize)] as i32); + (&mut (*p))[(1_usize)] = (30 as i32); let mut h: Holder = ::default(); { let __a1 = 40; @@ -43,13 +43,17 @@ unsafe fn main_0() -> i32 { h.v.push(__a1) }; let mut hp: *mut Holder = (&mut h as *mut Holder); - let mut b: i32 = (&mut (*hp)).v[(0_usize)]; - (&mut (*hp)).v[(1_usize)] = 60; + let mut b: i32 = ((&mut (*hp)).v[(0_usize)] as i32); + (&mut (*hp)).v[(1_usize)] = (60 as i32); assert!(((a) == (10))); assert!((((&mut (*p))[(1_usize)]) == (30))); assert!(((b) == (40))); assert!((((&mut (*hp)).v[(1_usize)]) == (60))); - (unsafe { write_through_0((&mut (&mut (*p))[0_usize as usize] as *mut i32)) }); + (unsafe { + write_through_0( + ((&mut (&mut (*p))[0_usize as usize] as *mut i32) as *mut i32).cast::(), + ) + }); assert!((((&mut (*p))[(0_usize)]) == (42))); return 0; } diff --git a/tests/unit/out/unsafe/inline_container_fields.rs b/tests/unit/out/unsafe/inline_container_fields.rs index 3a57f69b3..ae48a61ef 100644 --- a/tests/unit/out/unsafe/inline_container_fields.rs +++ b/tests/unit/out/unsafe/inline_container_fields.rs @@ -92,7 +92,8 @@ unsafe fn main_0() -> i32 { assert!(((s.arr[(1_usize)]) == (7))); let mut e: *mut Elem = (&mut s.elems[(2_usize)] as *mut Elem); let mut h: *mut i32 = (*e).hist.as_mut_ptr(); - let mut c: *mut i16 = (&mut (&mut (*e)).coeffs[(1_usize)] as *mut i16); + let mut c: *mut i16 = + ((&mut (&mut (*e)).coeffs[(1_usize)] as *mut i16) as *mut i16).cast::(); let mut id: *mut i32 = (&mut s.elems[(1_usize)].id as *mut i32); let mut k: i32 = 0; 'loop_: while ((k) < (4)) { @@ -111,13 +112,14 @@ unsafe fn main_0() -> i32 { && ((h.offset((3) as isize)) == (&mut s.elems[(2_usize)].hist[(3) as usize] as *mut i32)) ); - let mut row: *mut i32 = (&mut s.rows[(0_usize)][(0_usize)] as *mut i32); + let mut row: *mut i32 = + ((&mut s.rows[(0_usize)][(0_usize)] as *mut i32) as *mut i32).cast::(); (*row.offset((2) as isize)) = 9; assert!(((s.rows[(0_usize)][(2_usize)]) == (9))); let mut t: State = s.clone(); t.elems[(2_usize)].hist[(0) as usize] = 100; t.grid[(0) as usize][(0) as usize] = 100; - t.rows[(0_usize)][(0_usize)] = 100; + t.rows[(0_usize)][(0_usize)] = (100 as i32); assert!( (((s.elems[(2_usize)].hist[(0) as usize]) == (0)) && ((s.grid[(0) as usize][(0) as usize]) == (0))) diff --git a/tests/unit/out/unsafe/map.rs b/tests/unit/out/unsafe/map.rs index 58d16941c..3cc619f71 100644 --- a/tests/unit/out/unsafe/map.rs +++ b/tests/unit/out/unsafe/map.rs @@ -183,7 +183,7 @@ unsafe fn main_0() -> i32 { } let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < (indexes.len())) { - (*&mut (*m2.get_or_insert_with(indexes[(i as usize)].clone(), || { + (*&mut (*m2.get_or_insert_with((indexes[(i as usize)] as i32).clone(), || { (indexes[(i as usize)], ::default()) })) .1) = ((i).wrapping_rem(2_u32) != 0); diff --git a/tests/unit/out/unsafe/ret_rvalue_ref.rs b/tests/unit/out/unsafe/ret_rvalue_ref.rs index 23d35d1a3..be52d4d9a 100644 --- a/tests/unit/out/unsafe/ret_rvalue_ref.rs +++ b/tests/unit/out/unsafe/ret_rvalue_ref.rs @@ -19,7 +19,7 @@ unsafe fn main_0() -> i32 { let mut __tmp_0: i32 = 5; let i2: *mut i32 = &mut __tmp_0; assert!(((*i2) == (5))); - let mut i3: i32 = (unsafe { foo_0(i2) }); + let mut i3: i32 = (unsafe { foo_0((i2 as *mut i32).cast::()) }); assert!(((i3) == (5))); assert!( ((unsafe { diff --git a/tests/unit/out/unsafe/rvalue_ref_general.rs b/tests/unit/out/unsafe/rvalue_ref_general.rs index 29b9610e8..137488980 100644 --- a/tests/unit/out/unsafe/rvalue_ref_general.rs +++ b/tests/unit/out/unsafe/rvalue_ref_general.rs @@ -14,7 +14,7 @@ pub fn main() { } unsafe fn main_0() -> i32 { let mut i1: i32 = 3; - let mut i2: i32 = i1; + let mut i2: i32 = (i1 as i32); assert!(((i1) == (3))); assert!(((i2) == (3))); let mut __tmp_0: i32 = 40; @@ -31,7 +31,7 @@ unsafe fn main_0() -> i32 { assert!(((*i6) == (*i3))); assert!(((*i7) == (*i4))); let mut i8: i32 = 3; - let i9: *mut i32 = &mut i8; + let i9: *mut i32 = &mut *(&raw mut i8).cast::(); assert!(((*i9) == (3))); let mut p1: *mut i32 = (&mut i1 as *mut i32); let mut p2: *mut i32 = (i3); diff --git a/tests/unit/out/unsafe/split_binop_aliased_borrows.rs b/tests/unit/out/unsafe/split_binop_aliased_borrows.rs index e296ab901..8ad55ccfb 100644 --- a/tests/unit/out/unsafe/split_binop_aliased_borrows.rs +++ b/tests/unit/out/unsafe/split_binop_aliased_borrows.rs @@ -16,7 +16,7 @@ unsafe fn main_0() -> i32 { let mut v: Vec = Vec::from([1, 2]); let mut p: UnsafeRandomAccessIterator = v.begin(); let r: *const i32 = &v[(1_usize)]; - (*p.iter_deref()) = (*r); + (*p.iter_deref()) = ((*r) as i32); assert!(((v[(0_usize)]) == (2))); return 0; } diff --git a/tests/unit/out/unsafe/string.rs b/tests/unit/out/unsafe/string.rs index 1331fc424..4b702b0c7 100644 --- a/tests/unit/out/unsafe/string.rs +++ b/tests/unit/out/unsafe/string.rs @@ -69,8 +69,8 @@ unsafe fn main_0() -> i32 { } assert!(((s2.len() - 1) == (10_usize))); assert!(((s2.len() - 1) == (s2.len() - 1))); - s2[(0_usize)] = ('b' as libc::c_char); - s2[(1_usize)] = ('c' as libc::c_char); + s2[(0_usize)] = (('b' as libc::c_char) as libc::c_char); + s2[(1_usize)] = (('c' as libc::c_char) as libc::c_char); assert!(((s2[(0_usize)] as i32) == (('b' as libc::c_char) as i32))); assert!(((s2[(1_usize)] as i32) == (('c' as libc::c_char) as i32))); let mut i: u32 = 2_u32; @@ -196,8 +196,8 @@ unsafe fn main_0() -> i32 { assert!(((string[(2_usize)] as i32) == (('r' as libc::c_char) as i32))); assert!(((string[(3_usize)] as i32) == (0))); assert!(((string[(4_usize)] as i32) == (0))); - string[(3_usize)] = ('a' as libc::c_char); - string[(4_usize)] = ('b' as libc::c_char); + string[(3_usize)] = (('a' as libc::c_char) as libc::c_char); + string[(4_usize)] = (('b' as libc::c_char) as libc::c_char); assert!(((string[(3_usize)] as i32) == (('a' as libc::c_char) as i32))); assert!(((string[(4_usize)] as i32) == (('b' as libc::c_char) as i32))); string[(3_usize)] = (0 as libc::c_char); @@ -272,7 +272,7 @@ unsafe fn main_0() -> i32 { assert!(((substr_2[(5_usize)] as i32) == (('f' as libc::c_char) as i32))); assert!(((substr_2[(6_usize)] as i32) == (('o' as libc::c_char) as i32))); assert!(((substr_2[(7_usize)] as i32) == (('o' as libc::c_char) as i32))); - let mut pos: u64 = (match result.iter().rposition(|&c| { + let mut pos: usize = match result.iter().rposition(|&c| { ::std::ffi::CStr::from_ptr(c"b".as_ptr()) .to_str() .unwrap() @@ -280,9 +280,9 @@ unsafe fn main_0() -> i32 { }) { Some(idx) => idx, None => usize::MAX, - } as u64); - assert!(((pos) == (0_u64))); - pos = (match result.iter().rposition(|&c| { + }; + assert!(((pos) == (0_usize))); + pos = match result.iter().rposition(|&c| { ::std::ffi::CStr::from_ptr(c"f".as_ptr()) .to_str() .unwrap() @@ -290,9 +290,9 @@ unsafe fn main_0() -> i32 { }) { Some(idx) => idx, None => usize::MAX, - } as u64); - assert!(((pos) == (5_u64))); - pos = (match result.iter().rposition(|&c| { + }; + assert!(((pos) == (5_usize))); + pos = match result.iter().rposition(|&c| { ::std::ffi::CStr::from_ptr(c"o".as_ptr()) .to_str() .unwrap() @@ -300,9 +300,9 @@ unsafe fn main_0() -> i32 { }) { Some(idx) => idx, None => usize::MAX, - } as u64); - assert!(((pos) == (7_u64))); - pos = (match result.iter().rposition(|&c| { + }; + assert!(((pos) == (7_usize))); + pos = match result.iter().rposition(|&c| { ::std::ffi::CStr::from_ptr(c"x".as_ptr()) .to_str() .unwrap() @@ -310,8 +310,8 @@ unsafe fn main_0() -> i32 { }) { Some(idx) => idx, None => usize::MAX, - } as u64); - assert!(((pos) == (-1_i64 as u64))); + }; + assert!(((pos) == ((-1_i64 as u64) as usize))); let mut string_to_cast: Vec = { let s = c"cast".as_ptr(); std::slice::from_raw_parts(s, (0..).take_while(|&i| *s.add(i) != 0).count() + 1).to_vec() @@ -322,12 +322,12 @@ unsafe fn main_0() -> i32 { assert!((((*output_data.offset((1) as isize)) as i32) == (('a' as libc::c_char) as i32))); assert!((((*output_data.offset((2) as isize)) as i32) == (('s' as libc::c_char) as i32))); assert!((((*output_data.offset((3) as isize)) as i32) == (('t' as libc::c_char) as i32))); - let mut t0: u64 = ((s1.len() - 1) as u64); - let mut t1: u64 = (t0).wrapping_add(((*p1) as u64)); - let mut t2: u64 = ((t1 as usize).wrapping_add((s2.len() - 1)) as u64); - let mut t3: u64 = ((t2 as usize).wrapping_add((s3.len() - 1)) as u64); - let mut t4: u64 = ((t3 as usize).wrapping_add((s4.len() - 1)) as u64); - assert!((((t4 as usize).wrapping_add((s5.len() - 1))) == (139_usize))); + let mut t0: usize = (s1.len() - 1); + let mut t1: usize = (t0).wrapping_add(((*p1) as usize)); + let mut t2: usize = (t1).wrapping_add((s2.len() - 1)); + let mut t3: usize = (t2).wrapping_add((s3.len() - 1)); + let mut t4: usize = (t3).wrapping_add((s4.len() - 1)); + assert!((((t4).wrapping_add((s5.len() - 1))) == (139_usize))); return 0; } pub unsafe fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/unsafe/string2.rs b/tests/unit/out/unsafe/string2.rs index 1bba415ce..7e61c0729 100644 --- a/tests/unit/out/unsafe/string2.rs +++ b/tests/unit/out/unsafe/string2.rs @@ -17,7 +17,7 @@ unsafe fn main_0() -> i32 { let s = c"foo".as_ptr(); std::slice::from_raw_parts(s, (0..).take_while(|&i| *s.add(i) != 0).count() + 1).to_vec() }; - arr[(1_usize)] = ('b' as libc::c_char); + arr[(1_usize)] = (('b' as libc::c_char) as libc::c_char); let mut p: *const libc::c_char = arr.as_ptr().offset((1) as isize); assert!((((*p) as i32) == (('b' as libc::c_char) as i32))); assert!( diff --git a/tests/unit/out/unsafe/unboxed_conditional_iterator.rs b/tests/unit/out/unsafe/unboxed_conditional_iterator.rs index 605aa1c22..2107af1c6 100644 --- a/tests/unit/out/unsafe/unboxed_conditional_iterator.rs +++ b/tests/unit/out/unsafe/unboxed_conditional_iterator.rs @@ -38,7 +38,7 @@ pub unsafe fn lehmer_2(mut sigma: *const u32, mut len: u32, mut code: *mut u32) .collect::>(); let mut i: u32 = 0_u32; 'loop_: while ((i) < (len)) { - items[(i as usize)] = i; + items[(i as usize)] = (i as u32); i.prefix_inc(); } let mut i: u32 = 0_u32; diff --git a/tests/unit/out/unsafe/unboxed_locals.rs b/tests/unit/out/unsafe/unboxed_locals.rs index 66905320f..d9e982833 100644 --- a/tests/unit/out/unsafe/unboxed_locals.rs +++ b/tests/unit/out/unsafe/unboxed_locals.rs @@ -140,7 +140,7 @@ unsafe fn main_0() -> i32 { let a0_clone = four.clone(); vec_.push(a0_clone) }; - vec_[(0_usize)] = ((vec_[(3_usize)]) + (1)); + vec_[(0_usize)] = (((vec_[(3_usize)] as i32) + (1)) as i32); vec_[(1_usize)].postfix_inc(); assert!( (((vec_.len()) == (4_usize)) && ((vec_[(0_usize)]) == (5))) && ((vec_[(1_usize)]) == (2)) @@ -158,7 +158,12 @@ unsafe fn main_0() -> i32 { let mut by_ref: Vec = vec![3; 2_usize as usize]; assert!(((unsafe { total_2(&by_ref,) }) == (6))); let mut elem_ptr: Vec = vec![0; 2_usize as usize]; - (unsafe { set_0((&mut elem_ptr[(1_usize)] as *mut i32), 7) }); + (unsafe { + set_0( + ((&mut elem_ptr[(1_usize)] as *mut i32) as *mut i32).cast::(), + 7, + ) + }); assert!(((elem_ptr[(1_usize)]) == (7))); let mut data: Vec = vec![0; 2_usize as usize]; (unsafe { set_0(data.as_mut_ptr(), 8) }); diff --git a/tests/unit/out/unsafe/unique_ptr.rs b/tests/unit/out/unsafe/unique_ptr.rs index 853490b81..8c8c3b0bc 100644 --- a/tests/unit/out/unsafe/unique_ptr.rs +++ b/tests/unit/out/unsafe/unique_ptr.rs @@ -120,7 +120,7 @@ pub unsafe fn DoStuffWithSafePointer_0(safe_ptr: *mut Option>) .y)); } pub unsafe fn Consume_1(mut safe_ptr: Option>) -> i32 { - let mut x: Option> = safe_ptr.take(); + let mut x: std_unique_ptr_SafePointer__std_default_delete_SafePointer__ = safe_ptr.take(); let mut p: Option> = Some(Box::from_raw( (Box::leak(Box::new(::default())) as *mut Pair), )); diff --git a/tests/unit/out/unsafe/vector.rs b/tests/unit/out/unsafe/vector.rs index fea2a3e37..56d87ac8b 100644 --- a/tests/unit/out/unsafe/vector.rs +++ b/tests/unit/out/unsafe/vector.rs @@ -29,15 +29,15 @@ unsafe fn main_0() -> i32 { assert!(!(v1.is_empty())); v1.pop(); assert!(v1.is_empty()); - let mut s1: u64 = (v1.len() as u64); + let mut s1: usize = v1.len(); { let __a0 = 100_usize as usize; v1.resize_with(__a0, || ::default()) }; assert!(((v1.len()) == (100_usize))); assert!(((v1[(99_usize)]) == (0))); - v1[(0_usize)] = 40; - v1[(99_usize)] = 50; + v1[(0_usize)] = (40 as i32); + v1[(99_usize)] = (50 as i32); assert!(((v1[(0_usize)]) == (40))); assert!(((v1[(99_usize)]) == (50))); let mut v2: Vec = Vec::new(); @@ -162,7 +162,7 @@ unsafe fn main_0() -> i32 { assert!(((v2[(0_usize)]) == (100))); assert!(((v2[(1_usize)]) == (2))); assert!(((v2[(2_usize)]) == (3))); - let mut s2: u64 = (v2.len() as u64); + let mut s2: usize = v2.len(); let mut v3: Vec = vec![1; 100_usize as usize]; assert!(((v3.len()) == (100_usize))); let mut i: i32 = 0; @@ -188,10 +188,10 @@ unsafe fn main_0() -> i32 { assert!((v5[(i as usize)]).is_null()); i.prefix_inc(); } - let mut v6: Vec = vec![2_f64; (s2 as usize) as usize]; - assert!(((v6.len()) == (s2 as usize))); + let mut v6: Vec = vec![2_f64; s2 as usize]; + assert!(((v6.len()) == (s2))); let mut i: u32 = 0_u32; - 'loop_: while ((i as u64) < (s2)) { + 'loop_: while ((i as usize) < (s2)) { assert!(((v6[(i as usize)]) == (2_f64))); i.prefix_inc(); } @@ -249,7 +249,7 @@ unsafe fn main_0() -> i32 { assert!((*((v4).last_mut().unwrap())).is_null()); assert!((*((v5).last_mut().unwrap())).is_null()); assert!(((*((v6).last_mut().unwrap())) == (2_f64))); - let ref0: *mut f64 = ((v6).last_mut().unwrap()); + let ref0: *mut f64 = (((v6).last_mut().unwrap()) as *mut f64).cast::(); (*ref0) = 5_f64; assert!(((*((v6).last_mut().unwrap())) == (5_f64))); let mut x0: f64 = (*((v6).last_mut().unwrap())); @@ -258,18 +258,19 @@ unsafe fn main_0() -> i32 { assert!(((*((v6).last_mut().unwrap())) == (5_f64))); let mut idx: i32 = 0; assert!(((*(&mut (v6)[(idx as usize) as usize] as *mut f64)) == (2_f64))); - assert!(((*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)) == (5_f64))); - let ref1: *mut f64 = (&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64); + assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (5_f64))); + let ref1: *mut f64 = + ((&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64) as *mut f64).cast::(); (*ref1) += 1.5_f64; - assert!(((*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)) == (6.5_f64))); - let mut x1: f64 = (*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)); + assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (6.5_f64))); + let mut x1: f64 = (*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)); assert!(((x1) == (6.5_f64))); x1 -= 1.5_f64; - assert!(((*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)) == (6.5_f64))); + assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (6.5_f64))); assert!( ((((s1).wrapping_add(s2)) - .wrapping_add(((*(&mut (v2)[0_usize as usize] as *mut i32)) as u64))) - == (103_u64)) + .wrapping_add(((*(&mut (v2)[0_usize as usize] as *mut i32)) as usize))) + == (103_usize)) ); let mut a: S = S { x: 1 }; let mut pa: *mut S = (&mut a as *mut S); diff --git a/tests/unit/out/unsafe/vector2.rs b/tests/unit/out/unsafe/vector2.rs index 7155d4f41..24337d26e 100644 --- a/tests/unit/out/unsafe/vector2.rs +++ b/tests/unit/out/unsafe/vector2.rs @@ -26,15 +26,15 @@ pub unsafe fn fn_0(v: *mut Vec, mut v3: Vec) { let __a1 = 3; v2.push(__a1) }; - x = (&mut (*v))[(2_usize)]; - v2[(0_usize)] = 1; + x = ((&mut (*v))[(2_usize)] as i32); + v2[(0_usize)] = (1 as i32); (&mut (*if true { (&mut v3 as *mut Vec) } else { (v) - }))[(0_usize)] = 7; + }))[(0_usize)] = (7 as i32); v2 = (*v).clone(); - (&mut (*v4))[(1_usize)] = 13; + (&mut (*v4))[(1_usize)] = (13 as i32); assert!(((x) == (6))); assert!(((*((*v).first_mut().unwrap())) == (4))); assert!((((&mut (*v))[(1_usize)]) == (5))); diff --git a/tests/unit/out/unsafe/vector3.rs b/tests/unit/out/unsafe/vector3.rs index 4b5876414..444d5f991 100644 --- a/tests/unit/out/unsafe/vector3.rs +++ b/tests/unit/out/unsafe/vector3.rs @@ -26,9 +26,9 @@ unsafe fn main_0() -> i32 { let __a0 = 1_usize as usize; v[(1_usize)].resize_with(__a0, || ::default()) }; - v[(0_usize)][(0_usize)] = 1; - v[(0_usize)][(1_usize)] = 5; - v[(1_usize)][(0_usize)] = 6; + v[(0_usize)][(0_usize)] = (1 as i32); + v[(0_usize)][(1_usize)] = (5 as i32); + v[(1_usize)][(0_usize)] = (6 as i32); 'loop_: for v2 in IterRange::new(v.begin(), v.end()) { let v2: *mut Vec = &mut (*v2.iter_deref()); 'loop_: for i in IterRange::new((*v2).begin(), (*v2).end()) { diff --git a/tests/unit/out/unsafe/vector_addr_of_back.rs b/tests/unit/out/unsafe/vector_addr_of_back.rs index 0f8f2bab4..53d4d22b4 100644 --- a/tests/unit/out/unsafe/vector_addr_of_back.rs +++ b/tests/unit/out/unsafe/vector_addr_of_back.rs @@ -19,7 +19,7 @@ unsafe fn main_0() -> i32 { let a0_clone = inner.clone(); outer.push(a0_clone) }; - let mut sink: *mut Vec = ((outer).last_mut().unwrap()); + let mut sink: *mut std_vector_int__std_allocator_int__ = ((outer).last_mut().unwrap()); assert!((((*(sink).cast_const()).len()) == (0_usize))); let mut p: *mut Vec> = (&mut outer as *mut Vec>); sink = ((*p).last_mut().unwrap()); diff --git a/tests/unit/out/unsafe/vector_deque_vector_string.rs b/tests/unit/out/unsafe/vector_deque_vector_string.rs index 50428bec7..66ede66e6 100644 --- a/tests/unit/out/unsafe/vector_deque_vector_string.rs +++ b/tests/unit/out/unsafe/vector_deque_vector_string.rs @@ -93,7 +93,7 @@ unsafe fn main_0() -> i32 { } else { (&mut (*((v[(0_usize)]).first_mut().unwrap()))[(1_usize)][0_usize as usize] as *mut libc::c_char) - }) = ('B' as libc::c_char); + }) = (('B' as libc::c_char) as libc::c_char); assert!( ((*((v[(0_usize)]).first_mut().unwrap()))[(0_usize)] == { let s = c"a".as_ptr(); diff --git a/tests/unit/out/unsafe/vector_subscript_borrow.rs b/tests/unit/out/unsafe/vector_subscript_borrow.rs index c5c8f2625..05b7f9864 100644 --- a/tests/unit/out/unsafe/vector_subscript_borrow.rs +++ b/tests/unit/out/unsafe/vector_subscript_borrow.rs @@ -8,7 +8,7 @@ use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; pub static mut next_0: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); pub unsafe fn bump_1(mut v: *mut Vec, mut x: i32) -> i32 { - (&mut (*v))[(0_usize)] += x; + (&mut (*v))[(0_usize)] += (x as i32); return (*std::cell::LazyCell::force_mut(&mut *&raw mut next_0)).postfix_inc(); } pub fn main() { @@ -24,7 +24,7 @@ unsafe fn main_0() -> i32 { .collect::>(); let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < (items.len())) { - items[(i as usize)] = (i).wrapping_mul(2_u32); + items[(i as usize)] = ((i).wrapping_mul(2_u32) as u32); i.prefix_inc(); } items[(1_usize)] = (items[(1_usize)]).wrapping_add(5_u32); @@ -36,24 +36,24 @@ unsafe fn main_0() -> i32 { (*{ let __idx = (v[(0_usize)] as usize); &mut v[__idx] - }) = 3; + }) = (3 as i32); (*{ let __idx = (v[(1_usize)] as usize); &mut v[__idx] - }) = ((v[(1_usize)]) + (4)); + }) = (((v[(1_usize)] as i32) + (4)) as i32); assert!(((v[(1_usize)]) == (3)) && ((v[(3_usize)]) == (7))); - let mut p: *mut i32 = (&mut v[(0_usize)] as *mut i32); - v[((*p) as usize)] = 9; + let mut p: *mut i32 = ((&mut v[(0_usize)] as *mut i32) as *mut i32).cast::(); + v[((*p) as usize)] = (9 as i32); assert!(((v[(1_usize)]) == (9))); (*{ let __idx = ((unsafe { bump_1((&mut v as *mut Vec), 10) }) as usize); &mut v[__idx] - }) = 2; + }) = (2 as i32); assert!(((v[(0_usize)]) == (2))); assert!( ((unsafe { let _v: *mut Vec = (&mut v as *mut Vec); - let _x: i32 = v[(2_usize)]; + let _x: i32 = (v[(2_usize)] as i32); bump_1(_v, _x) }) == (1)) && ((v[(0_usize)]) == (3)) diff --git a/tests/unit/out/unsafe/vector_subscript_direct.rs b/tests/unit/out/unsafe/vector_subscript_direct.rs index b3096e75f..0fb65201b 100644 --- a/tests/unit/out/unsafe/vector_subscript_direct.rs +++ b/tests/unit/out/unsafe/vector_subscript_direct.rs @@ -34,7 +34,7 @@ pub unsafe fn sum_ref_1(v: *const Vec) -> i32 { let mut s: i32 = 0; let mut i: usize = 0_usize; 'loop_: while ((i) < ((*v).len())) { - s += (&(*v))[(i)]; + s += ((&(*v))[(i)] as i32); i.prefix_inc(); } return s; @@ -47,14 +47,14 @@ pub fn main() { } unsafe fn main_0() -> i32 { let mut v: Vec = Vec::from([1, 2, 3]); - v[(0_usize)] = 10; + v[(0_usize)] = (10 as i32); assert!(((v[(0_usize)]) == (10))); - v[(1_usize)] += 5; + v[(1_usize)] += (5 as i32); v[(2_usize)].postfix_inc(); assert!(((v[(1_usize)]) == (7)) && ((v[(2_usize)]) == (4))); v[(0_usize)] = v[(1_usize)]; assert!(((v[(0_usize)]) == (7))); - v[(1_usize)] = 0; + v[(1_usize)] = (0 as i32); assert!( ((*{ let __idx = (v[(1_usize)] as usize); @@ -62,7 +62,7 @@ unsafe fn main_0() -> i32 { }) == (7)) ); let mut i: i32 = 0; - v[(i.postfix_inc() as usize)] = 3; + v[(i.postfix_inc() as usize)] = (3 as i32); assert!(((i) == (1)) && ((v[(0_usize)]) == (3))); assert!( ((*{ @@ -73,9 +73,9 @@ unsafe fn main_0() -> i32 { (*{ let __idx = ((unsafe { push_and_index_0(&mut v) }) as usize); &mut v[__idx] - }) = 5; + }) = (5 as i32); assert!(((v.len()) == (5_usize)) && ((v[(4_usize)]) == (5))); - let mut p: *mut i32 = (&mut v[(2_usize)] as *mut i32); + let mut p: *mut i32 = ((&mut v[(2_usize)] as *mut i32) as *mut i32).cast::(); (*p) = 9; assert!(((v[(2_usize)]) == (9))); assert!(((unsafe { sum_ref_1(&v,) }) == (((((3) + (0)) + (9)) + (42)) + (5)))); @@ -84,7 +84,7 @@ unsafe fn main_0() -> i32 { let __a0 = 2_usize as usize; h.values.resize_with(__a0, || ::default()) }; - h.values[(1_usize)] = 6; + h.values[(1_usize)] = (6 as i32); { let __a1 = Point { x: 1, y: 2 }; h.points.push(__a1) @@ -93,8 +93,8 @@ unsafe fn main_0() -> i32 { assert!(((h.values[(1_usize)]) == (6))); assert!(((unsafe { Point::sum(&h.points[(0_usize)],) }) == (6))); let mut hp: *mut Holder = (&mut h as *mut Holder); - (&mut (*hp)).values[(0_usize)] = (((&mut (*hp)).values[(1_usize)]) + (1)); - (&mut (*hp)).points[(0_usize)].x = (&mut (*hp)).values[(0_usize)]; + (&mut (*hp)).values[(0_usize)] = ((((&mut (*hp)).values[(1_usize)] as i32) + (1)) as i32); + (&mut (*hp)).points[(0_usize)].x = ((&mut (*hp)).values[(0_usize)] as i32); assert!(((h.values[(0_usize)]) == (7)) && ((h.points[(0_usize)].x) == (7))); let mut q: Point = h.points[(0_usize)]; q.x = 0; @@ -108,7 +108,7 @@ unsafe fn main_0() -> i32 { let __a1 = vec![0; 3_usize as usize]; grid.push(__a1) }; - grid[(1_usize)][(2_usize)] = 8; + grid[(1_usize)][(2_usize)] = (8 as i32); assert!(((grid[(1_usize)][(2_usize)]) == (8)) && ((grid[(0_usize)][(2_usize)]) == (0))); grid[(0_usize)][(1_usize)] = grid[(1_usize)][(2_usize)]; grid[(1_usize)][(0_usize)] += grid[(0_usize)][(1_usize)]; diff --git a/tests/unit/out/unsafe/vector_with_allocator.rs b/tests/unit/out/unsafe/vector_with_allocator.rs index 326654eb3..d3000aa6e 100644 --- a/tests/unit/out/unsafe/vector_with_allocator.rs +++ b/tests/unit/out/unsafe/vector_with_allocator.rs @@ -67,14 +67,14 @@ pub unsafe fn fn_1(v: *mut Vec, mut v3: Vec) { let __a1 = 3; v2.push(__a1) }; - x = (&mut (*v))[(2_usize)]; - v2[(0_usize)] = 1; + x = ((&mut (*v))[(2_usize)] as i32); + v2[(0_usize)] = (1 as i32); (&mut (*if true { (&mut v3 as *mut Vec) } else { (v) - }))[(0_usize)] = 7; - (&mut (*v4))[(1_usize)] = 13; + }))[(0_usize)] = (7 as i32); + (&mut (*v4))[(1_usize)] = (13 as i32); assert!(((x) == (6))); assert!(((*((*v).first_mut().unwrap())) == (4))); assert!((((&mut (*v))[(1_usize)]) == (5))); @@ -104,15 +104,15 @@ unsafe fn main_0() -> i32 { assert!(!(v1.is_empty())); v1.pop(); assert!(v1.is_empty()); - let mut s1: u64 = (v1.len() as u64); + let mut s1: usize = v1.len(); { let __a0 = 100_usize as usize; v1.resize_with(__a0, || ::default()) }; assert!(((v1.len()) == (100_usize))); assert!(((v1[(99_usize)]) == (0))); - v1[(0_usize)] = 40; - v1[(99_usize)] = 50; + v1[(0_usize)] = (40 as i32); + v1[(99_usize)] = (50 as i32); assert!(((v1[(0_usize)]) == (40))); assert!(((v1[(99_usize)]) == (50))); let mut v2: Vec = Vec::new(); @@ -152,7 +152,7 @@ unsafe fn main_0() -> i32 { assert!(((v2[(0_usize)]) == (100))); assert!(((v2[(1_usize)]) == (2))); assert!(((v2[(2_usize)]) == (3))); - let mut s2: u64 = (v2.len() as u64); + let mut s2: usize = v2.len(); let mut v3: Vec = vec![1; 100_usize as usize]; assert!(((v3.len()) == (100_usize))); let mut i: i32 = 0; @@ -160,10 +160,10 @@ unsafe fn main_0() -> i32 { assert!(((v3[(i as usize)]) == (1))); i.prefix_inc(); } - let mut v6: Vec = vec![2_f64; (s2 as usize) as usize]; - assert!(((v6.len()) == (s2 as usize))); + let mut v6: Vec = vec![2_f64; s2 as usize]; + assert!(((v6.len()) == (s2))); let mut i: u32 = 0_u32; - 'loop_: while ((i as u64) < (s2)) { + 'loop_: while ((i as usize) < (s2)) { assert!(((v6[(i as usize)]) == (2_f64))); i.prefix_inc(); } @@ -210,7 +210,7 @@ unsafe fn main_0() -> i32 { assert!(((*((v2).last_mut().unwrap())) == (3))); assert!(((*((v3).last_mut().unwrap())) == (1))); assert!(((*((v6).last_mut().unwrap())) == (2_f64))); - let ref0: *mut f64 = ((v6).last_mut().unwrap()); + let ref0: *mut f64 = (((v6).last_mut().unwrap()) as *mut f64).cast::(); (*ref0) = 5_f64; assert!(((*((v6).last_mut().unwrap())) == (5_f64))); let mut x0: f64 = (*((v6).last_mut().unwrap())); @@ -219,14 +219,15 @@ unsafe fn main_0() -> i32 { assert!(((*((v6).last_mut().unwrap())) == (5_f64))); let mut idx: i32 = 0; assert!(((*(&mut (v6)[(idx as usize) as usize] as *mut f64)) == (2_f64))); - assert!(((*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)) == (5_f64))); - let ref1: *mut f64 = (&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64); + assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (5_f64))); + let ref1: *mut f64 = + ((&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64) as *mut f64).cast::(); (*ref1) += 1.5_f64; - assert!(((*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)) == (6.5_f64))); - let mut x1: f64 = (*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)); + assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (6.5_f64))); + let mut x1: f64 = (*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)); assert!(((x1) == (6.5_f64))); x1 -= 1.5_f64; - assert!(((*(&mut (v6)[(s2).wrapping_sub(1_u64) as usize] as *mut f64)) == (6.5_f64))); + assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (6.5_f64))); let mut v7: Vec = Vec::new(); let mut v8: Vec = Vec::new(); { @@ -321,8 +322,8 @@ unsafe fn main_0() -> i32 { assert!(((v13[(0_usize)] as i32) == (10)) && ((v13[(4_usize)] as i32) == (50))); assert!( ((((s1).wrapping_add(s2)) - .wrapping_add(((*(&mut (v2)[0_usize as usize] as *mut i32)) as u64))) - == (103_u64)) + .wrapping_add(((*(&mut (v2)[0_usize as usize] as *mut i32)) as usize))) + == (103_usize)) ); return 0; } From c327aed9f6878a93b5617f3e2239f063443e8a59 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 16:02:19 +0100 Subject: [PATCH 36/62] Fix bindings order --- cpp2rust/converter/rules/registry.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp2rust/converter/rules/registry.cpp b/cpp2rust/converter/rules/registry.cpp index 5ee62bb5c..034bdf03a 100644 --- a/cpp2rust/converter/rules/registry.cpp +++ b/cpp2rust/converter/rules/registry.cpp @@ -406,11 +406,11 @@ Matcher::Match Search(clang::ASTContext &ctx, if (!match.rule_decl) { return {}; } + auto bindings = getBindings(match.rule_decl->decl, match.match.args); if (auto generic = match.rule_decl->rule.generic) { - return Search(ctx, match.match.args.at(generic - 1).getAsType()); + return Search(ctx, bindings.at(generic - 1).getAsType()); } - return {&match.rule_decl->rule, - getBindings(match.rule_decl->decl, match.match.args)}; + return {&match.rule_decl->rule, std::move(bindings)}; } const TranslationRule::ExprRule *GetExprRule(clang::ASTContext &ctx, From accdc9db480457a25c843b720ab6a15a8ba0b240 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 16:22:52 +0100 Subject: [PATCH 37/62] Fix record derives copy --- cpp2rust/converter/converter.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index 80671a235..8bf3ff1a4 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -799,9 +799,9 @@ bool Converter::RecordHasCopyableFields(const clang::RecordDecl *decl) { } // Look recursively into fields that are RecordDecl, or arrays of them - if (auto field_record = - ctx_.getBaseElementType(f->getType())->getAsRecordDecl()) { - if (!RecordDerivesCopy(field_record)) { + if (auto field_type = ctx_.getBaseElementType(f->getType()); + field_type->getAsRecordDecl()) { + if (!RecordDerivesCopy(field_type)) { return false; } } From 2e4d19cd28813ca79c5a03ff17d5fa8229e4ebb2 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 16:25:57 +0100 Subject: [PATCH 38/62] Update tests --- tests/unit/out/refcount/class_templates.rs | 8 +- tests/unit/out/refcount/clone_vs_move.rs | 60 ++++- .../unit/out/refcount/compound_assign_ref.rs | 4 +- .../unit/out/refcount/copy_move_defaulted.rs | 24 +- .../refcount/elidable_iterator_copy_cxx11.rs | 43 ++- tests/unit/out/refcount/fn_ptr_stable_sort.rs | 14 +- tests/unit/out/refcount/huffman.rs | 4 +- tests/unit/out/refcount/implicit_autoref.rs | 10 +- .../out/refcount/inline_container_fields.rs | 38 +-- tests/unit/out/refcount/kruskal.rs | 6 +- tests/unit/out/refcount/map.rs | 4 +- tests/unit/out/refcount/move_assign.rs | 7 +- tests/unit/out/refcount/operator_traits.rs | 102 +++---- tests/unit/out/refcount/push_emplace_back.rs | 62 +---- tests/unit/out/refcount/ret_rvalue_ref.rs | 2 +- tests/unit/out/refcount/rvalue_ref_general.rs | 4 +- tests/unit/out/refcount/sort.rs | 26 +- tests/unit/out/refcount/sort_no_copy.rs | 69 ++--- .../refcount/split_binop_aliased_borrows.rs | 2 +- tests/unit/out/refcount/string.rs | 8 +- tests/unit/out/refcount/string2.rs | 2 +- tests/unit/out/refcount/swap_map_no_copy.rs | 122 ++++----- .../refcount/unboxed_conditional_iterator.rs | 2 +- tests/unit/out/refcount/unboxed_locals.rs | 9 +- tests/unit/out/refcount/unique_ptr.rs | 13 +- .../out/refcount/unique_ptr_const_deref.rs | 5 +- .../out/refcount/unique_ptr_field_reset.rs | 6 +- tests/unit/out/refcount/unique_ptr_nested.rs | 2 +- tests/unit/out/refcount/vector.rs | 11 +- tests/unit/out/refcount/vector2.rs | 8 +- tests/unit/out/refcount/vector3.rs | 12 +- .../refcount/vector_deque_vector_string.rs | 250 +++++++----------- .../out/refcount/vector_subscript_borrow.rs | 16 +- .../out/refcount/vector_subscript_direct.rs | 38 +-- .../out/refcount/vector_with_allocator.rs | 19 +- tests/unit/out/refcount/void_cast.rs | 2 +- tests/unit/out/refcount/void_return.rs | 4 +- tests/unit/out/unsafe/class_templates.rs | 6 +- tests/unit/out/unsafe/compound_assign_ref.rs | 2 +- tests/unit/out/unsafe/implicit_autoref.rs | 14 +- tests/unit/out/unsafe/inet_pton_ntop.rs | 6 +- .../out/unsafe/inline_container_fields.rs | 8 +- tests/unit/out/unsafe/ret_rvalue_ref.rs | 2 +- tests/unit/out/unsafe/rvalue_ref_general.rs | 4 +- .../out/unsafe/split_binop_aliased_borrows.rs | 2 +- tests/unit/out/unsafe/string.rs | 8 +- tests/unit/out/unsafe/string2.rs | 2 +- tests/unit/out/unsafe/sys_stat.rs | 18 +- .../unsafe/unboxed_conditional_iterator.rs | 2 +- tests/unit/out/unsafe/unboxed_locals.rs | 9 +- tests/unit/out/unsafe/vector.rs | 9 +- tests/unit/out/unsafe/vector2.rs | 8 +- tests/unit/out/unsafe/vector3.rs | 6 +- tests/unit/out/unsafe/vector_addr_of_back.rs | 2 +- .../out/unsafe/vector_deque_vector_string.rs | 2 +- .../out/unsafe/vector_subscript_borrow.rs | 16 +- .../out/unsafe/vector_subscript_direct.rs | 22 +- .../unit/out/unsafe/vector_with_allocator.rs | 17 +- 58 files changed, 530 insertions(+), 653 deletions(-) diff --git a/tests/unit/out/refcount/class_templates.rs b/tests/unit/out/refcount/class_templates.rs index 543db803d..03f32dca7 100644 --- a/tests/unit/out/refcount/class_templates.rs +++ b/tests/unit/out/refcount/class_templates.rs @@ -231,7 +231,7 @@ impl MyContainer_char_Impl for Ptr { return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { - return (field_ref!((*self), vec_).as_pointer().decay().to_last()).reinterpret_cast::(); + return field_ref!((*self), vec_).as_pointer().decay().to_last(); } fn pop_back(&self) { field!((*self), vec_).with_mut(|__v: &mut Vec| __v.pop()); @@ -262,8 +262,7 @@ impl MyContainer_float_Impl for Ptr { return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { - return (field_ref!((*self), vec_).as_pointer().decay().to_last()) - .reinterpret_cast::(); + return field_ref!((*self), vec_).as_pointer().decay().to_last(); } fn pop_back(&self) { field!((*self), vec_).with_mut(|__v: &mut Vec| __v.pop()); @@ -294,8 +293,7 @@ impl MyContainer_int_Impl for Ptr { return (*(*self).upgrade().deref()).vec_.len(); } fn back_4(&self) -> Ptr { - return (field_ref!((*self), vec_).as_pointer().decay().to_last()) - .reinterpret_cast::(); + return field_ref!((*self), vec_).as_pointer().decay().to_last(); } fn pop_back(&self) { field!((*self), vec_).with_mut(|__v: &mut Vec| __v.pop()); diff --git a/tests/unit/out/refcount/clone_vs_move.rs b/tests/unit/out/refcount/clone_vs_move.rs index 5401aeba8..90888f52f 100644 --- a/tests/unit/out/refcount/clone_vs_move.rs +++ b/tests/unit/out/refcount/clone_vs_move.rs @@ -160,15 +160,33 @@ fn main_0() -> i32 { let m2: Value>> = Rc::new(RefCell::new((*m1.borrow()).clone())); let mut i: i32 = 0; 'loop_: while (i < N) { - assert!(((*m1.borrow())[(i as usize)].len() == 10_usize)); - assert!(((*m2.borrow())[(i as usize)].len() == 10_usize)); + assert!( + ((*m1 + .as_pointer() + .decay() + .offset((i as usize)) + .upgrade() + .deref()) + .len() + == 10_usize) + ); + assert!( + ((*m2 + .as_pointer() + .decay() + .offset((i as usize)) + .upgrade() + .deref()) + .len() + == 10_usize) + ); let mut j: i32 = 0; 'loop_: while (j < 10) { assert!( - ((elem!(m1.as_pointer().decay().offset((i as usize)), (j as usize)).read()) == 0) + ((index!(elem!(m1.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 0) ); assert!( - ((elem!(m2.as_pointer().decay().offset((i as usize)), (j as usize)).read()) == 0) + ((index!(elem!(m2.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 0) ); j.prefix_inc(); } @@ -178,7 +196,7 @@ fn main_0() -> i32 { 'loop_: while (i < N) { let mut j: i32 = 0; 'loop_: while (j < 10) { - elem!(m2.as_pointer().decay().offset((i as usize)), (j as usize)) + index!(elem!(m2.as_pointer().decay(), (i as usize)), (j as usize)) .with_mut(|__v| __v.postfix_inc()); j.prefix_inc(); } @@ -186,15 +204,33 @@ fn main_0() -> i32 { } let mut i: i32 = 0; 'loop_: while (i < N) { - assert!(((*m1.borrow())[(i as usize)].len() == 10_usize)); - assert!(((*m2.borrow())[(i as usize)].len() == 10_usize)); + assert!( + ((*m1 + .as_pointer() + .decay() + .offset((i as usize)) + .upgrade() + .deref()) + .len() + == 10_usize) + ); + assert!( + ((*m2 + .as_pointer() + .decay() + .offset((i as usize)) + .upgrade() + .deref()) + .len() + == 10_usize) + ); let mut j: i32 = 0; 'loop_: while (j < 10) { assert!( - ((elem!(m1.as_pointer().decay().offset((i as usize)), (j as usize)).read()) == 0) + ((index!(elem!(m1.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 0) ); assert!( - ((elem!(m2.as_pointer().decay().offset((i as usize)), (j as usize)).read()) == 1) + ((index!(elem!(m2.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 1) ); j.prefix_inc(); } @@ -336,9 +372,9 @@ fn main_0() -> i32 { .chain(std::iter::once(0)) .collect(); let mut s2: Vec = (s1).clone(); - s2[0_usize] = (('b' as i8) as i8); - s2[1_usize] = (('b' as i8) as i8); - s2[2_usize] = (('b' as i8) as i8); + s2[0_usize] = ('b' as i8); + s2[1_usize] = ('b' as i8); + s2[2_usize] = ('b' as i8); assert!(((s2[0_usize] as i32) == (('b' as i8) as i32))); assert!(((s2[1_usize] as i32) == (('b' as i8) as i32))); assert!(((s2[2_usize] as i32) == (('b' as i8) as i32))); diff --git a/tests/unit/out/refcount/compound_assign_ref.rs b/tests/unit/out/refcount/compound_assign_ref.rs index ab7cf5cdd..c00bc8aba 100644 --- a/tests/unit/out/refcount/compound_assign_ref.rs +++ b/tests/unit/out/refcount/compound_assign_ref.rs @@ -17,9 +17,7 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; { - v.as_pointer() - .decay() - .with_mut(|__v| *__v = *__v + (5 as i32)) + v.as_pointer().decay().with_mut(|__v| *__v = *__v + 5) }; assert!(((v.as_pointer().decay().read()) == 15)); return 0; diff --git a/tests/unit/out/refcount/copy_move_defaulted.rs b/tests/unit/out/refcount/copy_move_defaulted.rs index 43ab8ce3d..8fc3b3a28 100644 --- a/tests/unit/out/refcount/copy_move_defaulted.rs +++ b/tests/unit/out/refcount/copy_move_defaulted.rs @@ -340,9 +340,10 @@ fn main_0() -> i32 { ); assert!( (((*r.borrow()).rows.len() == 1_usize) - && ((*((field_ref!(r.as_pointer(), rows).as_pointer() as Ptr>) + && ((*field_ref!(r.as_pointer(), rows) + .as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr>) .upgrade() .deref()) .len() @@ -355,7 +356,7 @@ fn main_0() -> i32 { (*bufs.borrow_mut()).push(__a1) }; { - let __init = Buffer::move_from({ (bufs.as_pointer() as Ptr).offset(0_usize) }); + let __init = Buffer::move_from({ bufs.as_pointer().decay().offset(0_usize) }); (*bufs.borrow_mut()).push(__init) }; assert!( @@ -373,7 +374,7 @@ fn main_0() -> i32 { array_elem!(o1.as_pointer(), arr, 1).write(6); { let _p: Ptr<_> = Ptr::alloc(7); - (field_ptr!(o1.as_pointer(), p) as Ptr>>).write(_p.to_owned_opt()) + field_ptr!(o1.as_pointer(), p).write(_p.to_owned_opt()) }; let o2: Value = Rc::new(RefCell::new(Owner::move_from({ o1.as_pointer() }))); assert!( @@ -399,7 +400,7 @@ fn main_0() -> i32 { let _dtor_h1 = ScopedDestructor::new(&h1, |__p| __p.destructor()); { let _p: Ptr<_> = Ptr::alloc(9); - (field_ptr!(h1.as_pointer(), p) as Ptr>>).write(_p.to_owned_opt()) + field_ptr!(h1.as_pointer(), p).write(_p.to_owned_opt()) }; let h2: Value = Rc::new(RefCell::new(Holder::move_from({ h1.as_pointer() }))); let _dtor_h2 = ScopedDestructor::new(&h2, |__p| __p.destructor()); @@ -424,9 +425,11 @@ pub trait BufferImpl { } impl BufferImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ref!((*self), data).as_pointer() as Ptr>) + field_ref!((*self), data) + .as_pointer() .write(field!(_a0, data).with_mut(std::mem::take)); - (field_ref!((*self), rows).as_pointer() as Ptr>>) + field_ref!((*self), rows) + .as_pointer() .write(field!(_a0, rows).with_mut(std::mem::take)); field!((*self), n).write({ { (*_a0.upgrade().deref()).n } }); { @@ -465,7 +468,7 @@ impl HolderImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { field!((*self), inner).write({ { (*_a0.upgrade().deref()).inner.clone() } }); field!((*self), e).write({ { (*_a0.upgrade().deref()).e.clone() } }); - (field_ptr!((*self), p) as Ptr>>) + field_ptr!((*self), p) .write(field!(_a0, p).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } @@ -478,7 +481,8 @@ pub trait OwnerImpl { } impl OwnerImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ref!((*self), data).as_pointer() as Ptr>) + field_ref!((*self), data) + .as_pointer() .write(field!(_a0, data).with_mut(std::mem::take)); field!((*self), n).write({ { (*_a0.upgrade().deref()).n } }); { @@ -490,7 +494,7 @@ impl OwnerImpl for Ptr { ); ((array_field_ptr!((*self), arr)) as Ptr).to_any() }; - (field_ptr!((*self), p) as Ptr>>) + field_ptr!((*self), p) .write(field!(_a0, p).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs b/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs index fe10340d3..1d9e0599a 100644 --- a/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs +++ b/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs @@ -21,48 +21,47 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; let it: Value> = Rc::new(RefCell::new({ - let mut __it = (v.as_pointer() as Ptr).begin(); - while __it != (v.as_pointer() as Ptr).end() && __it.iter_deref().with(|__v| *__v != 7) - { + let mut __it = v.as_pointer().decay().begin(); + while __it != v.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != 7) { __it.iter_inc(); } __it })); - assert!((*it.borrow()) != (v.as_pointer() as Ptr).end()); + assert!((*it.borrow()) != v.as_pointer().decay().end()); assert!((((*it.borrow()).iter_deref().read()) == 7)); { - let __n = (v.as_pointer() as Ptr) + let __n = v + .as_pointer() + .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr).begin()); + .iter_distance(&v.as_pointer().decay().begin()); let __random = std::hash::RandomState::new(); for __i in (1..__n).rev() { let __j = (std::hash::BuildHasher::hash_one(&__random, __i) % (__i + 1) as u64) as isize; cpp_swap!( - (v.as_pointer() as Ptr).begin().iter_at(__i), - (v.as_pointer() as Ptr).begin().iter_at(__j) + v.as_pointer().decay().begin().iter_at(__i), + v.as_pointer().decay().begin().iter_at(__j) ); } }; { - let __n = (v.as_pointer() as Ptr) + let __n = v + .as_pointer() + .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr).begin()); + .iter_distance(&v.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (v.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (v.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) - }); - reorder(__order, |__i| { - (v.as_pointer() as Ptr).begin().iter_at(__i) + v.as_pointer().decay().begin().iter_at(__x).with(|__a| { + v.as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); + reorder(__order, |__i| v.as_pointer().decay().begin().iter_at(__i)); }; assert!(({ (*v.borrow())[0_usize] } == 4) && ({ (*v.borrow())[1_usize] } == 7)); return 0; diff --git a/tests/unit/out/refcount/fn_ptr_stable_sort.rs b/tests/unit/out/refcount/fn_ptr_stable_sort.rs index 79439c98a..f8b333380 100644 --- a/tests/unit/out/refcount/fn_ptr_stable_sort.rs +++ b/tests/unit/out/refcount/fn_ptr_stable_sort.rs @@ -36,13 +36,15 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; { - let __n = (v.as_pointer() as Ptr) + let __n = v + .as_pointer() + .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr).begin()); + .iter_distance(&v.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - let __a = (v.as_pointer() as Ptr).begin().iter_at(__x); - let __b = (v.as_pointer() as Ptr).begin().iter_at(__y); + let __a = v.as_pointer().decay().begin().iter_at(__x); + let __b = v.as_pointer().decay().begin().iter_at(__y); if Compare_0.call(__a.clone(), __b.clone()) { std::cmp::Ordering::Less } else if Compare_0.call(__b, __a) { @@ -51,9 +53,7 @@ fn main_0() -> i32 { std::cmp::Ordering::Equal } }); - reorder(__order, |__i| { - (v.as_pointer() as Ptr).begin().iter_at(__i) - }); + reorder(__order, |__i| v.as_pointer().decay().begin().iter_at(__i)); }; assert!(({ (*v.borrow())[0_usize].key } == 1)); assert!(({ (*v.borrow())[1_usize].key } == 2)); diff --git a/tests/unit/out/refcount/huffman.rs b/tests/unit/out/refcount/huffman.rs index b8ce918b3..1de3747be 100644 --- a/tests/unit/out/refcount/huffman.rs +++ b/tests/unit/out/refcount/huffman.rs @@ -439,12 +439,12 @@ impl MinHeapImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { field!((*self), size).write({ { (*_a0.upgrade().deref()).size } }); field!((*self), capacity).write({ { (*_a0.upgrade().deref()).capacity } }); - (field_ptr!((*self), arr) as Ptr]>>>>).write( + field_ptr!((*self), arr).write( field!(_a0, arr) .with_mut(|__v: &mut Option]>>>| __v.take()), ); field!((*self), next).write({ { (*_a0.upgrade().deref()).next } }); - (field_ptr!((*self), alloc) as Ptr>>>).write( + field_ptr!((*self), alloc).write( field!(_a0, alloc).with_mut(|__v: &mut Option>>| __v.take()), ); return (*self).clone(); diff --git a/tests/unit/out/refcount/implicit_autoref.rs b/tests/unit/out/refcount/implicit_autoref.rs index d8dc77112..02a1b2ea5 100644 --- a/tests/unit/out/refcount/implicit_autoref.rs +++ b/tests/unit/out/refcount/implicit_autoref.rs @@ -31,8 +31,8 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; let mut p: Ptr> = (v.as_pointer()); - let mut a: i32 = ((index!(p, 0_usize).read()) as i32); - index!(p, 1_usize).write((30 as i32)); + let mut a: i32 = (index!(p, 0_usize).read()); + index!(p, 1_usize).write(30); let h: Value = Rc::new(RefCell::new(::default())); { let __a1 = 40; @@ -43,13 +43,13 @@ fn main_0() -> i32 { (*h.borrow_mut()).v.push(__a1) }; let mut hp: Ptr = (h.as_pointer()); - let mut b: i32 = ((vec_elem!((hp), v, 0_usize).read()) as i32); - vec_elem!((hp), v, 1_usize).write((60 as i32)); + let mut b: i32 = (vec_elem!((hp), v, 0_usize).read()); + vec_elem!((hp), v, 1_usize).write(60); assert!((a == 10)); assert!(((index!(p, 1_usize).read()) == 30)); assert!((b == 40)); assert!(((vec_elem!((hp), v, 1_usize).read()) == 60)); - ({ write_through_0((p.decay().offset(0_usize as isize)).reinterpret_cast::()) }); + ({ write_through_0((p.decay().offset(0_usize as isize))) }); assert!(((index!(p, 0_usize).read()) == 42)); return 0; } diff --git a/tests/unit/out/refcount/inline_container_fields.rs b/tests/unit/out/refcount/inline_container_fields.rs index 864eb6e4c..5474cbf60 100644 --- a/tests/unit/out/refcount/inline_container_fields.rs +++ b/tests/unit/out/refcount/inline_container_fields.rs @@ -128,8 +128,7 @@ fn main_0() -> i32 { .decay() .offset(2_usize)); let mut h: Ptr = (array_field_ptr!(e, hist) as Ptr); - let mut c: Ptr = - (field_ref!(e, coeffs).as_pointer().decay().offset(1_usize)).reinterpret_cast::(); + let mut c: Ptr = (field_ref!(e, coeffs).as_pointer().decay().offset(1_usize)); let mut id: Ptr = (field_ptr!( field_ref!(s.as_pointer(), elems) .as_pointer() @@ -185,43 +184,18 @@ fn main_0() -> i32 { .as_pointer() .decay() .offset(0_usize) - .offset(0_usize)) - .reinterpret_cast::(); + .decay() + .offset(0_usize)); elem!(row, 2).write(9); - assert!( - ((elem!( - field_ref!(s.as_pointer(), rows) - .as_pointer() - .decay() - .offset(0_usize), - 2_usize - ) - .read()) - == 9) - ); + assert!(((index!(vec_elem!(s.as_pointer(), rows, 0_usize), 2_usize).read()) == 9)); let t: Value = Rc::new(RefCell::new((*s.borrow()).clone())); index!(field!(vec_elem!(t.as_pointer(), elems, 2_usize), hist), 0).write(100); (*t.borrow_mut()).grid[(0) as usize][(0) as usize] = 100; - elem!( - field_ref!(t.as_pointer(), rows) - .as_pointer() - .decay() - .offset(0_usize), - 0_usize - ) - .write((100 as i32)); + index!(vec_elem!(t.as_pointer(), rows, 0_usize), 0_usize).write(100); assert!( (((index!(field!(vec_elem!(s.as_pointer(), elems, 2_usize), hist), 0).read()) == 0) && ((*s.borrow()).grid[(0) as usize][(0) as usize] == 0)) - && ((elem!( - field_ref!(s.as_pointer(), rows) - .as_pointer() - .decay() - .offset(0_usize), - 0_usize - ) - .read()) - == 1) + && ((index!(vec_elem!(s.as_pointer(), rows, 0_usize), 0_usize).read()) == 1) ); assert!( (((index!( diff --git a/tests/unit/out/refcount/kruskal.rs b/tests/unit/out/refcount/kruskal.rs index 2e365dd58..65ccc3f1a 100644 --- a/tests/unit/out/refcount/kruskal.rs +++ b/tests/unit/out/refcount/kruskal.rs @@ -364,9 +364,9 @@ impl DisjointSetImpl for Ptr { } } fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), rank) as Ptr>>>) + field_ptr!((*self), rank) .write(field!(_a0, rank).with_mut(|__v: &mut Option>>| __v.take())); - (field_ptr!((*self), parent) as Ptr>>>) + field_ptr!((*self), parent) .write(field!(_a0, parent).with_mut(|__v: &mut Option>>| __v.take())); field!((*self), n).write({ { (*_a0.upgrade().deref()).n } }); return (*self).clone(); @@ -377,7 +377,7 @@ pub trait GraphImpl { } impl GraphImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), edges) as Ptr>>>) + field_ptr!((*self), edges) .write(field!(_a0, edges).with_mut(|__v: &mut Option>>| __v.take())); field!((*self), V).write({ { (*_a0.upgrade().deref()).V } }); field!((*self), E).write({ { (*_a0.upgrade().deref()).E } }); diff --git a/tests/unit/out/refcount/map.rs b/tests/unit/out/refcount/map.rs index 96f1b16be..7c4a13b67 100644 --- a/tests/unit/out/refcount/map.rs +++ b/tests/unit/out/refcount/map.rs @@ -651,9 +651,9 @@ fn main_0() -> i32 { let __rhs = ((i).wrapping_rem(2_u32) != 0); m2.as_pointer() .with_mut(|__m: &mut Map, Value)>| { - __m.get_or_insert_with((indexes[(i as usize)] as i32).clone(), || { + __m.get_or_insert_with(indexes[(i as usize)].clone(), || { ( - Rc::new(RefCell::new((indexes[(i as usize)] as i32))), + Rc::new(RefCell::new(indexes[(i as usize)])), Rc::new(RefCell::new(::default())), ) }) diff --git a/tests/unit/out/refcount/move_assign.rs b/tests/unit/out/refcount/move_assign.rs index f87db9d1e..7b0670748 100644 --- a/tests/unit/out/refcount/move_assign.rs +++ b/tests/unit/out/refcount/move_assign.rs @@ -89,12 +89,7 @@ fn main_0() -> i32 { (*vec_.borrow_mut()).push(__a1) }; let d: Value = Rc::new(RefCell::new(MoveOnly::new({ 8 }))); - ({ - MoveOnlyImpl::move_assign( - &(vec_.as_pointer() as Ptr).offset(0_usize), - d.as_pointer(), - ) - }); + ({ MoveOnlyImpl::move_assign(&vec_.as_pointer().decay().offset(0_usize), d.as_pointer()) }); assert!(({ (*vec_.borrow())[0_usize].v } == 8)); assert!(({ (*d.borrow()).v } == 0)); let m: Value = Rc::new(RefCell::new(ConstMoveAssign::new())); diff --git a/tests/unit/out/refcount/operator_traits.rs b/tests/unit/out/refcount/operator_traits.rs index c342e95fa..ed186fb65 100644 --- a/tests/unit/out/refcount/operator_traits.rs +++ b/tests/unit/out/refcount/operator_traits.rs @@ -165,24 +165,22 @@ fn main_0() -> i32 { Lt { v: 2 }, ]))); { - let __n = (lts.as_pointer() as Ptr) + let __n = lts + .as_pointer() + .decay() .end() - .iter_distance(&(lts.as_pointer() as Ptr).begin()); + .iter_distance(<s.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (lts.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (lts.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) - }); - reorder(__order, |__i| { - (lts.as_pointer() as Ptr).begin().iter_at(__i) + lts.as_pointer().decay().begin().iter_at(__x).with(|__a| { + lts.as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); + reorder(__order, |__i| lts.as_pointer().decay().begin().iter_at(__i)); }; assert!( (({ (*lts.borrow())[0_usize].v } == 1) && ({ (*lts.borrow())[1_usize].v } == 2)) @@ -197,8 +195,8 @@ fn main_0() -> i32 { let mut nine: Eq = Eq { v: 9 }; assert!( ({ - let mut __it = (eqs.as_pointer() as Ptr).begin(); - while __it != (eqs.as_pointer() as Ptr).end() + let mut __it = eqs.as_pointer().decay().begin(); + while __it != eqs.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != two) { __it.iter_inc(); @@ -211,14 +209,14 @@ fn main_0() -> i32 { ); assert!( { - let mut __it = (eqs.as_pointer() as Ptr).begin(); - while __it != (eqs.as_pointer() as Ptr).end() + let mut __it = eqs.as_pointer().decay().begin(); + while __it != eqs.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != nine) { __it.iter_inc(); } __it - } == (eqs.as_pointer() as Ptr).end() + } == eqs.as_pointer().decay().end() ); let cmps: Value> = Rc::new(RefCell::new(Vec::from([ Cmp { v: 3 }, @@ -226,31 +224,31 @@ fn main_0() -> i32 { Cmp { v: 2 }, ]))); { - let __n = (cmps.as_pointer() as Ptr) + let __n = cmps + .as_pointer() + .decay() .end() - .iter_distance(&(cmps.as_pointer() as Ptr).begin()); + .iter_distance(&cmps.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (cmps.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (cmps.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) + cmps.as_pointer().decay().begin().iter_at(__x).with(|__a| { + cmps.as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); reorder(__order, |__i| { - (cmps.as_pointer() as Ptr).begin().iter_at(__i) + cmps.as_pointer().decay().begin().iter_at(__i) }); }; assert!(({ (*cmps.borrow())[0_usize].v } == 1) && ({ (*cmps.borrow())[2_usize].v } == 3)); let mut three: Cmp = Cmp { v: 3 }; assert!( ({ - let mut __it = (cmps.as_pointer() as Ptr).begin(); - while __it != (cmps.as_pointer() as Ptr).end() + let mut __it = cmps.as_pointer().decay().begin(); + while __it != cmps.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != three) { __it.iter_inc(); @@ -263,31 +261,32 @@ fn main_0() -> i32 { ); let frees: Value> = Rc::new(RefCell::new(Vec::from([Free { v: 2 }, Free { v: 1 }]))); { - let __n = (frees.as_pointer() as Ptr) + let __n = frees + .as_pointer() + .decay() .end() - .iter_distance(&(frees.as_pointer() as Ptr).begin()); + .iter_distance(&frees.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (frees.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (frees.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) + frees.as_pointer().decay().begin().iter_at(__x).with(|__a| { + frees + .as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); reorder(__order, |__i| { - (frees.as_pointer() as Ptr).begin().iter_at(__i) + frees.as_pointer().decay().begin().iter_at(__i) }); }; assert!(({ (*frees.borrow())[0_usize].v } == 1)); let mut ftwo: Free = Free { v: 2 }; assert!( ({ - let mut __it = (frees.as_pointer() as Ptr).begin(); - while __it != (frees.as_pointer() as Ptr).end() + let mut __it = frees.as_pointer().decay().begin(); + while __it != frees.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != ftwo) { __it.iter_inc(); @@ -299,7 +298,7 @@ fn main_0() -> i32 { == 2) ); let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(Lt { v: 2 }.clone(), || { ( @@ -312,7 +311,7 @@ fn main_0() -> i32 { .as_pointer() }) .write(20); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(Lt { v: 1 }.clone(), || { ( @@ -326,7 +325,8 @@ fn main_0() -> i32 { }) .write(10); assert!( - ((*(*(m.as_pointer() as Ptr, Value)>>) + ((*(*m + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()) .iter_deref() .upgrade() @@ -336,7 +336,7 @@ fn main_0() -> i32 { == 10) ); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(Lt { v: 2 }.clone(), || { ( diff --git a/tests/unit/out/refcount/push_emplace_back.rs b/tests/unit/out/refcount/push_emplace_back.rs index 892d37621..69597b478 100644 --- a/tests/unit/out/refcount/push_emplace_back.rs +++ b/tests/unit/out/refcount/push_emplace_back.rs @@ -179,49 +179,28 @@ fn main_0() -> i32 { let vecs: Value>> = Rc::new(RefCell::new(Vec::new())); ({ push_param_0((vecs.as_pointer())) }); assert!(((*vecs.borrow()).len() == 1_usize)); - assert!((*vecs.borrow())[0_usize].is_empty()); + assert!((*vecs.as_pointer().decay().offset(0_usize).upgrade().deref()).is_empty()); let jpg: Value = Rc::new(RefCell::new(::default())); ({ push_local_from_field_1((jpg.as_pointer()), true) }); assert!(((*jpg.borrow()).com_data.len() == 1_usize)); assert!( - ((*vec_elem!(jpg.as_pointer(), com_data, 0_usize) + ((*field_ref!(jpg.as_pointer(), com_data) + .as_pointer() + .decay() + .offset(0_usize) .upgrade() .deref()) .len() == 3_usize) ); assert!( - (((elem!( - field_ref!(jpg.as_pointer(), com_data) - .as_pointer() - .decay() - .offset(0_usize), - 0_usize - ) - .read()) as i32) - == 1) + (((index!(vec_elem!(jpg.as_pointer(), com_data, 0_usize), 0_usize).read()) as i32) == 1) ); assert!( - (((elem!( - field_ref!(jpg.as_pointer(), com_data) - .as_pointer() - .decay() - .offset(0_usize), - 1_usize - ) - .read()) as i32) - == 2) + (((index!(vec_elem!(jpg.as_pointer(), com_data, 0_usize), 1_usize).read()) as i32) == 2) ); assert!( - (((elem!( - field_ref!(jpg.as_pointer(), com_data) - .as_pointer() - .decay() - .offset(0_usize), - 2_usize - ) - .read()) as i32) - == 3) + (((index!(vec_elem!(jpg.as_pointer(), com_data, 0_usize), 2_usize).read()) as i32) == 3) ); assert!((*jpg.borrow()).app_data.is_empty()); let chunks: Value> = Rc::new(RefCell::new(Vec::new())); @@ -236,33 +215,20 @@ fn main_0() -> i32 { ({ emplace_local_from_field_4((jpg.as_pointer()), false) }); assert!(((*jpg.borrow()).app_data.len() == 1_usize)); assert!( - ((*vec_elem!(jpg.as_pointer(), app_data, 0_usize) + ((*field_ref!(jpg.as_pointer(), app_data) + .as_pointer() + .decay() + .offset(0_usize) .upgrade() .deref()) .len() == 3_usize) ); assert!( - (((elem!( - field_ref!(jpg.as_pointer(), app_data) - .as_pointer() - .decay() - .offset(0_usize), - 0_usize - ) - .read()) as i32) - == 1) + (((index!(vec_elem!(jpg.as_pointer(), app_data, 0_usize), 0_usize).read()) as i32) == 1) ); assert!( - (((elem!( - field_ref!(jpg.as_pointer(), app_data) - .as_pointer() - .decay() - .offset(0_usize), - 2_usize - ) - .read()) as i32) - == 3) + (((index!(vec_elem!(jpg.as_pointer(), app_data, 0_usize), 2_usize).read()) as i32) == 3) ); assert!(((*jpg.borrow()).com_data.len() == 1_usize)); (*w.borrow_mut()).chunk.data = 99; diff --git a/tests/unit/out/refcount/ret_rvalue_ref.rs b/tests/unit/out/refcount/ret_rvalue_ref.rs index 912016862..8b37ac616 100644 --- a/tests/unit/out/refcount/ret_rvalue_ref.rs +++ b/tests/unit/out/refcount/ret_rvalue_ref.rs @@ -17,7 +17,7 @@ fn main_0() -> i32 { let __tmp_0: Value = Rc::new(RefCell::new(5)); let i2: Ptr = __tmp_0.as_pointer(); assert!(((i2.read()) == 5)); - let mut i3: i32 = ({ foo_0((i2).reinterpret_cast::()) }); + let mut i3: i32 = ({ foo_0((i2).clone()) }); assert!((i3 == 5)); assert!( (({ diff --git a/tests/unit/out/refcount/rvalue_ref_general.rs b/tests/unit/out/refcount/rvalue_ref_general.rs index 69ff289f1..1df1e30a2 100644 --- a/tests/unit/out/refcount/rvalue_ref_general.rs +++ b/tests/unit/out/refcount/rvalue_ref_general.rs @@ -12,7 +12,7 @@ pub fn main() { } fn main_0() -> i32 { let i1: Value = Rc::new(RefCell::new(3)); - let mut i2: i32 = ((*i1.borrow()) as i32); + let mut i2: i32 = (*i1.borrow()); assert!(((*i1.borrow()) == 3)); assert!((i2 == 3)); let __tmp_0: Value = Rc::new(RefCell::new(40)); @@ -31,7 +31,7 @@ fn main_0() -> i32 { assert!(({ (i6.read()) } == { (i3.read()) })); assert!(({ (i7.read()) } == { (i4.read()) })); let i8: Value = Rc::new(RefCell::new(3)); - let i9: Ptr = (i8.as_pointer()).reinterpret_cast::(); + let i9: Ptr = i8.as_pointer(); assert!(((i9.read()) == 3)); let mut p1: Ptr = (i1.as_pointer()); let mut p2: Ptr = (i3).clone(); diff --git a/tests/unit/out/refcount/sort.rs b/tests/unit/out/refcount/sort.rs index 90dd1059c..7b7f03b77 100644 --- a/tests/unit/out/refcount/sort.rs +++ b/tests/unit/out/refcount/sort.rs @@ -53,24 +53,22 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; { - let __n = (v.as_pointer() as Ptr) + let __n = v + .as_pointer() + .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr).begin()); + .iter_distance(&v.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (v.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (v.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) - }); - reorder(__order, |__i| { - (v.as_pointer() as Ptr).begin().iter_at(__i) + v.as_pointer().decay().begin().iter_at(__x).with(|__a| { + v.as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); + reorder(__order, |__i| v.as_pointer().decay().begin().iter_at(__i)); }; let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < ((*v.borrow()).len()).wrapping_sub(1_usize)) { diff --git a/tests/unit/out/refcount/sort_no_copy.rs b/tests/unit/out/refcount/sort_no_copy.rs index 327f7661e..1d106e817 100644 --- a/tests/unit/out/refcount/sort_no_copy.rs +++ b/tests/unit/out/refcount/sort_no_copy.rs @@ -148,23 +148,23 @@ fn main_0() -> i32 { (*vec_.borrow_mut()).push(__init) }; { - let __n = (vec_.as_pointer() as Ptr) + let __n = vec_ + .as_pointer() + .decay() .end() - .iter_distance(&(vec_.as_pointer() as Ptr).begin()); + .iter_distance(&vec_.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (vec_.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (vec_.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) + vec_.as_pointer().decay().begin().iter_at(__x).with(|__a| { + vec_.as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); reorder(__order, |__i| { - (vec_.as_pointer() as Ptr).begin().iter_at(__i) + vec_.as_pointer().decay().begin().iter_at(__i) }); }; assert!( @@ -174,13 +174,15 @@ fn main_0() -> i32 { ); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); { - let __n = (vec_.as_pointer() as Ptr) + let __n = vec_ + .as_pointer() + .decay() .end() - .iter_distance(&(vec_.as_pointer() as Ptr).begin()); + .iter_distance(&vec_.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - let __a = (vec_.as_pointer() as Ptr).begin().iter_at(__x); - let __b = (vec_.as_pointer() as Ptr).begin().iter_at(__y); + let __a = vec_.as_pointer().decay().begin().iter_at(__x); + let __b = vec_.as_pointer().decay().begin().iter_at(__y); if greater_2.call(__a.clone(), __b.clone()) { std::cmp::Ordering::Less } else if greater_2.call(__b, __a) { @@ -190,19 +192,21 @@ fn main_0() -> i32 { } }); reorder(__order, |__i| { - (vec_.as_pointer() as Ptr).begin().iter_at(__i) + vec_.as_pointer().decay().begin().iter_at(__i) }); }; assert!(({ (*vec_.borrow())[0_usize].v } == 8) && ({ (*vec_.borrow())[3_usize].v } == 1)); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); { - let __n = (vec_.as_pointer() as Ptr) + let __n = vec_ + .as_pointer() + .decay() .end() - .iter_distance(&(vec_.as_pointer() as Ptr).begin()); + .iter_distance(&vec_.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - let __a = (vec_.as_pointer() as Ptr).begin().iter_at(__x); - let __b = (vec_.as_pointer() as Ptr).begin().iter_at(__y); + let __a = vec_.as_pointer().decay().begin().iter_at(__x); + let __b = vec_.as_pointer().decay().begin().iter_at(__y); if FnPtr::, Ptr) -> bool>::new( |a: Ptr, b: Ptr| -> bool { { @@ -228,24 +232,28 @@ fn main_0() -> i32 { } }); reorder(__order, |__i| { - (vec_.as_pointer() as Ptr).begin().iter_at(__i) + vec_.as_pointer().decay().begin().iter_at(__i) }); }; assert!(({ (*vec_.borrow())[0_usize].v } == 1) && ({ (*vec_.borrow())[3_usize].v } == 8)); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); { - let __n = (vec_.as_pointer() as Ptr).end().iter_distance( - &(vec_.as_pointer() as Ptr) - .begin() - .iter_add(1_isize), - ); + let __n = vec_ + .as_pointer() + .decay() + .end() + .iter_distance(&vec_.as_pointer().decay().begin().iter_add(1_isize)); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - let __a = (vec_.as_pointer() as Ptr) + let __a = vec_ + .as_pointer() + .decay() .begin() .iter_add(1_isize) .iter_at(__x); - let __b = (vec_.as_pointer() as Ptr) + let __b = vec_ + .as_pointer() + .decay() .begin() .iter_add(1_isize) .iter_at(__y); @@ -258,7 +266,8 @@ fn main_0() -> i32 { } }); reorder(__order, |__i| { - (vec_.as_pointer() as Ptr) + vec_.as_pointer() + .decay() .begin() .iter_add(1_isize) .iter_at(__i) diff --git a/tests/unit/out/refcount/split_binop_aliased_borrows.rs b/tests/unit/out/refcount/split_binop_aliased_borrows.rs index b60c058ca..dff87f776 100644 --- a/tests/unit/out/refcount/split_binop_aliased_borrows.rs +++ b/tests/unit/out/refcount/split_binop_aliased_borrows.rs @@ -14,7 +14,7 @@ fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::from([1, 2]))); let p: Value> = Rc::new(RefCell::new(v.as_pointer().decay().begin())); let r: Ptr = v.as_pointer().decay().offset(1_usize); - let __rhs = ((r.read()) as i32); + let __rhs = (r.read()); (*p.borrow()).iter_deref().write(__rhs); assert!(({ (*v.borrow())[0_usize] } == 2)); return 0; diff --git a/tests/unit/out/refcount/string.rs b/tests/unit/out/refcount/string.rs index e27f504fd..dd9392010 100644 --- a/tests/unit/out/refcount/string.rs +++ b/tests/unit/out/refcount/string.rs @@ -61,8 +61,8 @@ fn main_0() -> i32 { } assert!((((*s2.borrow()).len() - 1) == 10_usize)); assert!((((*s2.borrow()).len() - 1) == ((*s2.borrow()).len() - 1))); - (*s2.borrow_mut())[0_usize] = (('b' as i8) as i8); - (*s2.borrow_mut())[1_usize] = (('c' as i8) as i8); + (*s2.borrow_mut())[0_usize] = ('b' as i8); + (*s2.borrow_mut())[1_usize] = ('c' as i8); assert!((({ (*s2.borrow())[0_usize] } as i32) == (('b' as i8) as i32))); assert!((({ (*s2.borrow())[1_usize] } as i32) == (('c' as i8) as i32))); let mut i: u32 = 2_u32; @@ -185,8 +185,8 @@ fn main_0() -> i32 { assert!(((string[2_usize] as i32) == (('r' as i8) as i32))); assert!(((string[3_usize] as i32) == 0)); assert!(((string[4_usize] as i32) == 0)); - string[3_usize] = (('a' as i8) as i8); - string[4_usize] = (('b' as i8) as i8); + string[3_usize] = ('a' as i8); + string[4_usize] = ('b' as i8); assert!(((string[3_usize] as i32) == (('a' as i8) as i32))); assert!(((string[4_usize] as i32) == (('b' as i8) as i32))); string[3_usize] = 0_i8; diff --git a/tests/unit/out/refcount/string2.rs b/tests/unit/out/refcount/string2.rs index 6e66e524a..c712c9d97 100644 --- a/tests/unit/out/refcount/string2.rs +++ b/tests/unit/out/refcount/string2.rs @@ -16,7 +16,7 @@ fn main_0() -> i32 { __bytes.push(0); __bytes })); - (*arr.borrow_mut())[1_usize] = (('b' as i8) as i8); + (*arr.borrow_mut())[1_usize] = ('b' as i8); let mut p: Ptr = arr.as_pointer().decay().offset((1) as isize); assert!((((p.read()) as i32) == (('b' as i8) as i32))); assert!( diff --git a/tests/unit/out/refcount/swap_map_no_copy.rs b/tests/unit/out/refcount/swap_map_no_copy.rs index d3b699601..85d2a8d5b 100644 --- a/tests/unit/out/refcount/swap_map_no_copy.rs +++ b/tests/unit/out/refcount/swap_map_no_copy.rs @@ -236,8 +236,8 @@ fn main_0() -> i32 { ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 10 }))); TrackedImpl::move_assign( - &(m1.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + &m1.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( Rc::new(RefCell::new(1)), @@ -247,16 +247,15 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }, - ), + }), _o.as_pointer(), ) }); ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 20 }))); TrackedImpl::move_assign( - &(m1.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + &m1.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( Rc::new(RefCell::new(2)), @@ -266,8 +265,7 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }, - ), + }), _o.as_pointer(), ) }); @@ -275,8 +273,8 @@ fn main_0() -> i32 { ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 30 }))); TrackedImpl::move_assign( - &(m2.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + &m2.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(3.clone(), || { ( Rc::new(RefCell::new(3)), @@ -286,15 +284,14 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }, - ), + }), _o.as_pointer(), ) }); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); cpp_swap!( - (m1.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + m1.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( Rc::new(RefCell::new(1)), @@ -304,10 +301,9 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - } - ), - (m1.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + }), + m1.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( Rc::new(RefCell::new(2)), @@ -317,11 +313,10 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - } - ) + }) ); assert!( - ((m1.as_pointer() as Ptr, Value)>>) + (m1.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -335,7 +330,8 @@ fn main_0() -> i32 { }) .with(|__s| __s.v) == 20) - && ((m1.as_pointer() as Ptr, Value)>>) + && (m1 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -354,7 +350,8 @@ fn main_0() -> i32 { cpp_swap!(m1.as_pointer(), m2.as_pointer()); assert!( ((*m1.borrow()).len() == 1_usize) - && ((m1.as_pointer() as Ptr, Value)>>) + && (m1 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(3.clone(), || { ( @@ -371,7 +368,8 @@ fn main_0() -> i32 { ); assert!( (((*m2.borrow()).len() == 2_usize) - && ((m2.as_pointer() as Ptr, Value)>>) + && (m2 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -385,7 +383,8 @@ fn main_0() -> i32 { }) .with(|__s| __s.v) == 20)) - && ((m2.as_pointer() as Ptr, Value)>>) + && (m2 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -429,8 +428,8 @@ fn main_0() -> i32 { (*vec_.borrow_mut()).push(__init) }; cpp_swap!( - (vec_.as_pointer() as Ptr).offset(0_usize), - (vec_.as_pointer() as Ptr).offset(1_usize) + vec_.as_pointer().decay().offset(0_usize), + vec_.as_pointer().decay().offset(1_usize) ); assert!(({ (*vec_.borrow())[0_usize].v } == 5) && ({ (*vec_.borrow())[1_usize].v } == 4)); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); @@ -500,69 +499,50 @@ fn main_0() -> i32 { )); { let __init = Tracked::new_2({ 1 }); - elem!((grid.as_pointer() as Ptr>), 0_usize) + elem!(grid.as_pointer().decay(), 0_usize) .with_mut(|__v: &mut Vec| __v.push(__init)) }; { let __init = Tracked::new_2({ 2 }); - elem!((grid.as_pointer() as Ptr>), 0_usize) + elem!(grid.as_pointer().decay(), 0_usize) .with_mut(|__v: &mut Vec| __v.push(__init)) }; { let __init = Tracked::new_2({ 3 }); - elem!((grid.as_pointer() as Ptr>), 1_usize) + elem!(grid.as_pointer().decay(), 1_usize) .with_mut(|__v: &mut Vec| __v.push(__init)) }; cpp_swap!( - ((grid.as_pointer() as Ptr>) + grid.as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr) + .decay() .offset(1_usize), - ((grid.as_pointer() as Ptr>) + grid.as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr) + .decay() .offset(0_usize) ); assert!( - (index!( - elem!((grid.as_pointer() as Ptr>), 0_usize), - 1_usize - ) - .with(|__s| __s.v) - == 3) - && (index!( - elem!((grid.as_pointer() as Ptr>), 1_usize), - 0_usize - ) - .with(|__s| __s.v) - == 2) + (index!(elem!(grid.as_pointer().decay(), 0_usize), 1_usize).with(|__s| __s.v) == 3) + && (index!(elem!(grid.as_pointer().decay(), 1_usize), 0_usize).with(|__s| __s.v) == 2) ); cpp_swap!( - (grid.as_pointer() as Ptr>).offset(0_usize), - (grid.as_pointer() as Ptr>).offset(1_usize) + grid.as_pointer().decay().offset(0_usize), + grid.as_pointer().decay().offset(1_usize) ); assert!( - ((*((grid.as_pointer() as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) - .len() - == 1_usize) - && (index!( - elem!((grid.as_pointer() as Ptr>), 0_usize), - 0_usize - ) - .with(|__s| __s.v) - == 2) + ((*grid.as_pointer().decay().offset(0_usize).upgrade().deref()).len() == 1_usize) + && (index!(elem!(grid.as_pointer().decay(), 0_usize), 0_usize).with(|__s| __s.v) == 2) ); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); let maps: Value = Rc::new(RefCell::new(::default())); ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 1 }))); TrackedImpl::move_assign( - &(field_ptr!(maps.as_pointer(), m1) as Ptr, Value)>>) - .with_mut(|__m: &mut Map, Value)>| { + &field_ptr!(maps.as_pointer(), m1).with_mut( + |__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( Rc::new(RefCell::new(1)), @@ -572,15 +552,16 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }), + }, + ), _o.as_pointer(), ) }); ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 2 }))); TrackedImpl::move_assign( - &(field_ptr!(maps.as_pointer(), m2) as Ptr, Value)>>) - .with_mut(|__m: &mut Map, Value)>| { + &field_ptr!(maps.as_pointer(), m2).with_mut( + |__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( Rc::new(RefCell::new(2)), @@ -590,7 +571,8 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }), + }, + ), _o.as_pointer(), ) }); @@ -600,7 +582,7 @@ fn main_0() -> i32 { ); assert!( ((*maps.borrow()).m1.len() == 1_usize) - && ((field_ptr!(maps.as_pointer(), m1) as Ptr, Value)>>) + && (field_ptr!(maps.as_pointer(), m1) .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -617,7 +599,7 @@ fn main_0() -> i32 { ); assert!( ((*maps.borrow()).m2.len() == 1_usize) - && ((field_ptr!(maps.as_pointer(), m2) as Ptr, Value)>>) + && (field_ptr!(maps.as_pointer(), m2) .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -833,7 +815,7 @@ pub trait OwnerImpl { } impl OwnerImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), p) as Ptr>>) + field_ptr!((*self), p) .write(field!(_a0, p).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/unboxed_conditional_iterator.rs b/tests/unit/out/refcount/unboxed_conditional_iterator.rs index 84d9957ea..7d2ecb313 100644 --- a/tests/unit/out/refcount/unboxed_conditional_iterator.rs +++ b/tests/unit/out/refcount/unboxed_conditional_iterator.rs @@ -41,7 +41,7 @@ pub fn lehmer_2(mut sigma: Ptr, mut len: u32, mut code: Ptr) { )); let mut i: u32 = 0_u32; 'loop_: while (i < len) { - let __rhs = (i as u32); + let __rhs = i; (*items.borrow_mut())[(i as usize)] = __rhs; i.prefix_inc(); } diff --git a/tests/unit/out/refcount/unboxed_locals.rs b/tests/unit/out/refcount/unboxed_locals.rs index 8d569ae6e..76b2e4137 100644 --- a/tests/unit/out/refcount/unboxed_locals.rs +++ b/tests/unit/out/refcount/unboxed_locals.rs @@ -136,7 +136,7 @@ fn main_0() -> i32 { let a0_clone = four.clone(); vec_.push(a0_clone) }; - let __rhs = (((vec_[3_usize] as i32) + 1) as i32); + let __rhs = (vec_[3_usize] + 1); vec_[0_usize] = __rhs; vec_[1_usize].postfix_inc(); assert!(((vec_.len() == 4_usize) && (vec_[0_usize] == 5)) && (vec_[1_usize] == 2)); @@ -154,12 +154,7 @@ fn main_0() -> i32 { let by_ref: Value> = Rc::new(RefCell::new(vec![3; 2_usize as usize])); assert!((({ total_2(by_ref.as_pointer(),) }) == 6)); let elem_ptr: Value> = Rc::new(RefCell::new(vec![0; 2_usize as usize])); - ({ - set_0( - (elem_ptr.as_pointer().decay().offset(1_usize)).reinterpret_cast::(), - 7, - ) - }); + ({ set_0((elem_ptr.as_pointer().decay().offset(1_usize)), 7) }); assert!(({ (*elem_ptr.borrow())[1_usize] } == 7)); let data: Value> = Rc::new(RefCell::new(vec![0; 2_usize as usize])); ({ set_0(data.as_pointer().decay(), 8) }); diff --git a/tests/unit/out/refcount/unique_ptr.rs b/tests/unit/out/refcount/unique_ptr.rs index 4f40237f0..71e4d39fc 100644 --- a/tests/unit/out/refcount/unique_ptr.rs +++ b/tests/unit/out/refcount/unique_ptr.rs @@ -32,18 +32,17 @@ 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_pointer().write(1); - (x1.as_pointer() as Ptr>>).write((*x2.borrow_mut()).take()); + x1.as_pointer().write((*x2.borrow_mut()).take()); let mut raw_ptr1: Ptr = ((*x1.borrow()).as_pointer()); raw_ptr1.with_mut(|__v| __v.prefix_inc()); - (field_ptr!(((*safe_ptr.upgrade().deref()).as_pointer()), ptr) as Ptr>>) - .write((*x1.borrow_mut()).take()); + field_ptr!(((*safe_ptr.upgrade().deref()).as_pointer()), ptr).write((*x1.borrow_mut()).take()); ({ SafePointerImpl::inc(&((*safe_ptr.upgrade().deref()).as_pointer())) }); ({ 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_pointer().read()) + ((*x4.borrow()).as_pointer().read())); (*x3.borrow()).as_pointer().write(__rhs); - (x4.as_pointer() as Ptr>>).write((*x3.borrow_mut()).take()); + x4.as_pointer().write((*x3.borrow_mut()).take()); let mut raw_ptr2: Ptr = ((*x4.borrow()).as_pointer()); { raw_ptr2.with_mut(|__v| *__v = *__v + 1) @@ -91,7 +90,7 @@ pub fn RndStuff_2() { .write(1); i.prefix_inc(); } - (x2.as_pointer() as Ptr>>>).write( + x2.as_pointer().write( Ptr::alloc_array((0..200_usize).map(|_| 0_i32).collect::>()).to_owned_opt(), ); let mut i: i32 = 0; @@ -134,7 +133,7 @@ pub fn RndStuff_2() { assert!((elem!(p3_0, i).with(|__s| __s.y) == 12)); i.prefix_inc(); } - (x3.as_pointer() as Ptr>>>).write( + x3.as_pointer().write( Ptr::alloc_array( (0..50_usize) .map(|_| ::default()) @@ -210,7 +209,7 @@ impl SafePointerImpl for Ptr { .with_mut(|__v| __v.prefix_inc()); } fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), ptr) as Ptr>>) + field_ptr!((*self), ptr) .write(field!(_a0, ptr).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/unique_ptr_const_deref.rs b/tests/unit/out/refcount/unique_ptr_const_deref.rs index b50c2c47d..2b200c118 100644 --- a/tests/unit/out/refcount/unique_ptr_const_deref.rs +++ b/tests/unit/out/refcount/unique_ptr_const_deref.rs @@ -32,8 +32,7 @@ pub fn main() { } fn main_0() -> i32 { let h: Value = Rc::new(RefCell::new(::default())); - (field_ptr!(h.as_pointer(), val) as Ptr>>) - .write(Some(Rc::new(RefCell::new(10))).take()); + field_ptr!(h.as_pointer(), val).write(Some(Rc::new(RefCell::new(10))).take()); ({ write_val_1((h.as_pointer()), 42) }); assert!((({ read_val_0((h.as_pointer()),) }) == 42)); return 0; @@ -43,7 +42,7 @@ pub trait HolderImpl { } impl HolderImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), val) as Ptr>>) + field_ptr!((*self), val) .write(field!(_a0, val).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/unique_ptr_field_reset.rs b/tests/unit/out/refcount/unique_ptr_field_reset.rs index 157ed5def..de002f64e 100644 --- a/tests/unit/out/refcount/unique_ptr_field_reset.rs +++ b/tests/unit/out/refcount/unique_ptr_field_reset.rs @@ -39,7 +39,7 @@ fn main_0() -> i32 { let mut hp: Ptr = (h.as_pointer()); { let _p: Ptr<_> = Ptr::alloc(Data { v: 3 }); - (field_ptr!(hp, data) as Ptr>>).write(_p.to_owned_opt()) + field_ptr!(hp, data).write(_p.to_owned_opt()) }; assert!( ({ (*h.borrow()).data.clone() } @@ -74,11 +74,11 @@ impl HolderImpl for Ptr { fn set(&self, mut p: Ptr) { { let _p: Ptr<_> = (p).clone(); - (field_ptr!((*self), data) as Ptr>>).write(_p.to_owned_opt()) + field_ptr!((*self), data).write(_p.to_owned_opt()) }; } fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), data) as Ptr>>) + field_ptr!((*self), data) .write(field!(_a0, data).with_mut(|__v: &mut Option>| __v.take())); field!((*self), n).write({ { (*_a0.upgrade().deref()).n } }); return (*self).clone(); diff --git a/tests/unit/out/refcount/unique_ptr_nested.rs b/tests/unit/out/refcount/unique_ptr_nested.rs index 67f8613d7..0d1d975a7 100644 --- a/tests/unit/out/refcount/unique_ptr_nested.rs +++ b/tests/unit/out/refcount/unique_ptr_nested.rs @@ -61,7 +61,7 @@ pub trait OuterImpl { } impl OuterImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), inner) as Ptr>>) + field_ptr!((*self), inner) .write(field!(_a0, inner).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/vector.rs b/tests/unit/out/refcount/vector.rs index 251d4e389..3a981103c 100644 --- a/tests/unit/out/refcount/vector.rs +++ b/tests/unit/out/refcount/vector.rs @@ -35,8 +35,8 @@ fn main_0() -> i32 { }; assert!((v1.len() == 100_usize)); assert!((v1[99_usize] == 0)); - v1[0_usize] = (40 as i32); - v1[99_usize] = (50 as i32); + v1[0_usize] = 40; + v1[99_usize] = 50; assert!((v1[0_usize] == 40)); assert!((v1[99_usize] == 50)); let v2: Value> = Rc::new(RefCell::new(Vec::new())); @@ -252,7 +252,7 @@ fn main_0() -> i32 { assert!((v4.as_pointer().decay().to_last().read()).is_null()); assert!((v5.as_pointer().decay().to_last().read()).is_null()); assert!(((v6.as_pointer().decay().to_last().read()) == 2_f64)); - let ref0: Ptr = (v6.as_pointer().decay().to_last()).reinterpret_cast::(); + let ref0: Ptr = v6.as_pointer().decay().to_last(); ref0.write(5_f64); assert!(((v6.as_pointer().decay().to_last().read()) == 5_f64)); let mut x0: f64 = (v6.as_pointer().decay().to_last().read()); @@ -274,11 +274,10 @@ fn main_0() -> i32 { .read()) == 5_f64) ); - let ref1: Ptr = (v6 + let ref1: Ptr = v6 .as_pointer() .decay() - .offset((s2).wrapping_sub(1_usize) as isize)) - .reinterpret_cast::(); + .offset((s2).wrapping_sub(1_usize) as isize); { ref1.with_mut(|__v| *__v = *__v + 1.5_f64) }; diff --git a/tests/unit/out/refcount/vector2.rs b/tests/unit/out/refcount/vector2.rs index 898f5bb05..ee6a0c4e0 100644 --- a/tests/unit/out/refcount/vector2.rs +++ b/tests/unit/out/refcount/vector2.rs @@ -27,8 +27,8 @@ pub fn fn_0(v: Ptr>, v3: Vec) { let __a1 = 3; (*v2.borrow_mut()).push(__a1) }; - x = ((index!(v, 2_usize).read()) as i32); - (*v2.borrow_mut())[0_usize] = (1 as i32); + x = (index!(v, 2_usize).read()); + (*v2.borrow_mut())[0_usize] = 1; elem!( (if true { (Ptr::>::decay(&(v3.as_pointer()))) @@ -37,9 +37,9 @@ pub fn fn_0(v: Ptr>, v3: Vec) { }), 0_usize ) - .write((7 as i32)); + .write(7); v2.as_pointer().write((*v.upgrade().deref()).clone()); - index!(v4, 1_usize).write((13 as i32)); + index!(v4, 1_usize).write(13); assert!((x == 6)); assert!(((v.decay().read()) == 4)); assert!(((index!(v, 1_usize).read()) == 5)); diff --git a/tests/unit/out/refcount/vector3.rs b/tests/unit/out/refcount/vector3.rs index f571df0d5..2cede07ce 100644 --- a/tests/unit/out/refcount/vector3.rs +++ b/tests/unit/out/refcount/vector3.rs @@ -18,15 +18,17 @@ fn main_0() -> i32 { }; { let __a0 = 2_usize as usize; - (*v.borrow_mut())[0_usize].resize_with(__a0, || ::default()) + elem!(v.as_pointer().decay(), 0_usize) + .with_mut(|__v: &mut Vec| __v.resize_with(__a0, || ::default())) }; { let __a0 = 1_usize as usize; - (*v.borrow_mut())[1_usize].resize_with(__a0, || ::default()) + elem!(v.as_pointer().decay(), 1_usize) + .with_mut(|__v: &mut Vec| __v.resize_with(__a0, || ::default())) }; - elem!(v.as_pointer().decay().offset(0_usize), 0_usize).write((1 as i32)); - elem!(v.as_pointer().decay().offset(0_usize), 1_usize).write((5 as i32)); - elem!(v.as_pointer().decay().offset(1_usize), 0_usize).write((6 as i32)); + index!(elem!(v.as_pointer().decay(), 0_usize), 0_usize).write(1); + index!(elem!(v.as_pointer().decay(), 0_usize), 1_usize).write(5); + index!(elem!(v.as_pointer().decay(), 1_usize), 0_usize).write(6); 'loop_: for v2 in IterRange::new(v.as_pointer().decay().begin(), v.as_pointer().decay().end()) { let v2: Ptr> = v2.iter_deref(); 'loop_: for i in IterRange::new(v2.decay().begin(), v2.decay().end()) { diff --git a/tests/unit/out/refcount/vector_deque_vector_string.rs b/tests/unit/out/refcount/vector_deque_vector_string.rs index dc1222c49..334c682fe 100644 --- a/tests/unit/out/refcount/vector_deque_vector_string.rs +++ b/tests/unit/out/refcount/vector_deque_vector_string.rs @@ -37,7 +37,7 @@ fn main_0() -> i32 { }; (*row.borrow_mut()).push(__a1) }; - elem!((v.as_pointer() as Ptr>>>), 0_usize) + elem!(v.as_pointer().decay(), 0_usize) .with_mut(|__v: &mut Vec>>| __v.push((*row.borrow()).clone())); { let __a1 = { @@ -47,119 +47,92 @@ fn main_0() -> i32 { }; (*row.borrow_mut()).push(__a1) }; - elem!((v.as_pointer() as Ptr>>>), 1_usize) + elem!(v.as_pointer().decay(), 1_usize) .with_mut(|__v: &mut Vec>>| __v.push((*row.borrow()).clone())); { let __init = Vec::new(); - elem!((v.as_pointer() as Ptr>>>), 1_usize) + elem!(v.as_pointer().decay(), 1_usize) .with_mut(|__v: &mut Vec>>| __v.push(__init)) }; { let __a1 = { - let mut r = (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(1_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) - .clone(); + let mut r = + (*Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).decay())) + .offset(1_usize) + .upgrade() + .deref()) + .clone(); r.pop(); Ptr::::from_string_literal(b"x").with_c_str(|__s| r.extend_from_slice(__s)); r.push(0); r }; - ((v.as_pointer() as Ptr>>>) + v.as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr>>) + .decay() .to_last() .with_mut(|__v: &mut Vec>| __v.push(__a1)) }; assert!( - ((*((v.as_pointer() as Ptr>>>) + ((*v.as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr>>) + .decay() .upgrade() .deref()) .len() == 2_usize) ); assert!( - ((*((v.as_pointer() as Ptr>>>) + ((*v.as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr>>) + .decay() .upgrade() .deref()) .len() == 3_usize) && (Ptr::::from_string_literal(b"def").with_c_str(|__s| { - (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(2_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) + (*Ptr::>>::decay(&(v.as_pointer().decay().offset(1_usize).decay())) .offset(2_usize) - .as_pointer() as Ptr>) .upgrade() - .deref()) + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(1_usize).decay()), + ) + .offset(2_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s })) ); assert!(Ptr::::from_string_literal(b"bcx").with_c_str(|__s| { - (*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>) - .to_last()), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>) - .to_last()), - ) as Ptr>) + (*Ptr::>>::decay(&(v.as_pointer().decay().offset(1_usize).decay().to_last())) .offset(0_usize) - .as_pointer() as Ptr>) .upgrade() - .deref()) + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(1_usize).decay().to_last()), + ) + .offset(0_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s })); let copy: Value>>>> = Rc::new(RefCell::new((*v.borrow()).clone())); - ((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(0_usize) as Ptr>) + Ptr::>>::decay(&(copy.as_pointer().decay().offset(0_usize).decay())) + .offset(0_usize) .write({ let mut __bytes = Ptr::::from_string_literal(b"z").to_c_bytes(); __bytes.push(0); __bytes }); if 0_usize as usize - >= (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(1_usize) as Ptr>) + >= (*Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).decay())) + .offset(1_usize) .upgrade() .deref()) .len() @@ -167,134 +140,95 @@ fn main_0() -> i32 { { panic!("out of bounds access") } else { - ((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(1_usize) as Ptr>) + Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).decay())) + .offset(1_usize) .decay() .offset(0_usize as isize) } .write(('B' as i8)); assert!( - (Ptr::::from_string_literal(b"a").with_c_str(|__s| (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>) - ) as Ptr>) - .offset(0_usize) - .as_pointer() - as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>) - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + (Ptr::::from_string_literal(b"a").with_c_str(|__s| (*Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).decay()) + ) + .offset(0_usize) + .upgrade() + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).decay()) + ) + .offset(0_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s)) - && (Ptr::::from_string_literal(b"z").with_c_str(|__s| { - (*((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + && (Ptr::::from_string_literal(b"z").with_c_str( + |__s| (*Ptr::>>::decay( + &(copy.as_pointer().decay().offset(0_usize).decay()) + ) + .offset(0_usize) + .upgrade() + .deref())[..(*Ptr::>>::decay( + &(copy.as_pointer().decay().offset(0_usize).decay()) + ) + .offset(0_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s - })) + )) ); assert!( - (Ptr::::from_string_literal(b"Bc").with_c_str(|__s| (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>) - ) as Ptr>) - .offset(1_usize) - .as_pointer() - as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>) - ) as Ptr>) - .offset(1_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + (Ptr::::from_string_literal(b"Bc").with_c_str(|__s| (*Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).decay()) + ) + .offset(1_usize) + .upgrade() + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).decay()) + ) + .offset(1_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s)) && (Ptr::::from_string_literal(b"bc").with_c_str(|__s| { - (*((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(1_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) + (*Ptr::>>::decay(&(copy.as_pointer().decay().offset(0_usize).decay())) .offset(1_usize) - .as_pointer() as Ptr>) .upgrade() - .deref()) + .deref())[..(*Ptr::>>::decay( + &(copy.as_pointer().decay().offset(0_usize).decay()), + ) + .offset(1_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s })) ); - elem!((v.as_pointer() as Ptr>>>), 1_usize) - .with_mut(|__v: &mut Vec>>| __v.remove(0)); + elem!(v.as_pointer().decay(), 1_usize).with_mut(|__v: &mut Vec>>| __v.remove(0)); assert!(Ptr::::from_string_literal(b"bcx").with_c_str(|__s| { - (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) + (*Ptr::>>::decay(&(v.as_pointer().decay().offset(1_usize).decay())) .offset(0_usize) - .as_pointer() as Ptr>) .upgrade() - .deref()) + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(1_usize).decay()), + ) + .offset(0_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s })); assert!( - ((*((copy.as_pointer() as Ptr>>>) + ((*copy + .as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr>>) + .decay() .upgrade() .deref()) .len() diff --git a/tests/unit/out/refcount/vector_subscript_borrow.rs b/tests/unit/out/refcount/vector_subscript_borrow.rs index 7a068b2a0..72499bfd6 100644 --- a/tests/unit/out/refcount/vector_subscript_borrow.rs +++ b/tests/unit/out/refcount/vector_subscript_borrow.rs @@ -11,7 +11,7 @@ thread_local!( ); pub fn bump_1(mut v: Ptr>, mut x: i32) -> i32 { { - let __rhs = (x as i32); + let __rhs = x; index!(v, 0_usize).with_mut(|__v| *__v = *__v + __rhs) }; return (*next_0.with(Value::clone).borrow_mut()).postfix_inc(); @@ -27,7 +27,7 @@ fn main_0() -> i32 { .collect::>(); let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < items.len()) { - let __rhs = ((i).wrapping_mul(2_u32) as u32); + let __rhs = (i).wrapping_mul(2_u32); items[(i as usize)] = __rhs; i.prefix_inc(); } @@ -41,27 +41,27 @@ fn main_0() -> i32 { v.as_pointer().decay(), ({ (*v.borrow())[0_usize] } as usize) ) - .write((3 as i32)); - let __rhs = ((({ (*v.borrow())[1_usize] } as i32) + 4) as i32); + .write(3); + let __rhs = ({ (*v.borrow())[1_usize] } + 4); elem!( v.as_pointer().decay(), ({ (*v.borrow())[1_usize] } as usize) ) .write(__rhs); assert!(({ (*v.borrow())[1_usize] } == 3) && ({ (*v.borrow())[3_usize] } == 7)); - let mut p: Ptr = (v.as_pointer().decay().offset(0_usize)).reinterpret_cast::(); - elem!(v.as_pointer().decay(), ((p.read()) as usize)).write((9 as i32)); + let mut p: Ptr = (v.as_pointer().decay().offset(0_usize)); + elem!(v.as_pointer().decay(), ((p.read()) as usize)).write(9); assert!(({ (*v.borrow())[1_usize] } == 9)); elem!( v.as_pointer().decay(), (({ bump_1((v.as_pointer()), 10,) }) as usize) ) - .write((2 as i32)); + .write(2); assert!(({ (*v.borrow())[0_usize] } == 2)); assert!( (({ let _v: Ptr> = (v.as_pointer()); - let _x: i32 = ({ (*v.borrow())[2_usize] } as i32); + let _x: i32 = { (*v.borrow())[2_usize] }; bump_1(_v, _x) }) == 1) && ({ (*v.borrow())[0_usize] } == 3) diff --git a/tests/unit/out/refcount/vector_subscript_direct.rs b/tests/unit/out/refcount/vector_subscript_direct.rs index 72338c52e..3bb1e60cf 100644 --- a/tests/unit/out/refcount/vector_subscript_direct.rs +++ b/tests/unit/out/refcount/vector_subscript_direct.rs @@ -35,7 +35,7 @@ pub fn sum_ref_1(v: Ptr>) -> i32 { let mut s: i32 = 0; let mut i: usize = 0_usize; 'loop_: while ({ i } < { (*v.upgrade().deref()).len() }) { - s += ((index!(v, i).read()) as i32); + s += (index!(v, i).read()); i.prefix_inc(); } return s; @@ -46,15 +46,15 @@ pub fn main() { } fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::from([1, 2, 3]))); - (*v.borrow_mut())[0_usize] = (10 as i32); + (*v.borrow_mut())[0_usize] = 10; assert!(({ (*v.borrow())[0_usize] } == 10)); - (*v.borrow_mut())[1_usize] += (5 as i32); + (*v.borrow_mut())[1_usize] += 5; (*v.borrow_mut())[2_usize].postfix_inc(); assert!(({ (*v.borrow())[1_usize] } == 7) && ({ (*v.borrow())[2_usize] } == 4)); let __rhs = { (*v.borrow())[1_usize] }; (*v.borrow_mut())[0_usize] = __rhs; assert!(({ (*v.borrow())[0_usize] } == 7)); - (*v.borrow_mut())[1_usize] = (0 as i32); + (*v.borrow_mut())[1_usize] = 0; assert!( ((elem!( v.as_pointer().decay(), @@ -64,7 +64,7 @@ fn main_0() -> i32 { == 7) ); let mut i: i32 = 0; - elem!(v.as_pointer().decay(), (i.postfix_inc() as usize)).write((3 as i32)); + elem!(v.as_pointer().decay(), (i.postfix_inc() as usize)).write(3); assert!((i == 1) && ({ (*v.borrow())[0_usize] } == 3)); assert!( ((elem!( @@ -78,9 +78,9 @@ fn main_0() -> i32 { v.as_pointer().decay(), (({ push_and_index_0(v.as_pointer(),) }) as usize) ) - .write((5 as i32)); + .write(5); assert!(((*v.borrow()).len() == 5_usize) && ({ (*v.borrow())[4_usize] } == 5)); - let mut p: Ptr = (v.as_pointer().decay().offset(2_usize)).reinterpret_cast::(); + let mut p: Ptr = (v.as_pointer().decay().offset(2_usize)); p.write(9); assert!(({ (*v.borrow())[2_usize] } == 9)); assert!((({ sum_ref_1(v.as_pointer(),) }) == ((((3 + 0) + 9) + 42) + 5))); @@ -91,7 +91,7 @@ fn main_0() -> i32 { .values .resize_with(__a0, || ::default()) }; - vec_elem!(h.as_pointer(), values, 1_usize).write((6 as i32)); + vec_elem!(h.as_pointer(), values, 1_usize).write(6); { let __a1 = Point { x: 1, y: 2 }; (*h.borrow_mut()).points.push(__a1) @@ -109,9 +109,9 @@ fn main_0() -> i32 { }) == 6) ); let mut hp: Ptr = (h.as_pointer()); - let __rhs = ((((vec_elem!(hp, values, 1_usize).read()) as i32) + 1) as i32); + let __rhs = ((vec_elem!(hp, values, 1_usize).read()) + 1); vec_elem!(hp, values, 0_usize).write(__rhs); - let __rhs = ((vec_elem!(hp, values, 0_usize).read()) as i32); + let __rhs = (vec_elem!(hp, values, 0_usize).read()); field!(vec_elem!(hp, points, 0_usize), x).write(__rhs); assert!( ((vec_elem!(h.as_pointer(), values, 0_usize).read()) == 7) @@ -129,21 +129,21 @@ fn main_0() -> i32 { let __a1 = vec![0; 3_usize as usize]; (*grid.borrow_mut()).push(__a1) }; - elem!(grid.as_pointer().decay().offset(1_usize), 2_usize).write((8 as i32)); + index!(elem!(grid.as_pointer().decay(), 1_usize), 2_usize).write(8); assert!( - ((elem!(grid.as_pointer().decay().offset(1_usize), 2_usize).read()) == 8) - && ((elem!(grid.as_pointer().decay().offset(0_usize), 2_usize).read()) == 0) + ((index!(elem!(grid.as_pointer().decay(), 1_usize), 2_usize).read()) == 8) + && ((index!(elem!(grid.as_pointer().decay(), 0_usize), 2_usize).read()) == 0) ); - let __rhs = (elem!(grid.as_pointer().decay().offset(1_usize), 2_usize).read()); - elem!(grid.as_pointer().decay().offset(0_usize), 1_usize).write(__rhs); - let __rhs = (elem!(grid.as_pointer().decay().offset(0_usize), 1_usize).read()); + let __rhs = (index!(elem!(grid.as_pointer().decay(), 1_usize), 2_usize).read()); + index!(elem!(grid.as_pointer().decay(), 0_usize), 1_usize).write(__rhs); + let __rhs = (index!(elem!(grid.as_pointer().decay(), 0_usize), 1_usize).read()); { - elem!(grid.as_pointer().decay().offset(1_usize), 0_usize) + index!(elem!(grid.as_pointer().decay(), 1_usize), 0_usize) .with_mut(|__v| *__v = *__v + __rhs) }; assert!( - ((elem!(grid.as_pointer().decay().offset(0_usize), 1_usize).read()) == 8) - && ((elem!(grid.as_pointer().decay().offset(1_usize), 0_usize).read()) == 8) + ((index!(elem!(grid.as_pointer().decay(), 0_usize), 1_usize).read()) == 8) + && ((index!(elem!(grid.as_pointer().decay(), 1_usize), 0_usize).read()) == 8) ); let a: Value> = Rc::new(RefCell::new(Vec::from([4, 5, 6]))); let __rhs = ({ (*a.borrow())[0_usize] } + { (*a.borrow())[2_usize] }); diff --git a/tests/unit/out/refcount/vector_with_allocator.rs b/tests/unit/out/refcount/vector_with_allocator.rs index a423f8cda..9ca0b0f17 100644 --- a/tests/unit/out/refcount/vector_with_allocator.rs +++ b/tests/unit/out/refcount/vector_with_allocator.rs @@ -34,8 +34,8 @@ pub fn fn_1(v: Ptr>, v3: Vec) { let __a1 = 3; v2.push(__a1) }; - x = ((index!(v, 2_usize).read()) as i32); - v2[0_usize] = (1 as i32); + x = (index!(v, 2_usize).read()); + v2[0_usize] = 1; elem!( (if true { (Ptr::>::decay(&(v3.as_pointer()))) @@ -44,8 +44,8 @@ pub fn fn_1(v: Ptr>, v3: Vec) { }), 0_usize ) - .write((7 as i32)); - index!(v4, 1_usize).write((13 as i32)); + .write(7); + index!(v4, 1_usize).write(13); assert!((x == 6)); assert!(((v.decay().read()) == 4)); assert!(((index!(v, 1_usize).read()) == 5)); @@ -80,8 +80,8 @@ fn main_0() -> i32 { }; assert!((v1.len() == 100_usize)); assert!((v1[99_usize] == 0)); - v1[0_usize] = (40 as i32); - v1[99_usize] = (50 as i32); + v1[0_usize] = 40; + v1[99_usize] = 50; assert!((v1[0_usize] == 40)); assert!((v1[99_usize] == 50)); let v2: Value> = Rc::new(RefCell::new(Vec::new())); @@ -176,7 +176,7 @@ fn main_0() -> i32 { assert!(((v2.as_pointer().decay().to_last().read()) == 3)); assert!(((v3.as_pointer().decay().to_last().read()) == 1)); assert!(((v6.as_pointer().decay().to_last().read()) == 2_f64)); - let ref0: Ptr = (v6.as_pointer().decay().to_last()).reinterpret_cast::(); + let ref0: Ptr = v6.as_pointer().decay().to_last(); ref0.write(5_f64); assert!(((v6.as_pointer().decay().to_last().read()) == 5_f64)); let mut x0: f64 = (v6.as_pointer().decay().to_last().read()); @@ -198,11 +198,10 @@ fn main_0() -> i32 { .read()) == 5_f64) ); - let ref1: Ptr = (v6 + let ref1: Ptr = v6 .as_pointer() .decay() - .offset((s2).wrapping_sub(1_usize) as isize)) - .reinterpret_cast::(); + .offset((s2).wrapping_sub(1_usize) as isize); { ref1.with_mut(|__v| *__v = *__v + 1.5_f64) }; diff --git a/tests/unit/out/refcount/void_cast.rs b/tests/unit/out/refcount/void_cast.rs index 33d538629..c4c198b8f 100644 --- a/tests/unit/out/refcount/void_cast.rs +++ b/tests/unit/out/refcount/void_cast.rs @@ -130,7 +130,7 @@ pub trait NonCopyableImpl { } impl NonCopyableImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), value) as Ptr>>) + field_ptr!((*self), value) .write(field!(_a0, value).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/void_return.rs b/tests/unit/out/refcount/void_return.rs index 7a2916348..0a3c00117 100644 --- a/tests/unit/out/refcount/void_return.rs +++ b/tests/unit/out/refcount/void_return.rs @@ -46,8 +46,8 @@ pub fn main() { fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::from([1, 3, 0, 2, 8, 7]))); ({ - let _first: RandomAccessIterator = (v.as_pointer() as Ptr).begin(); - let _last: RandomAccessIterator = (v.as_pointer() as Ptr).end(); + let _first: RandomAccessIterator = v.as_pointer().decay().begin(); + let _last: RandomAccessIterator = v.as_pointer().decay().end(); f1_0(_first, _last) }); let a: Value> = Rc::new(RefCell::new(Box::new([1, 2, 3]))); diff --git a/tests/unit/out/unsafe/class_templates.rs b/tests/unit/out/unsafe/class_templates.rs index 0de6550ba..070681fcf 100644 --- a/tests/unit/out/unsafe/class_templates.rs +++ b/tests/unit/out/unsafe/class_templates.rs @@ -19,7 +19,7 @@ impl MyContainer_int_ { return self.vec_.len(); } pub unsafe fn back_4(&mut self) -> *mut i32 { - return (((self.vec_).last_mut().unwrap()) as *mut i32).cast::(); + return ((self.vec_).last_mut().unwrap()); } pub unsafe fn pop_back(&mut self) { self.vec_.pop(); @@ -45,7 +45,7 @@ impl MyContainer_char_ { return self.vec_.len(); } pub unsafe fn back_4(&mut self) -> *mut libc::c_char { - return (((self.vec_).last_mut().unwrap()) as *mut libc::c_char).cast::(); + return ((self.vec_).last_mut().unwrap()); } pub unsafe fn pop_back(&mut self) { self.vec_.pop(); @@ -71,7 +71,7 @@ impl MyContainer_float_ { return self.vec_.len(); } pub unsafe fn back_4(&mut self) -> *mut f32 { - return (((self.vec_).last_mut().unwrap()) as *mut f32).cast::(); + return ((self.vec_).last_mut().unwrap()); } pub unsafe fn pop_back(&mut self) { self.vec_.pop(); diff --git a/tests/unit/out/unsafe/compound_assign_ref.rs b/tests/unit/out/unsafe/compound_assign_ref.rs index 1d28aeb93..10ef93fbf 100644 --- a/tests/unit/out/unsafe/compound_assign_ref.rs +++ b/tests/unit/out/unsafe/compound_assign_ref.rs @@ -18,7 +18,7 @@ unsafe fn main_0() -> i32 { let __a1 = 10; v.push(__a1) }; - (*((v).first_mut().unwrap())) += (5 as i32); + (*((v).first_mut().unwrap())) += 5; assert!(((*((v).first_mut().unwrap())) == (15))); return 0; } diff --git a/tests/unit/out/unsafe/implicit_autoref.rs b/tests/unit/out/unsafe/implicit_autoref.rs index 1cbd318fb..c22119465 100644 --- a/tests/unit/out/unsafe/implicit_autoref.rs +++ b/tests/unit/out/unsafe/implicit_autoref.rs @@ -31,8 +31,8 @@ unsafe fn main_0() -> i32 { v.push(__a1) }; let mut p: *mut Vec = (&mut v as *mut Vec); - let mut a: i32 = ((&mut (*p))[(0_usize)] as i32); - (&mut (*p))[(1_usize)] = (30 as i32); + let mut a: i32 = (&mut (*p))[(0_usize)]; + (&mut (*p))[(1_usize)] = 30; let mut h: Holder = ::default(); { let __a1 = 40; @@ -43,17 +43,13 @@ unsafe fn main_0() -> i32 { h.v.push(__a1) }; let mut hp: *mut Holder = (&mut h as *mut Holder); - let mut b: i32 = ((&mut (*hp)).v[(0_usize)] as i32); - (&mut (*hp)).v[(1_usize)] = (60 as i32); + let mut b: i32 = (&mut (*hp)).v[(0_usize)]; + (&mut (*hp)).v[(1_usize)] = 60; assert!(((a) == (10))); assert!((((&mut (*p))[(1_usize)]) == (30))); assert!(((b) == (40))); assert!((((&mut (*hp)).v[(1_usize)]) == (60))); - (unsafe { - write_through_0( - ((&mut (&mut (*p))[0_usize as usize] as *mut i32) as *mut i32).cast::(), - ) - }); + (unsafe { write_through_0((&mut (&mut (*p))[0_usize as usize] as *mut i32)) }); assert!((((&mut (*p))[(0_usize)]) == (42))); return 0; } diff --git a/tests/unit/out/unsafe/inet_pton_ntop.rs b/tests/unit/out/unsafe/inet_pton_ntop.rs index a3e651dfb..c154e3be5 100644 --- a/tests/unit/out/unsafe/inet_pton_ntop.rs +++ b/tests/unit/out/unsafe/inet_pton_ntop.rs @@ -220,7 +220,7 @@ unsafe fn main_0() -> i32 { libc::AF_INET, (four.as_mut_ptr() as *const ::libc::c_void), text.as_mut_ptr(), - (::std::mem::size_of::<[libc::c_char; 64]>() as u32), + (::std::mem::size_of::<[libc::c_char; 64]>() as libc::socklen_t), ) }, (c"10.0.0.1".as_ptr().cast_mut()).cast_const() @@ -247,7 +247,7 @@ unsafe fn main_0() -> i32 { libc::AF_INET6, (sixteen.as_mut_ptr() as *const ::libc::c_void), text.as_mut_ptr(), - (::std::mem::size_of::<[libc::c_char; 64]>() as u32), + (::std::mem::size_of::<[libc::c_char; 64]>() as libc::socklen_t), ) }, (c"::1".as_ptr().cast_mut()).cast_const() @@ -268,7 +268,7 @@ unsafe fn main_0() -> i32 { libc::AF_INET, (four.as_mut_ptr() as *const ::libc::c_void), text.as_mut_ptr(), - 4_u32, + (4 as libc::socklen_t), ) }) .is_null()) as i32) diff --git a/tests/unit/out/unsafe/inline_container_fields.rs b/tests/unit/out/unsafe/inline_container_fields.rs index ae48a61ef..3a57f69b3 100644 --- a/tests/unit/out/unsafe/inline_container_fields.rs +++ b/tests/unit/out/unsafe/inline_container_fields.rs @@ -92,8 +92,7 @@ unsafe fn main_0() -> i32 { assert!(((s.arr[(1_usize)]) == (7))); let mut e: *mut Elem = (&mut s.elems[(2_usize)] as *mut Elem); let mut h: *mut i32 = (*e).hist.as_mut_ptr(); - let mut c: *mut i16 = - ((&mut (&mut (*e)).coeffs[(1_usize)] as *mut i16) as *mut i16).cast::(); + let mut c: *mut i16 = (&mut (&mut (*e)).coeffs[(1_usize)] as *mut i16); let mut id: *mut i32 = (&mut s.elems[(1_usize)].id as *mut i32); let mut k: i32 = 0; 'loop_: while ((k) < (4)) { @@ -112,14 +111,13 @@ unsafe fn main_0() -> i32 { && ((h.offset((3) as isize)) == (&mut s.elems[(2_usize)].hist[(3) as usize] as *mut i32)) ); - let mut row: *mut i32 = - ((&mut s.rows[(0_usize)][(0_usize)] as *mut i32) as *mut i32).cast::(); + let mut row: *mut i32 = (&mut s.rows[(0_usize)][(0_usize)] as *mut i32); (*row.offset((2) as isize)) = 9; assert!(((s.rows[(0_usize)][(2_usize)]) == (9))); let mut t: State = s.clone(); t.elems[(2_usize)].hist[(0) as usize] = 100; t.grid[(0) as usize][(0) as usize] = 100; - t.rows[(0_usize)][(0_usize)] = (100 as i32); + t.rows[(0_usize)][(0_usize)] = 100; assert!( (((s.elems[(2_usize)].hist[(0) as usize]) == (0)) && ((s.grid[(0) as usize][(0) as usize]) == (0))) diff --git a/tests/unit/out/unsafe/ret_rvalue_ref.rs b/tests/unit/out/unsafe/ret_rvalue_ref.rs index be52d4d9a..23d35d1a3 100644 --- a/tests/unit/out/unsafe/ret_rvalue_ref.rs +++ b/tests/unit/out/unsafe/ret_rvalue_ref.rs @@ -19,7 +19,7 @@ unsafe fn main_0() -> i32 { let mut __tmp_0: i32 = 5; let i2: *mut i32 = &mut __tmp_0; assert!(((*i2) == (5))); - let mut i3: i32 = (unsafe { foo_0((i2 as *mut i32).cast::()) }); + let mut i3: i32 = (unsafe { foo_0(i2) }); assert!(((i3) == (5))); assert!( ((unsafe { diff --git a/tests/unit/out/unsafe/rvalue_ref_general.rs b/tests/unit/out/unsafe/rvalue_ref_general.rs index 137488980..29b9610e8 100644 --- a/tests/unit/out/unsafe/rvalue_ref_general.rs +++ b/tests/unit/out/unsafe/rvalue_ref_general.rs @@ -14,7 +14,7 @@ pub fn main() { } unsafe fn main_0() -> i32 { let mut i1: i32 = 3; - let mut i2: i32 = (i1 as i32); + let mut i2: i32 = i1; assert!(((i1) == (3))); assert!(((i2) == (3))); let mut __tmp_0: i32 = 40; @@ -31,7 +31,7 @@ unsafe fn main_0() -> i32 { assert!(((*i6) == (*i3))); assert!(((*i7) == (*i4))); let mut i8: i32 = 3; - let i9: *mut i32 = &mut *(&raw mut i8).cast::(); + let i9: *mut i32 = &mut i8; assert!(((*i9) == (3))); let mut p1: *mut i32 = (&mut i1 as *mut i32); let mut p2: *mut i32 = (i3); diff --git a/tests/unit/out/unsafe/split_binop_aliased_borrows.rs b/tests/unit/out/unsafe/split_binop_aliased_borrows.rs index 8ad55ccfb..e296ab901 100644 --- a/tests/unit/out/unsafe/split_binop_aliased_borrows.rs +++ b/tests/unit/out/unsafe/split_binop_aliased_borrows.rs @@ -16,7 +16,7 @@ unsafe fn main_0() -> i32 { let mut v: Vec = Vec::from([1, 2]); let mut p: UnsafeRandomAccessIterator = v.begin(); let r: *const i32 = &v[(1_usize)]; - (*p.iter_deref()) = ((*r) as i32); + (*p.iter_deref()) = (*r); assert!(((v[(0_usize)]) == (2))); return 0; } diff --git a/tests/unit/out/unsafe/string.rs b/tests/unit/out/unsafe/string.rs index 4b702b0c7..eb2fe255e 100644 --- a/tests/unit/out/unsafe/string.rs +++ b/tests/unit/out/unsafe/string.rs @@ -69,8 +69,8 @@ unsafe fn main_0() -> i32 { } assert!(((s2.len() - 1) == (10_usize))); assert!(((s2.len() - 1) == (s2.len() - 1))); - s2[(0_usize)] = (('b' as libc::c_char) as libc::c_char); - s2[(1_usize)] = (('c' as libc::c_char) as libc::c_char); + s2[(0_usize)] = ('b' as libc::c_char); + s2[(1_usize)] = ('c' as libc::c_char); assert!(((s2[(0_usize)] as i32) == (('b' as libc::c_char) as i32))); assert!(((s2[(1_usize)] as i32) == (('c' as libc::c_char) as i32))); let mut i: u32 = 2_u32; @@ -196,8 +196,8 @@ unsafe fn main_0() -> i32 { assert!(((string[(2_usize)] as i32) == (('r' as libc::c_char) as i32))); assert!(((string[(3_usize)] as i32) == (0))); assert!(((string[(4_usize)] as i32) == (0))); - string[(3_usize)] = (('a' as libc::c_char) as libc::c_char); - string[(4_usize)] = (('b' as libc::c_char) as libc::c_char); + string[(3_usize)] = ('a' as libc::c_char); + string[(4_usize)] = ('b' as libc::c_char); assert!(((string[(3_usize)] as i32) == (('a' as libc::c_char) as i32))); assert!(((string[(4_usize)] as i32) == (('b' as libc::c_char) as i32))); string[(3_usize)] = (0 as libc::c_char); diff --git a/tests/unit/out/unsafe/string2.rs b/tests/unit/out/unsafe/string2.rs index 7e61c0729..1bba415ce 100644 --- a/tests/unit/out/unsafe/string2.rs +++ b/tests/unit/out/unsafe/string2.rs @@ -17,7 +17,7 @@ unsafe fn main_0() -> i32 { let s = c"foo".as_ptr(); std::slice::from_raw_parts(s, (0..).take_while(|&i| *s.add(i) != 0).count() + 1).to_vec() }; - arr[(1_usize)] = (('b' as libc::c_char) as libc::c_char); + arr[(1_usize)] = ('b' as libc::c_char); let mut p: *const libc::c_char = arr.as_ptr().offset((1) as isize); assert!((((*p) as i32) == (('b' as libc::c_char) as i32))); assert!( diff --git a/tests/unit/out/unsafe/sys_stat.rs b/tests/unit/out/unsafe/sys_stat.rs index e77e7f74f..70e8de135 100644 --- a/tests/unit/out/unsafe/sys_stat.rs +++ b/tests/unit/out/unsafe/sys_stat.rs @@ -48,14 +48,18 @@ pub unsafe fn test_st_mtime_access_2() { (*(&mut st as *mut ::libc::stat)).st_mtime.postfix_inc(); (*(sp as *mut ::libc::stat)).st_mtime.prefix_inc(); assert!((((((*(&mut st as *mut ::libc::stat)).st_mtime) == (9_i64)) as i32) != 0)); - let mut mtime: *mut i64 = (&mut (*(&mut st as *mut ::libc::stat)).st_mtime as *mut i64); - (*mtime) = 10_i64; + let mut mtime: *mut ::libc::time_t = ((&mut (*(&mut st as *mut ::libc::stat)).st_mtime + as *mut i64) as *mut i64) + .cast::<::libc::time_t>(); + (*mtime) = (10 as ::libc::time_t); assert!((((((*(&mut st as *mut ::libc::stat)).st_mtime) == (10_i64)) as i32) != 0)); - let mut mtime_via_ptr: *mut i64 = (&mut (*(sp as *mut ::libc::stat)).st_mtime as *mut i64); - (*mtime_via_ptr) = 11_i64; - assert!(((((*mtime) == (11_i64)) as i32) != 0)); - let mut copy: i64 = (*(sp as *mut ::libc::stat)).st_mtime; - assert!(((((copy) == (11_i64)) as i32) != 0)); + let mut mtime_via_ptr: *mut ::libc::time_t = ((&mut (*(sp as *mut ::libc::stat)).st_mtime + as *mut i64) as *mut i64) + .cast::<::libc::time_t>(); + (*mtime_via_ptr) = (11 as ::libc::time_t); + assert!(((((*mtime) == (11 as ::libc::time_t)) as i32) != 0)); + let mut copy: ::libc::time_t = ((*(sp as *mut ::libc::stat)).st_mtime as ::libc::time_t); + assert!(((((copy) == (11 as ::libc::time_t)) as i32) != 0)); } pub fn main() { unsafe { diff --git a/tests/unit/out/unsafe/unboxed_conditional_iterator.rs b/tests/unit/out/unsafe/unboxed_conditional_iterator.rs index 2107af1c6..605aa1c22 100644 --- a/tests/unit/out/unsafe/unboxed_conditional_iterator.rs +++ b/tests/unit/out/unsafe/unboxed_conditional_iterator.rs @@ -38,7 +38,7 @@ pub unsafe fn lehmer_2(mut sigma: *const u32, mut len: u32, mut code: *mut u32) .collect::>(); let mut i: u32 = 0_u32; 'loop_: while ((i) < (len)) { - items[(i as usize)] = (i as u32); + items[(i as usize)] = i; i.prefix_inc(); } let mut i: u32 = 0_u32; diff --git a/tests/unit/out/unsafe/unboxed_locals.rs b/tests/unit/out/unsafe/unboxed_locals.rs index d9e982833..66905320f 100644 --- a/tests/unit/out/unsafe/unboxed_locals.rs +++ b/tests/unit/out/unsafe/unboxed_locals.rs @@ -140,7 +140,7 @@ unsafe fn main_0() -> i32 { let a0_clone = four.clone(); vec_.push(a0_clone) }; - vec_[(0_usize)] = (((vec_[(3_usize)] as i32) + (1)) as i32); + vec_[(0_usize)] = ((vec_[(3_usize)]) + (1)); vec_[(1_usize)].postfix_inc(); assert!( (((vec_.len()) == (4_usize)) && ((vec_[(0_usize)]) == (5))) && ((vec_[(1_usize)]) == (2)) @@ -158,12 +158,7 @@ unsafe fn main_0() -> i32 { let mut by_ref: Vec = vec![3; 2_usize as usize]; assert!(((unsafe { total_2(&by_ref,) }) == (6))); let mut elem_ptr: Vec = vec![0; 2_usize as usize]; - (unsafe { - set_0( - ((&mut elem_ptr[(1_usize)] as *mut i32) as *mut i32).cast::(), - 7, - ) - }); + (unsafe { set_0((&mut elem_ptr[(1_usize)] as *mut i32), 7) }); assert!(((elem_ptr[(1_usize)]) == (7))); let mut data: Vec = vec![0; 2_usize as usize]; (unsafe { set_0(data.as_mut_ptr(), 8) }); diff --git a/tests/unit/out/unsafe/vector.rs b/tests/unit/out/unsafe/vector.rs index 56d87ac8b..3a88b3ba2 100644 --- a/tests/unit/out/unsafe/vector.rs +++ b/tests/unit/out/unsafe/vector.rs @@ -36,8 +36,8 @@ unsafe fn main_0() -> i32 { }; assert!(((v1.len()) == (100_usize))); assert!(((v1[(99_usize)]) == (0))); - v1[(0_usize)] = (40 as i32); - v1[(99_usize)] = (50 as i32); + v1[(0_usize)] = 40; + v1[(99_usize)] = 50; assert!(((v1[(0_usize)]) == (40))); assert!(((v1[(99_usize)]) == (50))); let mut v2: Vec = Vec::new(); @@ -249,7 +249,7 @@ unsafe fn main_0() -> i32 { assert!((*((v4).last_mut().unwrap())).is_null()); assert!((*((v5).last_mut().unwrap())).is_null()); assert!(((*((v6).last_mut().unwrap())) == (2_f64))); - let ref0: *mut f64 = (((v6).last_mut().unwrap()) as *mut f64).cast::(); + let ref0: *mut f64 = ((v6).last_mut().unwrap()); (*ref0) = 5_f64; assert!(((*((v6).last_mut().unwrap())) == (5_f64))); let mut x0: f64 = (*((v6).last_mut().unwrap())); @@ -259,8 +259,7 @@ unsafe fn main_0() -> i32 { let mut idx: i32 = 0; assert!(((*(&mut (v6)[(idx as usize) as usize] as *mut f64)) == (2_f64))); assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (5_f64))); - let ref1: *mut f64 = - ((&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64) as *mut f64).cast::(); + let ref1: *mut f64 = (&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64); (*ref1) += 1.5_f64; assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (6.5_f64))); let mut x1: f64 = (*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)); diff --git a/tests/unit/out/unsafe/vector2.rs b/tests/unit/out/unsafe/vector2.rs index 24337d26e..7155d4f41 100644 --- a/tests/unit/out/unsafe/vector2.rs +++ b/tests/unit/out/unsafe/vector2.rs @@ -26,15 +26,15 @@ pub unsafe fn fn_0(v: *mut Vec, mut v3: Vec) { let __a1 = 3; v2.push(__a1) }; - x = ((&mut (*v))[(2_usize)] as i32); - v2[(0_usize)] = (1 as i32); + x = (&mut (*v))[(2_usize)]; + v2[(0_usize)] = 1; (&mut (*if true { (&mut v3 as *mut Vec) } else { (v) - }))[(0_usize)] = (7 as i32); + }))[(0_usize)] = 7; v2 = (*v).clone(); - (&mut (*v4))[(1_usize)] = (13 as i32); + (&mut (*v4))[(1_usize)] = 13; assert!(((x) == (6))); assert!(((*((*v).first_mut().unwrap())) == (4))); assert!((((&mut (*v))[(1_usize)]) == (5))); diff --git a/tests/unit/out/unsafe/vector3.rs b/tests/unit/out/unsafe/vector3.rs index 444d5f991..4b5876414 100644 --- a/tests/unit/out/unsafe/vector3.rs +++ b/tests/unit/out/unsafe/vector3.rs @@ -26,9 +26,9 @@ unsafe fn main_0() -> i32 { let __a0 = 1_usize as usize; v[(1_usize)].resize_with(__a0, || ::default()) }; - v[(0_usize)][(0_usize)] = (1 as i32); - v[(0_usize)][(1_usize)] = (5 as i32); - v[(1_usize)][(0_usize)] = (6 as i32); + v[(0_usize)][(0_usize)] = 1; + v[(0_usize)][(1_usize)] = 5; + v[(1_usize)][(0_usize)] = 6; 'loop_: for v2 in IterRange::new(v.begin(), v.end()) { let v2: *mut Vec = &mut (*v2.iter_deref()); 'loop_: for i in IterRange::new((*v2).begin(), (*v2).end()) { diff --git a/tests/unit/out/unsafe/vector_addr_of_back.rs b/tests/unit/out/unsafe/vector_addr_of_back.rs index 53d4d22b4..0f8f2bab4 100644 --- a/tests/unit/out/unsafe/vector_addr_of_back.rs +++ b/tests/unit/out/unsafe/vector_addr_of_back.rs @@ -19,7 +19,7 @@ unsafe fn main_0() -> i32 { let a0_clone = inner.clone(); outer.push(a0_clone) }; - let mut sink: *mut std_vector_int__std_allocator_int__ = ((outer).last_mut().unwrap()); + let mut sink: *mut Vec = ((outer).last_mut().unwrap()); assert!((((*(sink).cast_const()).len()) == (0_usize))); let mut p: *mut Vec> = (&mut outer as *mut Vec>); sink = ((*p).last_mut().unwrap()); diff --git a/tests/unit/out/unsafe/vector_deque_vector_string.rs b/tests/unit/out/unsafe/vector_deque_vector_string.rs index 66ede66e6..50428bec7 100644 --- a/tests/unit/out/unsafe/vector_deque_vector_string.rs +++ b/tests/unit/out/unsafe/vector_deque_vector_string.rs @@ -93,7 +93,7 @@ unsafe fn main_0() -> i32 { } else { (&mut (*((v[(0_usize)]).first_mut().unwrap()))[(1_usize)][0_usize as usize] as *mut libc::c_char) - }) = (('B' as libc::c_char) as libc::c_char); + }) = ('B' as libc::c_char); assert!( ((*((v[(0_usize)]).first_mut().unwrap()))[(0_usize)] == { let s = c"a".as_ptr(); diff --git a/tests/unit/out/unsafe/vector_subscript_borrow.rs b/tests/unit/out/unsafe/vector_subscript_borrow.rs index 05b7f9864..c5c8f2625 100644 --- a/tests/unit/out/unsafe/vector_subscript_borrow.rs +++ b/tests/unit/out/unsafe/vector_subscript_borrow.rs @@ -8,7 +8,7 @@ use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; pub static mut next_0: std::cell::LazyCell = std::cell::LazyCell::new(|| unsafe { 0 }); pub unsafe fn bump_1(mut v: *mut Vec, mut x: i32) -> i32 { - (&mut (*v))[(0_usize)] += (x as i32); + (&mut (*v))[(0_usize)] += x; return (*std::cell::LazyCell::force_mut(&mut *&raw mut next_0)).postfix_inc(); } pub fn main() { @@ -24,7 +24,7 @@ unsafe fn main_0() -> i32 { .collect::>(); let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < (items.len())) { - items[(i as usize)] = ((i).wrapping_mul(2_u32) as u32); + items[(i as usize)] = (i).wrapping_mul(2_u32); i.prefix_inc(); } items[(1_usize)] = (items[(1_usize)]).wrapping_add(5_u32); @@ -36,24 +36,24 @@ unsafe fn main_0() -> i32 { (*{ let __idx = (v[(0_usize)] as usize); &mut v[__idx] - }) = (3 as i32); + }) = 3; (*{ let __idx = (v[(1_usize)] as usize); &mut v[__idx] - }) = (((v[(1_usize)] as i32) + (4)) as i32); + }) = ((v[(1_usize)]) + (4)); assert!(((v[(1_usize)]) == (3)) && ((v[(3_usize)]) == (7))); - let mut p: *mut i32 = ((&mut v[(0_usize)] as *mut i32) as *mut i32).cast::(); - v[((*p) as usize)] = (9 as i32); + let mut p: *mut i32 = (&mut v[(0_usize)] as *mut i32); + v[((*p) as usize)] = 9; assert!(((v[(1_usize)]) == (9))); (*{ let __idx = ((unsafe { bump_1((&mut v as *mut Vec), 10) }) as usize); &mut v[__idx] - }) = (2 as i32); + }) = 2; assert!(((v[(0_usize)]) == (2))); assert!( ((unsafe { let _v: *mut Vec = (&mut v as *mut Vec); - let _x: i32 = (v[(2_usize)] as i32); + let _x: i32 = v[(2_usize)]; bump_1(_v, _x) }) == (1)) && ((v[(0_usize)]) == (3)) diff --git a/tests/unit/out/unsafe/vector_subscript_direct.rs b/tests/unit/out/unsafe/vector_subscript_direct.rs index 0fb65201b..b3096e75f 100644 --- a/tests/unit/out/unsafe/vector_subscript_direct.rs +++ b/tests/unit/out/unsafe/vector_subscript_direct.rs @@ -34,7 +34,7 @@ pub unsafe fn sum_ref_1(v: *const Vec) -> i32 { let mut s: i32 = 0; let mut i: usize = 0_usize; 'loop_: while ((i) < ((*v).len())) { - s += ((&(*v))[(i)] as i32); + s += (&(*v))[(i)]; i.prefix_inc(); } return s; @@ -47,14 +47,14 @@ pub fn main() { } unsafe fn main_0() -> i32 { let mut v: Vec = Vec::from([1, 2, 3]); - v[(0_usize)] = (10 as i32); + v[(0_usize)] = 10; assert!(((v[(0_usize)]) == (10))); - v[(1_usize)] += (5 as i32); + v[(1_usize)] += 5; v[(2_usize)].postfix_inc(); assert!(((v[(1_usize)]) == (7)) && ((v[(2_usize)]) == (4))); v[(0_usize)] = v[(1_usize)]; assert!(((v[(0_usize)]) == (7))); - v[(1_usize)] = (0 as i32); + v[(1_usize)] = 0; assert!( ((*{ let __idx = (v[(1_usize)] as usize); @@ -62,7 +62,7 @@ unsafe fn main_0() -> i32 { }) == (7)) ); let mut i: i32 = 0; - v[(i.postfix_inc() as usize)] = (3 as i32); + v[(i.postfix_inc() as usize)] = 3; assert!(((i) == (1)) && ((v[(0_usize)]) == (3))); assert!( ((*{ @@ -73,9 +73,9 @@ unsafe fn main_0() -> i32 { (*{ let __idx = ((unsafe { push_and_index_0(&mut v) }) as usize); &mut v[__idx] - }) = (5 as i32); + }) = 5; assert!(((v.len()) == (5_usize)) && ((v[(4_usize)]) == (5))); - let mut p: *mut i32 = ((&mut v[(2_usize)] as *mut i32) as *mut i32).cast::(); + let mut p: *mut i32 = (&mut v[(2_usize)] as *mut i32); (*p) = 9; assert!(((v[(2_usize)]) == (9))); assert!(((unsafe { sum_ref_1(&v,) }) == (((((3) + (0)) + (9)) + (42)) + (5)))); @@ -84,7 +84,7 @@ unsafe fn main_0() -> i32 { let __a0 = 2_usize as usize; h.values.resize_with(__a0, || ::default()) }; - h.values[(1_usize)] = (6 as i32); + h.values[(1_usize)] = 6; { let __a1 = Point { x: 1, y: 2 }; h.points.push(__a1) @@ -93,8 +93,8 @@ unsafe fn main_0() -> i32 { assert!(((h.values[(1_usize)]) == (6))); assert!(((unsafe { Point::sum(&h.points[(0_usize)],) }) == (6))); let mut hp: *mut Holder = (&mut h as *mut Holder); - (&mut (*hp)).values[(0_usize)] = ((((&mut (*hp)).values[(1_usize)] as i32) + (1)) as i32); - (&mut (*hp)).points[(0_usize)].x = ((&mut (*hp)).values[(0_usize)] as i32); + (&mut (*hp)).values[(0_usize)] = (((&mut (*hp)).values[(1_usize)]) + (1)); + (&mut (*hp)).points[(0_usize)].x = (&mut (*hp)).values[(0_usize)]; assert!(((h.values[(0_usize)]) == (7)) && ((h.points[(0_usize)].x) == (7))); let mut q: Point = h.points[(0_usize)]; q.x = 0; @@ -108,7 +108,7 @@ unsafe fn main_0() -> i32 { let __a1 = vec![0; 3_usize as usize]; grid.push(__a1) }; - grid[(1_usize)][(2_usize)] = (8 as i32); + grid[(1_usize)][(2_usize)] = 8; assert!(((grid[(1_usize)][(2_usize)]) == (8)) && ((grid[(0_usize)][(2_usize)]) == (0))); grid[(0_usize)][(1_usize)] = grid[(1_usize)][(2_usize)]; grid[(1_usize)][(0_usize)] += grid[(0_usize)][(1_usize)]; diff --git a/tests/unit/out/unsafe/vector_with_allocator.rs b/tests/unit/out/unsafe/vector_with_allocator.rs index d3000aa6e..5e6bfd12e 100644 --- a/tests/unit/out/unsafe/vector_with_allocator.rs +++ b/tests/unit/out/unsafe/vector_with_allocator.rs @@ -67,14 +67,14 @@ pub unsafe fn fn_1(v: *mut Vec, mut v3: Vec) { let __a1 = 3; v2.push(__a1) }; - x = ((&mut (*v))[(2_usize)] as i32); - v2[(0_usize)] = (1 as i32); + x = (&mut (*v))[(2_usize)]; + v2[(0_usize)] = 1; (&mut (*if true { (&mut v3 as *mut Vec) } else { (v) - }))[(0_usize)] = (7 as i32); - (&mut (*v4))[(1_usize)] = (13 as i32); + }))[(0_usize)] = 7; + (&mut (*v4))[(1_usize)] = 13; assert!(((x) == (6))); assert!(((*((*v).first_mut().unwrap())) == (4))); assert!((((&mut (*v))[(1_usize)]) == (5))); @@ -111,8 +111,8 @@ unsafe fn main_0() -> i32 { }; assert!(((v1.len()) == (100_usize))); assert!(((v1[(99_usize)]) == (0))); - v1[(0_usize)] = (40 as i32); - v1[(99_usize)] = (50 as i32); + v1[(0_usize)] = 40; + v1[(99_usize)] = 50; assert!(((v1[(0_usize)]) == (40))); assert!(((v1[(99_usize)]) == (50))); let mut v2: Vec = Vec::new(); @@ -210,7 +210,7 @@ unsafe fn main_0() -> i32 { assert!(((*((v2).last_mut().unwrap())) == (3))); assert!(((*((v3).last_mut().unwrap())) == (1))); assert!(((*((v6).last_mut().unwrap())) == (2_f64))); - let ref0: *mut f64 = (((v6).last_mut().unwrap()) as *mut f64).cast::(); + let ref0: *mut f64 = ((v6).last_mut().unwrap()); (*ref0) = 5_f64; assert!(((*((v6).last_mut().unwrap())) == (5_f64))); let mut x0: f64 = (*((v6).last_mut().unwrap())); @@ -220,8 +220,7 @@ unsafe fn main_0() -> i32 { let mut idx: i32 = 0; assert!(((*(&mut (v6)[(idx as usize) as usize] as *mut f64)) == (2_f64))); assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (5_f64))); - let ref1: *mut f64 = - ((&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64) as *mut f64).cast::(); + let ref1: *mut f64 = (&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64); (*ref1) += 1.5_f64; assert!(((*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)) == (6.5_f64))); let mut x1: f64 = (*(&mut (v6)[(s2).wrapping_sub(1_usize) as usize] as *mut f64)); From b7597b7c72ec10370bc6bbb985855c710d6b63aa Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 16:27:23 +0100 Subject: [PATCH 39/62] format --- rules/type_traits/src.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rules/type_traits/src.cpp b/rules/type_traits/src.cpp index 2b84c4616..b16d5dd8d 100644 --- a/rules/type_traits/src.cpp +++ b/rules/type_traits/src.cpp @@ -8,5 +8,4 @@ using t1 = typename std::remove_reference::type; template using t2 = typename std::enable_if::type; -template -using t3 = typename std::add_lvalue_reference::type; +template using t3 = typename std::add_lvalue_reference::type; From 4697467b1b03806d1ac8a856e9527c6860666950 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 16:31:23 +0100 Subject: [PATCH 40/62] Update tests --- .../unit/out/refcount/copy_move_defaulted.rs | 24 +- .../refcount/elidable_iterator_copy_cxx11.rs | 43 ++- tests/unit/out/refcount/fn_ptr_stable_sort.rs | 14 +- tests/unit/out/refcount/huffman.rs | 4 +- tests/unit/out/refcount/kruskal.rs | 6 +- tests/unit/out/refcount/move_assign.rs | 7 +- tests/unit/out/refcount/operator_traits.rs | 102 +++---- tests/unit/out/refcount/sort.rs | 26 +- tests/unit/out/refcount/sort_no_copy.rs | 69 ++--- tests/unit/out/refcount/swap_map_no_copy.rs | 122 ++++----- tests/unit/out/refcount/unique_ptr.rs | 13 +- .../out/refcount/unique_ptr_const_deref.rs | 5 +- .../out/refcount/unique_ptr_field_reset.rs | 6 +- tests/unit/out/refcount/unique_ptr_nested.rs | 2 +- .../refcount/vector_deque_vector_string.rs | 250 +++++++----------- tests/unit/out/refcount/void_cast.rs | 2 +- tests/unit/out/refcount/void_return.rs | 4 +- 17 files changed, 309 insertions(+), 390 deletions(-) diff --git a/tests/unit/out/refcount/copy_move_defaulted.rs b/tests/unit/out/refcount/copy_move_defaulted.rs index 43ab8ce3d..8fc3b3a28 100644 --- a/tests/unit/out/refcount/copy_move_defaulted.rs +++ b/tests/unit/out/refcount/copy_move_defaulted.rs @@ -340,9 +340,10 @@ fn main_0() -> i32 { ); assert!( (((*r.borrow()).rows.len() == 1_usize) - && ((*((field_ref!(r.as_pointer(), rows).as_pointer() as Ptr>) + && ((*field_ref!(r.as_pointer(), rows) + .as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr>) .upgrade() .deref()) .len() @@ -355,7 +356,7 @@ fn main_0() -> i32 { (*bufs.borrow_mut()).push(__a1) }; { - let __init = Buffer::move_from({ (bufs.as_pointer() as Ptr).offset(0_usize) }); + let __init = Buffer::move_from({ bufs.as_pointer().decay().offset(0_usize) }); (*bufs.borrow_mut()).push(__init) }; assert!( @@ -373,7 +374,7 @@ fn main_0() -> i32 { array_elem!(o1.as_pointer(), arr, 1).write(6); { let _p: Ptr<_> = Ptr::alloc(7); - (field_ptr!(o1.as_pointer(), p) as Ptr>>).write(_p.to_owned_opt()) + field_ptr!(o1.as_pointer(), p).write(_p.to_owned_opt()) }; let o2: Value = Rc::new(RefCell::new(Owner::move_from({ o1.as_pointer() }))); assert!( @@ -399,7 +400,7 @@ fn main_0() -> i32 { let _dtor_h1 = ScopedDestructor::new(&h1, |__p| __p.destructor()); { let _p: Ptr<_> = Ptr::alloc(9); - (field_ptr!(h1.as_pointer(), p) as Ptr>>).write(_p.to_owned_opt()) + field_ptr!(h1.as_pointer(), p).write(_p.to_owned_opt()) }; let h2: Value = Rc::new(RefCell::new(Holder::move_from({ h1.as_pointer() }))); let _dtor_h2 = ScopedDestructor::new(&h2, |__p| __p.destructor()); @@ -424,9 +425,11 @@ pub trait BufferImpl { } impl BufferImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ref!((*self), data).as_pointer() as Ptr>) + field_ref!((*self), data) + .as_pointer() .write(field!(_a0, data).with_mut(std::mem::take)); - (field_ref!((*self), rows).as_pointer() as Ptr>>) + field_ref!((*self), rows) + .as_pointer() .write(field!(_a0, rows).with_mut(std::mem::take)); field!((*self), n).write({ { (*_a0.upgrade().deref()).n } }); { @@ -465,7 +468,7 @@ impl HolderImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { field!((*self), inner).write({ { (*_a0.upgrade().deref()).inner.clone() } }); field!((*self), e).write({ { (*_a0.upgrade().deref()).e.clone() } }); - (field_ptr!((*self), p) as Ptr>>) + field_ptr!((*self), p) .write(field!(_a0, p).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } @@ -478,7 +481,8 @@ pub trait OwnerImpl { } impl OwnerImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ref!((*self), data).as_pointer() as Ptr>) + field_ref!((*self), data) + .as_pointer() .write(field!(_a0, data).with_mut(std::mem::take)); field!((*self), n).write({ { (*_a0.upgrade().deref()).n } }); { @@ -490,7 +494,7 @@ impl OwnerImpl for Ptr { ); ((array_field_ptr!((*self), arr)) as Ptr).to_any() }; - (field_ptr!((*self), p) as Ptr>>) + field_ptr!((*self), p) .write(field!(_a0, p).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs b/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs index fe10340d3..1d9e0599a 100644 --- a/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs +++ b/tests/unit/out/refcount/elidable_iterator_copy_cxx11.rs @@ -21,48 +21,47 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; let it: Value> = Rc::new(RefCell::new({ - let mut __it = (v.as_pointer() as Ptr).begin(); - while __it != (v.as_pointer() as Ptr).end() && __it.iter_deref().with(|__v| *__v != 7) - { + let mut __it = v.as_pointer().decay().begin(); + while __it != v.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != 7) { __it.iter_inc(); } __it })); - assert!((*it.borrow()) != (v.as_pointer() as Ptr).end()); + assert!((*it.borrow()) != v.as_pointer().decay().end()); assert!((((*it.borrow()).iter_deref().read()) == 7)); { - let __n = (v.as_pointer() as Ptr) + let __n = v + .as_pointer() + .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr).begin()); + .iter_distance(&v.as_pointer().decay().begin()); let __random = std::hash::RandomState::new(); for __i in (1..__n).rev() { let __j = (std::hash::BuildHasher::hash_one(&__random, __i) % (__i + 1) as u64) as isize; cpp_swap!( - (v.as_pointer() as Ptr).begin().iter_at(__i), - (v.as_pointer() as Ptr).begin().iter_at(__j) + v.as_pointer().decay().begin().iter_at(__i), + v.as_pointer().decay().begin().iter_at(__j) ); } }; { - let __n = (v.as_pointer() as Ptr) + let __n = v + .as_pointer() + .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr).begin()); + .iter_distance(&v.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (v.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (v.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) - }); - reorder(__order, |__i| { - (v.as_pointer() as Ptr).begin().iter_at(__i) + v.as_pointer().decay().begin().iter_at(__x).with(|__a| { + v.as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); + reorder(__order, |__i| v.as_pointer().decay().begin().iter_at(__i)); }; assert!(({ (*v.borrow())[0_usize] } == 4) && ({ (*v.borrow())[1_usize] } == 7)); return 0; diff --git a/tests/unit/out/refcount/fn_ptr_stable_sort.rs b/tests/unit/out/refcount/fn_ptr_stable_sort.rs index 79439c98a..f8b333380 100644 --- a/tests/unit/out/refcount/fn_ptr_stable_sort.rs +++ b/tests/unit/out/refcount/fn_ptr_stable_sort.rs @@ -36,13 +36,15 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; { - let __n = (v.as_pointer() as Ptr) + let __n = v + .as_pointer() + .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr).begin()); + .iter_distance(&v.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - let __a = (v.as_pointer() as Ptr).begin().iter_at(__x); - let __b = (v.as_pointer() as Ptr).begin().iter_at(__y); + let __a = v.as_pointer().decay().begin().iter_at(__x); + let __b = v.as_pointer().decay().begin().iter_at(__y); if Compare_0.call(__a.clone(), __b.clone()) { std::cmp::Ordering::Less } else if Compare_0.call(__b, __a) { @@ -51,9 +53,7 @@ fn main_0() -> i32 { std::cmp::Ordering::Equal } }); - reorder(__order, |__i| { - (v.as_pointer() as Ptr).begin().iter_at(__i) - }); + reorder(__order, |__i| v.as_pointer().decay().begin().iter_at(__i)); }; assert!(({ (*v.borrow())[0_usize].key } == 1)); assert!(({ (*v.borrow())[1_usize].key } == 2)); diff --git a/tests/unit/out/refcount/huffman.rs b/tests/unit/out/refcount/huffman.rs index b8ce918b3..1de3747be 100644 --- a/tests/unit/out/refcount/huffman.rs +++ b/tests/unit/out/refcount/huffman.rs @@ -439,12 +439,12 @@ impl MinHeapImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { field!((*self), size).write({ { (*_a0.upgrade().deref()).size } }); field!((*self), capacity).write({ { (*_a0.upgrade().deref()).capacity } }); - (field_ptr!((*self), arr) as Ptr]>>>>).write( + field_ptr!((*self), arr).write( field!(_a0, arr) .with_mut(|__v: &mut Option]>>>| __v.take()), ); field!((*self), next).write({ { (*_a0.upgrade().deref()).next } }); - (field_ptr!((*self), alloc) as Ptr>>>).write( + field_ptr!((*self), alloc).write( field!(_a0, alloc).with_mut(|__v: &mut Option>>| __v.take()), ); return (*self).clone(); diff --git a/tests/unit/out/refcount/kruskal.rs b/tests/unit/out/refcount/kruskal.rs index 2e365dd58..65ccc3f1a 100644 --- a/tests/unit/out/refcount/kruskal.rs +++ b/tests/unit/out/refcount/kruskal.rs @@ -364,9 +364,9 @@ impl DisjointSetImpl for Ptr { } } fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), rank) as Ptr>>>) + field_ptr!((*self), rank) .write(field!(_a0, rank).with_mut(|__v: &mut Option>>| __v.take())); - (field_ptr!((*self), parent) as Ptr>>>) + field_ptr!((*self), parent) .write(field!(_a0, parent).with_mut(|__v: &mut Option>>| __v.take())); field!((*self), n).write({ { (*_a0.upgrade().deref()).n } }); return (*self).clone(); @@ -377,7 +377,7 @@ pub trait GraphImpl { } impl GraphImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), edges) as Ptr>>>) + field_ptr!((*self), edges) .write(field!(_a0, edges).with_mut(|__v: &mut Option>>| __v.take())); field!((*self), V).write({ { (*_a0.upgrade().deref()).V } }); field!((*self), E).write({ { (*_a0.upgrade().deref()).E } }); diff --git a/tests/unit/out/refcount/move_assign.rs b/tests/unit/out/refcount/move_assign.rs index f87db9d1e..7b0670748 100644 --- a/tests/unit/out/refcount/move_assign.rs +++ b/tests/unit/out/refcount/move_assign.rs @@ -89,12 +89,7 @@ fn main_0() -> i32 { (*vec_.borrow_mut()).push(__a1) }; let d: Value = Rc::new(RefCell::new(MoveOnly::new({ 8 }))); - ({ - MoveOnlyImpl::move_assign( - &(vec_.as_pointer() as Ptr).offset(0_usize), - d.as_pointer(), - ) - }); + ({ MoveOnlyImpl::move_assign(&vec_.as_pointer().decay().offset(0_usize), d.as_pointer()) }); assert!(({ (*vec_.borrow())[0_usize].v } == 8)); assert!(({ (*d.borrow()).v } == 0)); let m: Value = Rc::new(RefCell::new(ConstMoveAssign::new())); diff --git a/tests/unit/out/refcount/operator_traits.rs b/tests/unit/out/refcount/operator_traits.rs index c342e95fa..ed186fb65 100644 --- a/tests/unit/out/refcount/operator_traits.rs +++ b/tests/unit/out/refcount/operator_traits.rs @@ -165,24 +165,22 @@ fn main_0() -> i32 { Lt { v: 2 }, ]))); { - let __n = (lts.as_pointer() as Ptr) + let __n = lts + .as_pointer() + .decay() .end() - .iter_distance(&(lts.as_pointer() as Ptr).begin()); + .iter_distance(<s.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (lts.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (lts.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) - }); - reorder(__order, |__i| { - (lts.as_pointer() as Ptr).begin().iter_at(__i) + lts.as_pointer().decay().begin().iter_at(__x).with(|__a| { + lts.as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); + reorder(__order, |__i| lts.as_pointer().decay().begin().iter_at(__i)); }; assert!( (({ (*lts.borrow())[0_usize].v } == 1) && ({ (*lts.borrow())[1_usize].v } == 2)) @@ -197,8 +195,8 @@ fn main_0() -> i32 { let mut nine: Eq = Eq { v: 9 }; assert!( ({ - let mut __it = (eqs.as_pointer() as Ptr).begin(); - while __it != (eqs.as_pointer() as Ptr).end() + let mut __it = eqs.as_pointer().decay().begin(); + while __it != eqs.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != two) { __it.iter_inc(); @@ -211,14 +209,14 @@ fn main_0() -> i32 { ); assert!( { - let mut __it = (eqs.as_pointer() as Ptr).begin(); - while __it != (eqs.as_pointer() as Ptr).end() + let mut __it = eqs.as_pointer().decay().begin(); + while __it != eqs.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != nine) { __it.iter_inc(); } __it - } == (eqs.as_pointer() as Ptr).end() + } == eqs.as_pointer().decay().end() ); let cmps: Value> = Rc::new(RefCell::new(Vec::from([ Cmp { v: 3 }, @@ -226,31 +224,31 @@ fn main_0() -> i32 { Cmp { v: 2 }, ]))); { - let __n = (cmps.as_pointer() as Ptr) + let __n = cmps + .as_pointer() + .decay() .end() - .iter_distance(&(cmps.as_pointer() as Ptr).begin()); + .iter_distance(&cmps.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (cmps.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (cmps.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) + cmps.as_pointer().decay().begin().iter_at(__x).with(|__a| { + cmps.as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); reorder(__order, |__i| { - (cmps.as_pointer() as Ptr).begin().iter_at(__i) + cmps.as_pointer().decay().begin().iter_at(__i) }); }; assert!(({ (*cmps.borrow())[0_usize].v } == 1) && ({ (*cmps.borrow())[2_usize].v } == 3)); let mut three: Cmp = Cmp { v: 3 }; assert!( ({ - let mut __it = (cmps.as_pointer() as Ptr).begin(); - while __it != (cmps.as_pointer() as Ptr).end() + let mut __it = cmps.as_pointer().decay().begin(); + while __it != cmps.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != three) { __it.iter_inc(); @@ -263,31 +261,32 @@ fn main_0() -> i32 { ); let frees: Value> = Rc::new(RefCell::new(Vec::from([Free { v: 2 }, Free { v: 1 }]))); { - let __n = (frees.as_pointer() as Ptr) + let __n = frees + .as_pointer() + .decay() .end() - .iter_distance(&(frees.as_pointer() as Ptr).begin()); + .iter_distance(&frees.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (frees.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (frees.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) + frees.as_pointer().decay().begin().iter_at(__x).with(|__a| { + frees + .as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); reorder(__order, |__i| { - (frees.as_pointer() as Ptr).begin().iter_at(__i) + frees.as_pointer().decay().begin().iter_at(__i) }); }; assert!(({ (*frees.borrow())[0_usize].v } == 1)); let mut ftwo: Free = Free { v: 2 }; assert!( ({ - let mut __it = (frees.as_pointer() as Ptr).begin(); - while __it != (frees.as_pointer() as Ptr).end() + let mut __it = frees.as_pointer().decay().begin(); + while __it != frees.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != ftwo) { __it.iter_inc(); @@ -299,7 +298,7 @@ fn main_0() -> i32 { == 2) ); let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(Lt { v: 2 }.clone(), || { ( @@ -312,7 +311,7 @@ fn main_0() -> i32 { .as_pointer() }) .write(20); - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(Lt { v: 1 }.clone(), || { ( @@ -326,7 +325,8 @@ fn main_0() -> i32 { }) .write(10); assert!( - ((*(*(m.as_pointer() as Ptr, Value)>>) + ((*(*m + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()) .iter_deref() .upgrade() @@ -336,7 +336,7 @@ fn main_0() -> i32 { == 10) ); assert!( - (((m.as_pointer() as Ptr, Value)>>) + ((m.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(Lt { v: 2 }.clone(), || { ( diff --git a/tests/unit/out/refcount/sort.rs b/tests/unit/out/refcount/sort.rs index 90dd1059c..7b7f03b77 100644 --- a/tests/unit/out/refcount/sort.rs +++ b/tests/unit/out/refcount/sort.rs @@ -53,24 +53,22 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; { - let __n = (v.as_pointer() as Ptr) + let __n = v + .as_pointer() + .decay() .end() - .iter_distance(&(v.as_pointer() as Ptr).begin()); + .iter_distance(&v.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (v.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (v.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) - }); - reorder(__order, |__i| { - (v.as_pointer() as Ptr).begin().iter_at(__i) + v.as_pointer().decay().begin().iter_at(__x).with(|__a| { + v.as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); + reorder(__order, |__i| v.as_pointer().decay().begin().iter_at(__i)); }; let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < ((*v.borrow()).len()).wrapping_sub(1_usize)) { diff --git a/tests/unit/out/refcount/sort_no_copy.rs b/tests/unit/out/refcount/sort_no_copy.rs index 327f7661e..1d106e817 100644 --- a/tests/unit/out/refcount/sort_no_copy.rs +++ b/tests/unit/out/refcount/sort_no_copy.rs @@ -148,23 +148,23 @@ fn main_0() -> i32 { (*vec_.borrow_mut()).push(__init) }; { - let __n = (vec_.as_pointer() as Ptr) + let __n = vec_ + .as_pointer() + .decay() .end() - .iter_distance(&(vec_.as_pointer() as Ptr).begin()); + .iter_distance(&vec_.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (vec_.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (vec_.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) + vec_.as_pointer().decay().begin().iter_at(__x).with(|__a| { + vec_.as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); reorder(__order, |__i| { - (vec_.as_pointer() as Ptr).begin().iter_at(__i) + vec_.as_pointer().decay().begin().iter_at(__i) }); }; assert!( @@ -174,13 +174,15 @@ fn main_0() -> i32 { ); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); { - let __n = (vec_.as_pointer() as Ptr) + let __n = vec_ + .as_pointer() + .decay() .end() - .iter_distance(&(vec_.as_pointer() as Ptr).begin()); + .iter_distance(&vec_.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - let __a = (vec_.as_pointer() as Ptr).begin().iter_at(__x); - let __b = (vec_.as_pointer() as Ptr).begin().iter_at(__y); + let __a = vec_.as_pointer().decay().begin().iter_at(__x); + let __b = vec_.as_pointer().decay().begin().iter_at(__y); if greater_2.call(__a.clone(), __b.clone()) { std::cmp::Ordering::Less } else if greater_2.call(__b, __a) { @@ -190,19 +192,21 @@ fn main_0() -> i32 { } }); reorder(__order, |__i| { - (vec_.as_pointer() as Ptr).begin().iter_at(__i) + vec_.as_pointer().decay().begin().iter_at(__i) }); }; assert!(({ (*vec_.borrow())[0_usize].v } == 8) && ({ (*vec_.borrow())[3_usize].v } == 1)); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); { - let __n = (vec_.as_pointer() as Ptr) + let __n = vec_ + .as_pointer() + .decay() .end() - .iter_distance(&(vec_.as_pointer() as Ptr).begin()); + .iter_distance(&vec_.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - let __a = (vec_.as_pointer() as Ptr).begin().iter_at(__x); - let __b = (vec_.as_pointer() as Ptr).begin().iter_at(__y); + let __a = vec_.as_pointer().decay().begin().iter_at(__x); + let __b = vec_.as_pointer().decay().begin().iter_at(__y); if FnPtr::, Ptr) -> bool>::new( |a: Ptr, b: Ptr| -> bool { { @@ -228,24 +232,28 @@ fn main_0() -> i32 { } }); reorder(__order, |__i| { - (vec_.as_pointer() as Ptr).begin().iter_at(__i) + vec_.as_pointer().decay().begin().iter_at(__i) }); }; assert!(({ (*vec_.borrow())[0_usize].v } == 1) && ({ (*vec_.borrow())[3_usize].v } == 8)); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); { - let __n = (vec_.as_pointer() as Ptr).end().iter_distance( - &(vec_.as_pointer() as Ptr) - .begin() - .iter_add(1_isize), - ); + let __n = vec_ + .as_pointer() + .decay() + .end() + .iter_distance(&vec_.as_pointer().decay().begin().iter_add(1_isize)); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - let __a = (vec_.as_pointer() as Ptr) + let __a = vec_ + .as_pointer() + .decay() .begin() .iter_add(1_isize) .iter_at(__x); - let __b = (vec_.as_pointer() as Ptr) + let __b = vec_ + .as_pointer() + .decay() .begin() .iter_add(1_isize) .iter_at(__y); @@ -258,7 +266,8 @@ fn main_0() -> i32 { } }); reorder(__order, |__i| { - (vec_.as_pointer() as Ptr) + vec_.as_pointer() + .decay() .begin() .iter_add(1_isize) .iter_at(__i) diff --git a/tests/unit/out/refcount/swap_map_no_copy.rs b/tests/unit/out/refcount/swap_map_no_copy.rs index d3b699601..85d2a8d5b 100644 --- a/tests/unit/out/refcount/swap_map_no_copy.rs +++ b/tests/unit/out/refcount/swap_map_no_copy.rs @@ -236,8 +236,8 @@ fn main_0() -> i32 { ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 10 }))); TrackedImpl::move_assign( - &(m1.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + &m1.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( Rc::new(RefCell::new(1)), @@ -247,16 +247,15 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }, - ), + }), _o.as_pointer(), ) }); ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 20 }))); TrackedImpl::move_assign( - &(m1.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + &m1.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( Rc::new(RefCell::new(2)), @@ -266,8 +265,7 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }, - ), + }), _o.as_pointer(), ) }); @@ -275,8 +273,8 @@ fn main_0() -> i32 { ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 30 }))); TrackedImpl::move_assign( - &(m2.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + &m2.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(3.clone(), || { ( Rc::new(RefCell::new(3)), @@ -286,15 +284,14 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }, - ), + }), _o.as_pointer(), ) }); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); cpp_swap!( - (m1.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + m1.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( Rc::new(RefCell::new(1)), @@ -304,10 +301,9 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - } - ), - (m1.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + }), + m1.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( Rc::new(RefCell::new(2)), @@ -317,11 +313,10 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - } - ) + }) ); assert!( - ((m1.as_pointer() as Ptr, Value)>>) + (m1.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -335,7 +330,8 @@ fn main_0() -> i32 { }) .with(|__s| __s.v) == 20) - && ((m1.as_pointer() as Ptr, Value)>>) + && (m1 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -354,7 +350,8 @@ fn main_0() -> i32 { cpp_swap!(m1.as_pointer(), m2.as_pointer()); assert!( ((*m1.borrow()).len() == 1_usize) - && ((m1.as_pointer() as Ptr, Value)>>) + && (m1 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(3.clone(), || { ( @@ -371,7 +368,8 @@ fn main_0() -> i32 { ); assert!( (((*m2.borrow()).len() == 2_usize) - && ((m2.as_pointer() as Ptr, Value)>>) + && (m2 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -385,7 +383,8 @@ fn main_0() -> i32 { }) .with(|__s| __s.v) == 20)) - && ((m2.as_pointer() as Ptr, Value)>>) + && (m2 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -429,8 +428,8 @@ fn main_0() -> i32 { (*vec_.borrow_mut()).push(__init) }; cpp_swap!( - (vec_.as_pointer() as Ptr).offset(0_usize), - (vec_.as_pointer() as Ptr).offset(1_usize) + vec_.as_pointer().decay().offset(0_usize), + vec_.as_pointer().decay().offset(1_usize) ); assert!(({ (*vec_.borrow())[0_usize].v } == 5) && ({ (*vec_.borrow())[1_usize].v } == 4)); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); @@ -500,69 +499,50 @@ fn main_0() -> i32 { )); { let __init = Tracked::new_2({ 1 }); - elem!((grid.as_pointer() as Ptr>), 0_usize) + elem!(grid.as_pointer().decay(), 0_usize) .with_mut(|__v: &mut Vec| __v.push(__init)) }; { let __init = Tracked::new_2({ 2 }); - elem!((grid.as_pointer() as Ptr>), 0_usize) + elem!(grid.as_pointer().decay(), 0_usize) .with_mut(|__v: &mut Vec| __v.push(__init)) }; { let __init = Tracked::new_2({ 3 }); - elem!((grid.as_pointer() as Ptr>), 1_usize) + elem!(grid.as_pointer().decay(), 1_usize) .with_mut(|__v: &mut Vec| __v.push(__init)) }; cpp_swap!( - ((grid.as_pointer() as Ptr>) + grid.as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr) + .decay() .offset(1_usize), - ((grid.as_pointer() as Ptr>) + grid.as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr) + .decay() .offset(0_usize) ); assert!( - (index!( - elem!((grid.as_pointer() as Ptr>), 0_usize), - 1_usize - ) - .with(|__s| __s.v) - == 3) - && (index!( - elem!((grid.as_pointer() as Ptr>), 1_usize), - 0_usize - ) - .with(|__s| __s.v) - == 2) + (index!(elem!(grid.as_pointer().decay(), 0_usize), 1_usize).with(|__s| __s.v) == 3) + && (index!(elem!(grid.as_pointer().decay(), 1_usize), 0_usize).with(|__s| __s.v) == 2) ); cpp_swap!( - (grid.as_pointer() as Ptr>).offset(0_usize), - (grid.as_pointer() as Ptr>).offset(1_usize) + grid.as_pointer().decay().offset(0_usize), + grid.as_pointer().decay().offset(1_usize) ); assert!( - ((*((grid.as_pointer() as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) - .len() - == 1_usize) - && (index!( - elem!((grid.as_pointer() as Ptr>), 0_usize), - 0_usize - ) - .with(|__s| __s.v) - == 2) + ((*grid.as_pointer().decay().offset(0_usize).upgrade().deref()).len() == 1_usize) + && (index!(elem!(grid.as_pointer().decay(), 0_usize), 0_usize).with(|__s| __s.v) == 2) ); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); let maps: Value = Rc::new(RefCell::new(::default())); ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 1 }))); TrackedImpl::move_assign( - &(field_ptr!(maps.as_pointer(), m1) as Ptr, Value)>>) - .with_mut(|__m: &mut Map, Value)>| { + &field_ptr!(maps.as_pointer(), m1).with_mut( + |__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( Rc::new(RefCell::new(1)), @@ -572,15 +552,16 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }), + }, + ), _o.as_pointer(), ) }); ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 2 }))); TrackedImpl::move_assign( - &(field_ptr!(maps.as_pointer(), m2) as Ptr, Value)>>) - .with_mut(|__m: &mut Map, Value)>| { + &field_ptr!(maps.as_pointer(), m2).with_mut( + |__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( Rc::new(RefCell::new(2)), @@ -590,7 +571,8 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }), + }, + ), _o.as_pointer(), ) }); @@ -600,7 +582,7 @@ fn main_0() -> i32 { ); assert!( ((*maps.borrow()).m1.len() == 1_usize) - && ((field_ptr!(maps.as_pointer(), m1) as Ptr, Value)>>) + && (field_ptr!(maps.as_pointer(), m1) .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -617,7 +599,7 @@ fn main_0() -> i32 { ); assert!( ((*maps.borrow()).m2.len() == 1_usize) - && ((field_ptr!(maps.as_pointer(), m2) as Ptr, Value)>>) + && (field_ptr!(maps.as_pointer(), m2) .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -833,7 +815,7 @@ pub trait OwnerImpl { } impl OwnerImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), p) as Ptr>>) + field_ptr!((*self), p) .write(field!(_a0, p).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/unique_ptr.rs b/tests/unit/out/refcount/unique_ptr.rs index 4f40237f0..71e4d39fc 100644 --- a/tests/unit/out/refcount/unique_ptr.rs +++ b/tests/unit/out/refcount/unique_ptr.rs @@ -32,18 +32,17 @@ 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_pointer().write(1); - (x1.as_pointer() as Ptr>>).write((*x2.borrow_mut()).take()); + x1.as_pointer().write((*x2.borrow_mut()).take()); let mut raw_ptr1: Ptr = ((*x1.borrow()).as_pointer()); raw_ptr1.with_mut(|__v| __v.prefix_inc()); - (field_ptr!(((*safe_ptr.upgrade().deref()).as_pointer()), ptr) as Ptr>>) - .write((*x1.borrow_mut()).take()); + field_ptr!(((*safe_ptr.upgrade().deref()).as_pointer()), ptr).write((*x1.borrow_mut()).take()); ({ SafePointerImpl::inc(&((*safe_ptr.upgrade().deref()).as_pointer())) }); ({ 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_pointer().read()) + ((*x4.borrow()).as_pointer().read())); (*x3.borrow()).as_pointer().write(__rhs); - (x4.as_pointer() as Ptr>>).write((*x3.borrow_mut()).take()); + x4.as_pointer().write((*x3.borrow_mut()).take()); let mut raw_ptr2: Ptr = ((*x4.borrow()).as_pointer()); { raw_ptr2.with_mut(|__v| *__v = *__v + 1) @@ -91,7 +90,7 @@ pub fn RndStuff_2() { .write(1); i.prefix_inc(); } - (x2.as_pointer() as Ptr>>>).write( + x2.as_pointer().write( Ptr::alloc_array((0..200_usize).map(|_| 0_i32).collect::>()).to_owned_opt(), ); let mut i: i32 = 0; @@ -134,7 +133,7 @@ pub fn RndStuff_2() { assert!((elem!(p3_0, i).with(|__s| __s.y) == 12)); i.prefix_inc(); } - (x3.as_pointer() as Ptr>>>).write( + x3.as_pointer().write( Ptr::alloc_array( (0..50_usize) .map(|_| ::default()) @@ -210,7 +209,7 @@ impl SafePointerImpl for Ptr { .with_mut(|__v| __v.prefix_inc()); } fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), ptr) as Ptr>>) + field_ptr!((*self), ptr) .write(field!(_a0, ptr).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/unique_ptr_const_deref.rs b/tests/unit/out/refcount/unique_ptr_const_deref.rs index b50c2c47d..2b200c118 100644 --- a/tests/unit/out/refcount/unique_ptr_const_deref.rs +++ b/tests/unit/out/refcount/unique_ptr_const_deref.rs @@ -32,8 +32,7 @@ pub fn main() { } fn main_0() -> i32 { let h: Value = Rc::new(RefCell::new(::default())); - (field_ptr!(h.as_pointer(), val) as Ptr>>) - .write(Some(Rc::new(RefCell::new(10))).take()); + field_ptr!(h.as_pointer(), val).write(Some(Rc::new(RefCell::new(10))).take()); ({ write_val_1((h.as_pointer()), 42) }); assert!((({ read_val_0((h.as_pointer()),) }) == 42)); return 0; @@ -43,7 +42,7 @@ pub trait HolderImpl { } impl HolderImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), val) as Ptr>>) + field_ptr!((*self), val) .write(field!(_a0, val).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/unique_ptr_field_reset.rs b/tests/unit/out/refcount/unique_ptr_field_reset.rs index 157ed5def..de002f64e 100644 --- a/tests/unit/out/refcount/unique_ptr_field_reset.rs +++ b/tests/unit/out/refcount/unique_ptr_field_reset.rs @@ -39,7 +39,7 @@ fn main_0() -> i32 { let mut hp: Ptr = (h.as_pointer()); { let _p: Ptr<_> = Ptr::alloc(Data { v: 3 }); - (field_ptr!(hp, data) as Ptr>>).write(_p.to_owned_opt()) + field_ptr!(hp, data).write(_p.to_owned_opt()) }; assert!( ({ (*h.borrow()).data.clone() } @@ -74,11 +74,11 @@ impl HolderImpl for Ptr { fn set(&self, mut p: Ptr) { { let _p: Ptr<_> = (p).clone(); - (field_ptr!((*self), data) as Ptr>>).write(_p.to_owned_opt()) + field_ptr!((*self), data).write(_p.to_owned_opt()) }; } fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), data) as Ptr>>) + field_ptr!((*self), data) .write(field!(_a0, data).with_mut(|__v: &mut Option>| __v.take())); field!((*self), n).write({ { (*_a0.upgrade().deref()).n } }); return (*self).clone(); diff --git a/tests/unit/out/refcount/unique_ptr_nested.rs b/tests/unit/out/refcount/unique_ptr_nested.rs index 67f8613d7..0d1d975a7 100644 --- a/tests/unit/out/refcount/unique_ptr_nested.rs +++ b/tests/unit/out/refcount/unique_ptr_nested.rs @@ -61,7 +61,7 @@ pub trait OuterImpl { } impl OuterImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), inner) as Ptr>>) + field_ptr!((*self), inner) .write(field!(_a0, inner).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/vector_deque_vector_string.rs b/tests/unit/out/refcount/vector_deque_vector_string.rs index dc1222c49..334c682fe 100644 --- a/tests/unit/out/refcount/vector_deque_vector_string.rs +++ b/tests/unit/out/refcount/vector_deque_vector_string.rs @@ -37,7 +37,7 @@ fn main_0() -> i32 { }; (*row.borrow_mut()).push(__a1) }; - elem!((v.as_pointer() as Ptr>>>), 0_usize) + elem!(v.as_pointer().decay(), 0_usize) .with_mut(|__v: &mut Vec>>| __v.push((*row.borrow()).clone())); { let __a1 = { @@ -47,119 +47,92 @@ fn main_0() -> i32 { }; (*row.borrow_mut()).push(__a1) }; - elem!((v.as_pointer() as Ptr>>>), 1_usize) + elem!(v.as_pointer().decay(), 1_usize) .with_mut(|__v: &mut Vec>>| __v.push((*row.borrow()).clone())); { let __init = Vec::new(); - elem!((v.as_pointer() as Ptr>>>), 1_usize) + elem!(v.as_pointer().decay(), 1_usize) .with_mut(|__v: &mut Vec>>| __v.push(__init)) }; { let __a1 = { - let mut r = (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(1_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) - .clone(); + let mut r = + (*Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).decay())) + .offset(1_usize) + .upgrade() + .deref()) + .clone(); r.pop(); Ptr::::from_string_literal(b"x").with_c_str(|__s| r.extend_from_slice(__s)); r.push(0); r }; - ((v.as_pointer() as Ptr>>>) + v.as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr>>) + .decay() .to_last() .with_mut(|__v: &mut Vec>| __v.push(__a1)) }; assert!( - ((*((v.as_pointer() as Ptr>>>) + ((*v.as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr>>) + .decay() .upgrade() .deref()) .len() == 2_usize) ); assert!( - ((*((v.as_pointer() as Ptr>>>) + ((*v.as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr>>) + .decay() .upgrade() .deref()) .len() == 3_usize) && (Ptr::::from_string_literal(b"def").with_c_str(|__s| { - (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(2_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) + (*Ptr::>>::decay(&(v.as_pointer().decay().offset(1_usize).decay())) .offset(2_usize) - .as_pointer() as Ptr>) .upgrade() - .deref()) + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(1_usize).decay()), + ) + .offset(2_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s })) ); assert!(Ptr::::from_string_literal(b"bcx").with_c_str(|__s| { - (*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>) - .to_last()), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &(((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>) - .to_last()), - ) as Ptr>) + (*Ptr::>>::decay(&(v.as_pointer().decay().offset(1_usize).decay().to_last())) .offset(0_usize) - .as_pointer() as Ptr>) .upgrade() - .deref()) + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(1_usize).decay().to_last()), + ) + .offset(0_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s })); let copy: Value>>>> = Rc::new(RefCell::new((*v.borrow()).clone())); - ((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(0_usize) as Ptr>) + Ptr::>>::decay(&(copy.as_pointer().decay().offset(0_usize).decay())) + .offset(0_usize) .write({ let mut __bytes = Ptr::::from_string_literal(b"z").to_c_bytes(); __bytes.push(0); __bytes }); if 0_usize as usize - >= (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(1_usize) as Ptr>) + >= (*Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).decay())) + .offset(1_usize) .upgrade() .deref()) .len() @@ -167,134 +140,95 @@ fn main_0() -> i32 { { panic!("out of bounds access") } else { - ((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(1_usize) as Ptr>) + Ptr::>>::decay(&(v.as_pointer().decay().offset(0_usize).decay())) + .offset(1_usize) .decay() .offset(0_usize as isize) } .write(('B' as i8)); assert!( - (Ptr::::from_string_literal(b"a").with_c_str(|__s| (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>) - ) as Ptr>) - .offset(0_usize) - .as_pointer() - as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>) - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + (Ptr::::from_string_literal(b"a").with_c_str(|__s| (*Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).decay()) + ) + .offset(0_usize) + .upgrade() + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).decay()) + ) + .offset(0_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s)) - && (Ptr::::from_string_literal(b"z").with_c_str(|__s| { - (*((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + && (Ptr::::from_string_literal(b"z").with_c_str( + |__s| (*Ptr::>>::decay( + &(copy.as_pointer().decay().offset(0_usize).decay()) + ) + .offset(0_usize) + .upgrade() + .deref())[..(*Ptr::>>::decay( + &(copy.as_pointer().decay().offset(0_usize).decay()) + ) + .offset(0_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s - })) + )) ); assert!( - (Ptr::::from_string_literal(b"Bc").with_c_str(|__s| (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>) - ) as Ptr>) - .offset(1_usize) - .as_pointer() - as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>) - ) as Ptr>) - .offset(1_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) + (Ptr::::from_string_literal(b"Bc").with_c_str(|__s| (*Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).decay()) + ) + .offset(1_usize) + .upgrade() + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(0_usize).decay()) + ) + .offset(1_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s)) && (Ptr::::from_string_literal(b"bc").with_c_str(|__s| { - (*((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(1_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &((copy.as_pointer() as Ptr>>>) - .offset(0_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) + (*Ptr::>>::decay(&(copy.as_pointer().decay().offset(0_usize).decay())) .offset(1_usize) - .as_pointer() as Ptr>) .upgrade() - .deref()) + .deref())[..(*Ptr::>>::decay( + &(copy.as_pointer().decay().offset(0_usize).decay()), + ) + .offset(1_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s })) ); - elem!((v.as_pointer() as Ptr>>>), 1_usize) - .with_mut(|__v: &mut Vec>>| __v.remove(0)); + elem!(v.as_pointer().decay(), 1_usize).with_mut(|__v: &mut Vec>>| __v.remove(0)); assert!(Ptr::::from_string_literal(b"bcx").with_c_str(|__s| { - (*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref())[..(*((Ptr::>>::decay( - &((v.as_pointer() as Ptr>>>) - .offset(1_usize) - .as_pointer() as Ptr>>), - ) as Ptr>) + (*Ptr::>>::decay(&(v.as_pointer().decay().offset(1_usize).decay())) .offset(0_usize) - .as_pointer() as Ptr>) .upgrade() - .deref()) + .deref())[..(*Ptr::>>::decay( + &(v.as_pointer().decay().offset(1_usize).decay()), + ) + .offset(0_usize) + .upgrade() + .deref()) .len() .saturating_sub(1)] == *__s })); assert!( - ((*((copy.as_pointer() as Ptr>>>) + ((*copy + .as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr>>) + .decay() .upgrade() .deref()) .len() diff --git a/tests/unit/out/refcount/void_cast.rs b/tests/unit/out/refcount/void_cast.rs index 33d538629..c4c198b8f 100644 --- a/tests/unit/out/refcount/void_cast.rs +++ b/tests/unit/out/refcount/void_cast.rs @@ -130,7 +130,7 @@ pub trait NonCopyableImpl { } impl NonCopyableImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), value) as Ptr>>) + field_ptr!((*self), value) .write(field!(_a0, value).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/void_return.rs b/tests/unit/out/refcount/void_return.rs index 7a2916348..0a3c00117 100644 --- a/tests/unit/out/refcount/void_return.rs +++ b/tests/unit/out/refcount/void_return.rs @@ -46,8 +46,8 @@ pub fn main() { fn main_0() -> i32 { let v: Value> = Rc::new(RefCell::new(Vec::from([1, 3, 0, 2, 8, 7]))); ({ - let _first: RandomAccessIterator = (v.as_pointer() as Ptr).begin(); - let _last: RandomAccessIterator = (v.as_pointer() as Ptr).end(); + let _first: RandomAccessIterator = v.as_pointer().decay().begin(); + let _last: RandomAccessIterator = v.as_pointer().decay().end(); f1_0(_first, _last) }); let a: Value> = Rc::new(RefCell::new(Box::new([1, 2, 3]))); From 1ff1653906d3c05da39bd9c81b5332cfa8442f29 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 17:18:03 +0100 Subject: [PATCH 41/62] Update tests --- tests/unit/out/refcount/swap_map_no_copy.rs | 120 ++++++++------------ 1 file changed, 50 insertions(+), 70 deletions(-) diff --git a/tests/unit/out/refcount/swap_map_no_copy.rs b/tests/unit/out/refcount/swap_map_no_copy.rs index 1df9abce1..4365874b6 100644 --- a/tests/unit/out/refcount/swap_map_no_copy.rs +++ b/tests/unit/out/refcount/swap_map_no_copy.rs @@ -226,8 +226,8 @@ fn main_0() -> i32 { ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 10 }))); TrackedImpl::move_assign( - &(m1.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + &m1.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( Rc::new(RefCell::new(1)), @@ -237,16 +237,15 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }, - ), + }), _o.as_pointer(), ) }); ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 20 }))); TrackedImpl::move_assign( - &(m1.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + &m1.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( Rc::new(RefCell::new(2)), @@ -256,8 +255,7 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }, - ), + }), _o.as_pointer(), ) }); @@ -265,8 +263,8 @@ fn main_0() -> i32 { ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 30 }))); TrackedImpl::move_assign( - &(m2.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + &m2.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(3.clone(), || { ( Rc::new(RefCell::new(3)), @@ -276,15 +274,14 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - }, - ), + }), _o.as_pointer(), ) }); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); cpp_swap!( - (m1.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + m1.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( Rc::new(RefCell::new(1)), @@ -294,10 +291,9 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - } - ), - (m1.as_pointer() as Ptr, Value)>>).with_mut( - |__m: &mut Map, Value)>| { + }), + m1.as_pointer() + .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( Rc::new(RefCell::new(2)), @@ -307,11 +303,10 @@ fn main_0() -> i32 { .borrow() .1 .as_pointer() - } - ) + }) ); assert!( - ((m1.as_pointer() as Ptr, Value)>>) + (m1.as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -325,7 +320,8 @@ fn main_0() -> i32 { }) .with(|__s| __s.v) == 20) - && ((m1.as_pointer() as Ptr, Value)>>) + && (m1 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -344,7 +340,8 @@ fn main_0() -> i32 { cpp_swap!(m1.as_pointer(), m2.as_pointer()); assert!( ((*m1.borrow()).len() == 1_usize) - && ((m1.as_pointer() as Ptr, Value)>>) + && (m1 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(3.clone(), || { ( @@ -361,7 +358,8 @@ fn main_0() -> i32 { ); assert!( (((*m2.borrow()).len() == 2_usize) - && ((m2.as_pointer() as Ptr, Value)>>) + && (m2 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -375,7 +373,8 @@ fn main_0() -> i32 { }) .with(|__s| __s.v) == 20)) - && ((m2.as_pointer() as Ptr, Value)>>) + && (m2 + .as_pointer() .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -419,8 +418,8 @@ fn main_0() -> i32 { (*vec_.borrow_mut()).push(__init) }; cpp_swap!( - (vec_.as_pointer() as Ptr).offset(0_usize), - (vec_.as_pointer() as Ptr).offset(1_usize) + vec_.as_pointer().decay().offset(0_usize), + vec_.as_pointer().decay().offset(1_usize) ); assert!(({ (*vec_.borrow())[0_usize].v } == 5) && ({ (*vec_.borrow())[1_usize].v } == 4)); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); @@ -490,61 +489,42 @@ fn main_0() -> i32 { )); { let __init = Tracked::new_2({ 1 }); - elem!((grid.as_pointer() as Ptr>), 0_usize) + elem!(grid.as_pointer().decay(), 0_usize) .with_mut(|__v: &mut Vec| __v.push(__init)) }; { let __init = Tracked::new_2({ 2 }); - elem!((grid.as_pointer() as Ptr>), 0_usize) + elem!(grid.as_pointer().decay(), 0_usize) .with_mut(|__v: &mut Vec| __v.push(__init)) }; { let __init = Tracked::new_2({ 3 }); - elem!((grid.as_pointer() as Ptr>), 1_usize) + elem!(grid.as_pointer().decay(), 1_usize) .with_mut(|__v: &mut Vec| __v.push(__init)) }; cpp_swap!( - ((grid.as_pointer() as Ptr>) + grid.as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr) + .decay() .offset(1_usize), - ((grid.as_pointer() as Ptr>) + grid.as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr) + .decay() .offset(0_usize) ); assert!( - (index!( - elem!((grid.as_pointer() as Ptr>), 0_usize), - 1_usize - ) - .with(|__s| __s.v) - == 3) - && (index!( - elem!((grid.as_pointer() as Ptr>), 1_usize), - 0_usize - ) - .with(|__s| __s.v) - == 2) + (index!(elem!(grid.as_pointer().decay(), 0_usize), 1_usize).with(|__s| __s.v) == 3) + && (index!(elem!(grid.as_pointer().decay(), 1_usize), 0_usize).with(|__s| __s.v) == 2) ); cpp_swap!( - (grid.as_pointer() as Ptr>).offset(0_usize), - (grid.as_pointer() as Ptr>).offset(1_usize) + grid.as_pointer().decay().offset(0_usize), + grid.as_pointer().decay().offset(1_usize) ); assert!( - ((*((grid.as_pointer() as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) - .len() - == 1_usize) - && (index!( - elem!((grid.as_pointer() as Ptr>), 0_usize), - 0_usize - ) - .with(|__s| __s.v) - == 2) + ((*grid.as_pointer().decay().offset(0_usize).upgrade().deref()).len() == 1_usize) + && (index!(elem!(grid.as_pointer().decay(), 0_usize), 0_usize).with(|__s| __s.v) == 2) ); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); let maps: Value, Value)>]>> = Rc::new(RefCell::new( @@ -555,8 +535,8 @@ fn main_0() -> i32 { ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 1 }))); TrackedImpl::move_assign( - &((maps.as_pointer() as Ptr, Value)>>).offset(0) - as Ptr, Value)>>) + &(maps.as_pointer() as Ptr, Value)>>) + .offset(0) .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -574,8 +554,8 @@ fn main_0() -> i32 { ({ let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 2 }))); TrackedImpl::move_assign( - &((maps.as_pointer() as Ptr, Value)>>).offset(1) - as Ptr, Value)>>) + &(maps.as_pointer() as Ptr, Value)>>) + .offset(1) .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -596,8 +576,8 @@ fn main_0() -> i32 { ); assert!( ((*maps.borrow())[(0) as usize].len() == 1_usize) - && (((maps.as_pointer() as Ptr, Value)>>).offset(0) - as Ptr, Value)>>) + && ((maps.as_pointer() as Ptr, Value)>>) + .offset(0) .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(2.clone(), || { ( @@ -614,8 +594,8 @@ fn main_0() -> i32 { ); assert!( ((*maps.borrow())[(1) as usize].len() == 1_usize) - && (((maps.as_pointer() as Ptr, Value)>>).offset(1) - as Ptr, Value)>>) + && ((maps.as_pointer() as Ptr, Value)>>) + .offset(1) .with_mut(|__m: &mut Map, Value)>| { __m.get_or_insert_with(1.clone(), || { ( @@ -831,7 +811,7 @@ pub trait OwnerImpl { } impl OwnerImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), p) as Ptr>>) + field_ptr!((*self), p) .write(field!(_a0, p).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } From 0f95023e400fa9104b9add3209ae3f2e5228f4cd Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 18:43:36 +0100 Subject: [PATCH 42/62] Panic on large offsets --- libcc2rs/src/field.rs | 9 +++------ libcc2rs/src/rc.rs | 10 ++++------ 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/libcc2rs/src/field.rs b/libcc2rs/src/field.rs index cb397fe6d..a6ae6d050 100644 --- a/libcc2rs/src/field.rs +++ b/libcc2rs/src/field.rs @@ -1562,11 +1562,10 @@ mod tests { } #[test] + #[should_panic(expected = "too large for a pointer to its elements")] fn far_vector_field_ptr() { - let holder = holds_far(); - let far: Ptr = field_ptr!(holder, far); - let v: Ptr = field_ref!(far, v).as_pointer().decay(); - assert_eq!(v.offset(1).read(), 6); + let far: Ptr = field_ptr!(holds_far(), far); + let _: Ptr = field_ref!(far, v).as_pointer().decay(); } #[test] @@ -1576,8 +1575,6 @@ mod tests { let s: Value = Rc::new(RefCell::new(holds_far().borrow().far.clone())); let arr: Ptr = array_field_ptr!(s, arr); assert_eq!(arr.offset(2).read(), 3); - let v: Ptr = field_ref!(s, v).as_pointer().decay(); - assert_eq!(v.offset(1).read(), 6); } #[derive(Clone, Default, Record, ByteRepr)] diff --git a/libcc2rs/src/rc.rs b/libcc2rs/src/rc.rs index a19cd5151..ae8ef40ba 100644 --- a/libcc2rs/src/rc.rs +++ b/libcc2rs/src/rc.rs @@ -1466,12 +1466,10 @@ impl Ptr> { kind: PtrKind::HeapVec(weak.clone()), }, // The elements of a field are reached through the struct. - PtrKind::Field(root, _, FieldShape::Single) if u32::try_from(self.offset).is_ok() => { - Ptr { - offset: 0, - kind: PtrKind::Field(root.clone(), self.offset as u32, FieldShape::Vec), - } - } + PtrKind::Field(root, _, FieldShape::Single) => Ptr { + offset: 0, + kind: PtrKind::Field(root.clone(), field_offset(self.offset), FieldShape::Vec), + }, PtrKind::StackVec(_) | PtrKind::HeapVec(_) | PtrKind::StackArray(_) From 26dc5d8a1ae7c7b0244f7e9a4698af80816f57bf Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 09:29:33 +0100 Subject: [PATCH 43/62] Update tests --- tests/unit/out/refcount/clone_vs_move.rs | 96 +++--------- tests/unit/out/refcount/find.rs | 44 +++--- tests/unit/out/refcount/foreach_map.rs | 22 ++- tests/unit/out/refcount/map-reallocation.rs | 33 +--- tests/unit/out/refcount/map.rs | 145 ++++++------------ tests/unit/out/refcount/map_copy.rs | 12 +- tests/unit/out/refcount/map_key_copy_ctor.rs | 96 ++++-------- tests/unit/out/refcount/map_key_identity.rs | 132 ++++++++-------- tests/unit/out/refcount/operator_traits.rs | 102 ++++++------ .../refcount/redundant_copy_in_conversion.rs | 6 +- .../unit/out/refcount/rvalue_rule_arg_move.rs | 8 +- tests/unit/out/refcount/swap_map_no_copy.rs | 87 ++++------- .../out/refcount/vector_iter_range_ctor.rs | 31 ++-- 13 files changed, 309 insertions(+), 505 deletions(-) diff --git a/tests/unit/out/refcount/clone_vs_move.rs b/tests/unit/out/refcount/clone_vs_move.rs index cea552ebb..e49a2386b 100644 --- a/tests/unit/out/refcount/clone_vs_move.rs +++ b/tests/unit/out/refcount/clone_vs_move.rs @@ -161,18 +161,20 @@ fn main_0() -> i32 { let mut i: i32 = 0; 'loop_: while (i < N) { assert!( - ((*((m1.as_pointer() as Ptr>) + ((*m1 + .as_pointer() + .decay() .offset((i as usize)) - .as_pointer() as Ptr>) .upgrade() .deref()) .len() == 10_usize) ); assert!( - ((*((m2.as_pointer() as Ptr>) + ((*m2 + .as_pointer() + .decay() .offset((i as usize)) - .as_pointer() as Ptr>) .upgrade() .deref()) .len() @@ -181,20 +183,10 @@ fn main_0() -> i32 { let mut j: i32 = 0; 'loop_: while (j < 10) { assert!( - ((index!( - elem!((m1.as_pointer() as Ptr>), (i as usize)), - (j as usize) - ) - .read()) - == 0) + ((index!(elem!(m1.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 0) ); assert!( - ((index!( - elem!((m2.as_pointer() as Ptr>), (i as usize)), - (j as usize) - ) - .read()) - == 0) + ((index!(elem!(m2.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 0) ); j.prefix_inc(); } @@ -204,11 +196,8 @@ fn main_0() -> i32 { 'loop_: while (i < N) { let mut j: i32 = 0; 'loop_: while (j < 10) { - index!( - elem!((m2.as_pointer() as Ptr>), (i as usize)), - (j as usize) - ) - .with_mut(|__v| __v.postfix_inc()); + index!(elem!(m2.as_pointer().decay(), (i as usize)), (j as usize)) + .with_mut(|__v| __v.postfix_inc()); j.prefix_inc(); } i.prefix_inc(); @@ -216,18 +205,20 @@ fn main_0() -> i32 { let mut i: i32 = 0; 'loop_: while (i < N) { assert!( - ((*((m1.as_pointer() as Ptr>) + ((*m1 + .as_pointer() + .decay() .offset((i as usize)) - .as_pointer() as Ptr>) .upgrade() .deref()) .len() == 10_usize) ); assert!( - ((*((m2.as_pointer() as Ptr>) + ((*m2 + .as_pointer() + .decay() .offset((i as usize)) - .as_pointer() as Ptr>) .upgrade() .deref()) .len() @@ -236,20 +227,10 @@ fn main_0() -> i32 { let mut j: i32 = 0; 'loop_: while (j < 10) { assert!( - ((index!( - elem!((m1.as_pointer() as Ptr>), (i as usize)), - (j as usize) - ) - .read()) - == 0) + ((index!(elem!(m1.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 0) ); assert!( - ((index!( - elem!((m2.as_pointer() as Ptr>), (i as usize)), - (j as usize) - ) - .read()) - == 1) + ((index!(elem!(m2.as_pointer().decay(), (i as usize)), (j as usize)).read()) == 1) ); j.prefix_inc(); } @@ -259,50 +240,21 @@ fn main_0() -> i32 { let mut i: i32 = 0; 'loop_: while (i < N) { let __rhs = i; - Map::subscript( - (map1.as_pointer() as Ptr, Value)>>), - &i, - ) - .write(__rhs); + Map::subscript(map1.as_pointer(), &i).write(__rhs); i.prefix_inc(); } let map2: Value, Value)>> = Rc::new(RefCell::new((*map1.borrow()).clone())); let mut i: i32 = 0; 'loop_: while (i < N) { - assert!( - ((Map::subscript( - (map2.as_pointer() as Ptr, Value)>>), - &i - ) - .read()) - == i) - ); - Map::subscript( - (map2.as_pointer() as Ptr, Value)>>), - &i, - ) - .with_mut(|__v| __v.prefix_inc()); + assert!(((Map::subscript(map2.as_pointer(), &i).read()) == i)); + Map::subscript(map2.as_pointer(), &i).with_mut(|__v| __v.prefix_inc()); i.prefix_inc(); } let mut i: i32 = 0; 'loop_: while (i < N) { - assert!( - ((Map::subscript( - (map1.as_pointer() as Ptr, Value)>>), - &i - ) - .read()) - == i) - ); - assert!( - ((Map::subscript( - (map2.as_pointer() as Ptr, Value)>>), - &i - ) - .read()) - == (i + 1)) - ); + assert!(((Map::subscript(map1.as_pointer(), &i).read()) == i)); + assert!(((Map::subscript(map2.as_pointer(), &i).read()) == (i + 1))); i.prefix_inc(); } let pair1: Value<(Value, Value)> = Rc::new(RefCell::new(( @@ -364,7 +316,7 @@ fn main_0() -> i32 { assert!((b1.w == 1)); assert!((b2.w == 2)); let v4: Value> = Rc::new(RefCell::new(Vec::new())); - (v4.as_pointer() as Ptr>).write((v2).clone()); + v4.as_pointer().write((v2).clone()); let mut i: i32 = 0; 'loop_: while (i < N) { assert!(({ (*v4.borrow())[(i as usize)] } == (i + 1))); diff --git a/tests/unit/out/refcount/find.rs b/tests/unit/out/refcount/find.rs index 8fe619ee7..914ac00cb 100644 --- a/tests/unit/out/refcount/find.rs +++ b/tests/unit/out/refcount/find.rs @@ -25,9 +25,9 @@ fn main_0() -> i32 { (*v.borrow_mut()).push(__a1) }; let v_begin: Value> = - Rc::new(RefCell::new((v.as_pointer() as Ptr).begin())); + Rc::new(RefCell::new(v.as_pointer().decay().begin())); let v_end: Value> = - Rc::new(RefCell::new((v.as_pointer() as Ptr).end())); + Rc::new(RefCell::new(v.as_pointer().decay().end())); let it: Value> = Rc::new(RefCell::new({ let mut __it = (*v_begin.borrow()).clone(); while __it != (*v_end.borrow()).clone() && __it.iter_deref().with(|__v| *__v != 2) { @@ -35,80 +35,76 @@ fn main_0() -> i32 { } __it })); - let mut v_result_true: bool = (*it.borrow()) != (v.as_pointer() as Ptr).end(); + let mut v_result_true: bool = (*it.borrow()) != v.as_pointer().decay().end(); let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(1)).as_pointer(), |__k| cpp_move!(__k), ) .write(1_f64); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(2)).as_pointer(), |__k| cpp_move!(__k), ) .write(2_f64); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(3)).as_pointer(), |__k| cpp_move!(__k), ) .write(3_f64); let m_begin: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), )); let m_end: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), )); let mut m_result_true: bool = (*m_begin.borrow()) != (*m_end.borrow()); assert!( ((v_result_true) && (m_result_true)) && ({ - let mut __it = (v.as_pointer() as Ptr).begin(); - while __it != (v.as_pointer() as Ptr).begin() + let mut __it = v.as_pointer().decay().begin(); + while __it != v.as_pointer().decay().begin() && __it.iter_deref().with(|__v| *__v != 2) { __it.iter_inc(); } __it - } == (v.as_pointer() as Ptr).begin()) + } == v.as_pointer().decay().begin()) ); let w: Value> = Rc::new(RefCell::new(Vec::from([1, 2, 3, 4, 5]))); assert!( { - let mut __it = (w.as_pointer() as Ptr).begin().iter_add(2_isize); - while __it != (w.as_pointer() as Ptr).end() - && __it.iter_deref().with(|__v| *__v != 4) - { + let mut __it = w.as_pointer().decay().begin().iter_add(2_isize); + while __it != w.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != 4) { __it.iter_inc(); } __it - } == (w.as_pointer() as Ptr).begin().iter_add(3_isize) + } == w.as_pointer().decay().begin().iter_add(3_isize) ); assert!( { - let mut __it = (w.as_pointer() as Ptr).begin().iter_add(2_isize); - while __it != (w.as_pointer() as Ptr).end() - && __it.iter_deref().with(|__v| *__v != 1) - { + let mut __it = w.as_pointer().decay().begin().iter_add(2_isize); + while __it != w.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != 1) { __it.iter_inc(); } __it - } == (w.as_pointer() as Ptr).end() + } == w.as_pointer().decay().end() ); assert!( { - let mut __it = (w.as_pointer() as Ptr).begin().iter_add(2_isize); - while __it != (w.as_pointer() as Ptr).begin().iter_add(4_isize) + let mut __it = w.as_pointer().decay().begin().iter_add(2_isize); + while __it != w.as_pointer().decay().begin().iter_add(4_isize) && __it.iter_deref().with(|__v| *__v != 5) { __it.iter_inc(); } __it - } == (w.as_pointer() as Ptr).begin().iter_add(4_isize) + } == w.as_pointer().decay().begin().iter_add(4_isize) ); return 0; } diff --git a/tests/unit/out/refcount/foreach_map.rs b/tests/unit/out/refcount/foreach_map.rs index 4cd06ece4..44c068502 100644 --- a/tests/unit/out/refcount/foreach_map.rs +++ b/tests/unit/out/refcount/foreach_map.rs @@ -15,11 +15,7 @@ fn main_0() -> i32 { let mut i: i32 = 0; let mut k: i32 = 100; 'loop_: while (i < 100) { - Map::subscript( - (m.as_pointer() as Ptr, Value)>>), - &i, - ) - .write(((k as f64) / 2_f64)); + Map::subscript(m.as_pointer(), &i).write(((k as f64) / 2_f64)); { i.prefix_inc(); k.prefix_dec() @@ -27,18 +23,18 @@ fn main_0() -> i32 { } let mut sum: f64 = 0_f64; 'loop_: for i in IterRange::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let i: Ptr<(Value, Value)> = i.iter_deref(); sum += (*(*i.upgrade().deref()).1.borrow()); } 'loop_: for i in IterRange::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let i: Value<(Value, Value)> = Rc::new(RefCell::new(( @@ -53,9 +49,9 @@ fn main_0() -> i32 { } assert!((sum == 7475_f64)); 'loop_: for i in IterRange::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let i: Value<(Value, Value)> = Rc::new(RefCell::new(( @@ -70,9 +66,9 @@ fn main_0() -> i32 { assert!(((*(*i.borrow()).1.borrow()) == (-1_i32 as f64))); } 'loop_: for i in IterRange::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let i: Ptr<(Value, Value)> = i.iter_deref(); diff --git a/tests/unit/out/refcount/map-reallocation.rs b/tests/unit/out/refcount/map-reallocation.rs index 493389473..d9b4766f2 100644 --- a/tests/unit/out/refcount/map-reallocation.rs +++ b/tests/unit/out/refcount/map-reallocation.rs @@ -15,13 +15,9 @@ fn main_0() -> i32 { let mut sentinel: i32 = (N / 2); let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); let __rhs = sentinel; - Map::subscript( - (m.as_pointer() as Ptr, Value)>>), - &sentinel, - ) - .write(__rhs); + Map::subscript(m.as_pointer(), &sentinel).write(__rhs); let it: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&sentinel)), )); let mut p: Ptr = ((*(*it.borrow()).iter_deref().upgrade().deref()) @@ -44,21 +40,13 @@ fn main_0() -> i32 { let mut i: i32 = 0; 'loop_: while (i < sentinel) { let __rhs = i; - Map::subscript( - (m.as_pointer() as Ptr, Value)>>), - &i, - ) - .write(__rhs); + Map::subscript(m.as_pointer(), &i).write(__rhs); i.prefix_inc(); } let mut i: i32 = (sentinel + 1); 'loop_: while (i <= N) { let __rhs = i; - Map::subscript( - (m.as_pointer() as Ptr, Value)>>), - &i, - ) - .write(__rhs); + Map::subscript(m.as_pointer(), &i).write(__rhs); i.prefix_inc(); } assert!( @@ -85,21 +73,14 @@ fn main_0() -> i32 { (*(*(*it.borrow()).iter_deref().upgrade().deref()) .1 .borrow_mut()) = 57005; - assert!( - ((Map::subscript( - (m.as_pointer() as Ptr, Value)>>), - &sentinel - ) - .read()) - == 57005) - ); + assert!(((Map::subscript(m.as_pointer(), &sentinel).read()) == 57005)); assert!(((p.read()) == 57005)); assert!(((*m.borrow()).len() == (((N + 1) as u32) as usize))); let mut prev: i32 = -1_i32; 'loop_: for pair in IterRange::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let pair: Ptr<(Value, Value)> = pair.iter_deref(); diff --git a/tests/unit/out/refcount/map.rs b/tests/unit/out/refcount/map.rs index 50a11c8a1..c84d44fd8 100644 --- a/tests/unit/out/refcount/map.rs +++ b/tests/unit/out/refcount/map.rs @@ -19,19 +19,19 @@ pub fn main() { fn main_0() -> i32 { let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(0_i16)).as_pointer(), |__k| cpp_move!(__k), ) .write(1_u32); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(1_i16)).as_pointer(), |__k| cpp_move!(__k), ) .write(2_u32); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(2_i16)).as_pointer(), |__k| cpp_move!(__k), ) @@ -39,7 +39,7 @@ fn main_0() -> i32 { assert!(((*m.borrow()).len() == 3_usize)); assert!( ((Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(0_i16)).as_pointer(), |__k| cpp_move!(__k) ) @@ -48,7 +48,7 @@ fn main_0() -> i32 { ); assert!( ((Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(1_i16)).as_pointer(), |__k| cpp_move!(__k) ) @@ -57,7 +57,7 @@ fn main_0() -> i32 { ); assert!( ((Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(2_i16)).as_pointer(), |__k| cpp_move!(__k) ) @@ -66,7 +66,7 @@ fn main_0() -> i32 { ); let mut x: i32 = 4; Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(1_i16)).as_pointer(), |__k| cpp_move!(__k), ) @@ -74,7 +74,7 @@ fn main_0() -> i32 { assert!(((*m.borrow()).len() == 3_usize)); assert!( ((Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(0_i16)).as_pointer(), |__k| cpp_move!(__k) ) @@ -83,7 +83,7 @@ fn main_0() -> i32 { ); assert!( ((Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(1_i16)).as_pointer(), |__k| cpp_move!(__k) ) @@ -92,7 +92,7 @@ fn main_0() -> i32 { ); assert!( ((Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(2_i16)).as_pointer(), |__k| cpp_move!(__k) ) @@ -102,7 +102,7 @@ fn main_0() -> i32 { ({ foo_0( (Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(0_i16)).as_pointer(), |__k| cpp_move!(__k), ) @@ -111,7 +111,7 @@ fn main_0() -> i32 { }); assert!( ((Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(0_i16)).as_pointer(), |__k| cpp_move!(__k) ) @@ -120,14 +120,14 @@ fn main_0() -> i32 { ); ({ bar_1(Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(2_i16)).as_pointer(), |__k| cpp_move!(__k), )) }); assert!( ((Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(2_i16)).as_pointer(), |__k| cpp_move!(__k) ) @@ -135,28 +135,28 @@ fn main_0() -> i32 { == 4_u32) ); let __rhs = (Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(0_i16)).as_pointer(), |__k| cpp_move!(__k), ) .read()) .wrapping_add( (Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(2_i16)).as_pointer(), |__k| cpp_move!(__k), ) .read()), ); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(0_i16)).as_pointer(), |__k| cpp_move!(__k), ) .write(__rhs); assert!( ((Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(0_i16)).as_pointer(), |__k| cpp_move!(__k) ) @@ -164,16 +164,16 @@ fn main_0() -> i32 { == 5_u32) ); let end: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), )); let it: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&1_i16)), )); let const_it: Value, Value)>> = Rc::new(RefCell::new( , Value)>>::from( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&10_i16)), ), )); @@ -194,7 +194,7 @@ fn main_0() -> i32 { }; assert!((x2 == 0_u32)); let mut x3: u32 = if (*it.borrow()) - == (m.as_pointer() as Ptr, Value)>>) + == m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) { 0_u32 @@ -204,7 +204,7 @@ fn main_0() -> i32 { assert!((x3 == 4_u32)); let mut x4: u32 = if (*const_it.borrow()) == , Value)>>::from( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { 0_u32 @@ -215,13 +215,13 @@ fn main_0() -> i32 { }; assert!((x4 == 0_u32)); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(4_i16)).as_pointer(), |__k| cpp_move!(__k), ) .write(5_u32); let it4: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&4_i16)), )); let mut p: Ptr = ((*(*it4.borrow()).iter_deref().upgrade().deref()) @@ -230,7 +230,7 @@ fn main_0() -> i32 { let mut x5: u32 = (p.read()); assert!( ((Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(4_i16)).as_pointer(), |__k| cpp_move!(__k) ) @@ -243,7 +243,7 @@ fn main_0() -> i32 { p.with_mut(|__v| __v.prefix_inc()); assert!( ((Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(4_i16)).as_pointer(), |__k| cpp_move!(__k) ) @@ -255,7 +255,7 @@ fn main_0() -> i32 { assert!((x5 == 5_u32)); let const_it4: Value, Value)>> = Rc::new(RefCell::new( , Value)>>::from( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&4_i16)), ), )); @@ -268,93 +268,74 @@ fn main_0() -> i32 { let r: Ptr, Value)>> = m.as_pointer(); assert!(((*r.upgrade().deref()).len() == 4_usize)); assert!( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&4_i16)) - != (m.as_pointer() as Ptr, Value)>>) + != m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) ); { let __it = (*it4.borrow()).clone(); - Map::erase( - ((r).clone() as Ptr, Value)>>), - &__it, - ) + Map::erase((r).clone(), &__it) }; assert!(((*r.upgrade().deref()).len() == 3_usize)); assert!( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&4_i16)) - == (m.as_pointer() as Ptr, Value)>>) + == m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) ); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(7_i16)).as_pointer(), |__k| cpp_move!(__k), ) .write(7_u32); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(8_i16)).as_pointer(), |__k| cpp_move!(__k), ) .write(8_u32); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(9_i16)).as_pointer(), |__k| cpp_move!(__k), ) .write(9_u32); assert!(((*r.upgrade().deref()).len() == 6_usize)); - assert!( - (Map::erase_key( - (m.as_pointer() as Ptr, Value)>>), - &10_i16 - ) == 0_usize) - ); + assert!((Map::erase_key(m.as_pointer(), &10_i16) == 0_usize)); let mut key9: i32 = 9; - assert!( - (Map::erase_key( - (m.as_pointer() as Ptr, Value)>>), - &(key9 as i16) - ) == 1_usize) - ); + assert!((Map::erase_key(m.as_pointer(), &(key9 as i16)) == 1_usize)); assert!(((*r.upgrade().deref()).len() == 5_usize)); let cit: Value, Value)>> = Rc::new(RefCell::new( , Value)>>::from( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&7_i16)), ), )); let next: Value, Value)>> = Rc::new(RefCell::new({ let __it = (*cit.borrow()).clone(); - Map::erase( - (m.as_pointer() as Ptr, Value)>>), - &__it, - ) + Map::erase(m.as_pointer(), &__it) })); assert!( (*next.borrow()) - == (m.as_pointer() as Ptr, Value)>>) + == m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&8_i16)) ); (*next.borrow_mut()) = { let __it = (*next.borrow()).clone(); - Map::erase( - (m.as_pointer() as Ptr, Value)>>), - &__it, - ) + Map::erase(m.as_pointer(), &__it) }; assert!( (*next.borrow()) - == (m.as_pointer() as Ptr, Value)>>) + == m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) ); assert!(((*r.upgrade().deref()).len() == 3_usize)); assert!( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&8_i16)) - == (m.as_pointer() as Ptr, Value)>>) + == m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) ); let other_map: Value< @@ -366,30 +347,10 @@ fn main_0() -> i32 { Rc::new(RefCell::new(1.try_into().expect("failed conversion"))), ))); let mut value: f64 = 2_f64; - Map::subscript( - (other_map.as_pointer() - as Ptr, Value), (Value<(Value, Value)>, Value)>>), - &(*key0.borrow()), - ) - .write(value); - value = (Map::subscript( - (other_map.as_pointer() - as Ptr, Value), (Value<(Value, Value)>, Value)>>), - &(*key0.borrow()), - ) - .read()); + Map::subscript(other_map.as_pointer(), &(*key0.borrow())).write(value); + value = (Map::subscript(other_map.as_pointer(), &(*key0.borrow())).read()); assert!(((*other_map.borrow()).len() == 1_usize)); - assert!( - ((Map::subscript( - (other_map.as_pointer() - as Ptr< - Map<(Value, Value), (Value<(Value, Value)>, Value)>, - >), - &(*key0.borrow()) - ) - .read()) - == value) - ); + assert!(((Map::subscript(other_map.as_pointer(), &(*key0.borrow())).read()) == value)); assert!(((*m.borrow()).len() == 3_usize)); let mut k: i32 = 0; assert!( @@ -454,19 +415,15 @@ fn main_0() -> i32 { let mut i: u32 = 0_u32; 'loop_: while ((i as usize) < indexes.len()) { let __rhs = ((i).wrapping_rem(2_u32) != 0); - Map::subscript( - (m2.as_pointer() as Ptr, Value)>>), - &indexes[(i as usize)], - ) - .write(__rhs); + Map::subscript(m2.as_pointer(), &indexes[(i as usize)]).write(__rhs); i.prefix_inc(); } assert!(((*m2.borrow()).len() == indexes.len())); let mut last: i32 = -1_i32; 'loop_: for pair in IterRange::new( - (m2.as_pointer() as Ptr, Value)>>) + m2.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (m2.as_pointer() as Ptr, Value)>>) + m2.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let pair: Ptr<(Value, Value)> = pair.iter_deref(); diff --git a/tests/unit/out/refcount/map_copy.rs b/tests/unit/out/refcount/map_copy.rs index 4f5e43cab..8a97482c2 100644 --- a/tests/unit/out/refcount/map_copy.rs +++ b/tests/unit/out/refcount/map_copy.rs @@ -13,21 +13,21 @@ pub fn main() { fn main_0() -> i32 { let a: Value, Value)>> = Rc::new(RefCell::new(Map::new())); Map::subscript_move( - (a.as_pointer() as Ptr, Value)>>), + a.as_pointer(), Rc::new(RefCell::new(1)).as_pointer(), |__k| cpp_move!(__k), ) .write(10); let b: Value, Value)>> = Rc::new(RefCell::new((*a.borrow()).clone())); Map::subscript_move( - (b.as_pointer() as Ptr, Value)>>), + b.as_pointer(), Rc::new(RefCell::new(1)).as_pointer(), |__k| cpp_move!(__k), ) .write(20); assert!( ((Map::subscript_move( - (a.as_pointer() as Ptr, Value)>>), + a.as_pointer(), Rc::new(RefCell::new(1)).as_pointer(), |__k| cpp_move!(__k) ) @@ -36,21 +36,21 @@ fn main_0() -> i32 { ); let x: Value, Value)>> = Rc::new(RefCell::new(Map::new())); Map::subscript_move( - (x.as_pointer() as Ptr, Value)>>), + x.as_pointer(), Rc::new(RefCell::new(2)).as_pointer(), |__k| cpp_move!(__k), ) .write(3); let y: Value, Value)>> = Rc::new(RefCell::new((*x.borrow()).clone())); Map::subscript_move( - (y.as_pointer() as Ptr, Value)>>), + y.as_pointer(), Rc::new(RefCell::new(2)).as_pointer(), |__k| cpp_move!(__k), ) .write(4); assert!( ((Map::subscript_move( - (x.as_pointer() as Ptr, Value)>>), + x.as_pointer(), Rc::new(RefCell::new(2)).as_pointer(), |__k| cpp_move!(__k) ) diff --git a/tests/unit/out/refcount/map_key_copy_ctor.rs b/tests/unit/out/refcount/map_key_copy_ctor.rs index d6710835c..03442ec83 100644 --- a/tests/unit/out/refcount/map_key_copy_ctor.rs +++ b/tests/unit/out/refcount/map_key_copy_ctor.rs @@ -98,27 +98,16 @@ fn main_0() -> i32 { let mut a: Key = Key::new({ 1 }); let mut b: Key = Key::new({ 2 }); let c: Value = Rc::new(RefCell::new(Key::new({ 3 }))); - Map::subscript( - (m.as_pointer() as Ptr, Value)>>), - &a, - ) - .write(10); + Map::subscript(m.as_pointer(), &a).write(10); ok = { ((ok as i32) & ((copies_0.with(|rc| *rc.borrow()) == 1) as i32)) != 0 }; - Map::subscript( - (m.as_pointer() as Ptr, Value)>>), - &b, - ) - .write(20); + Map::subscript(m.as_pointer(), &b).write(20); ok = { ((ok as i32) & ((copies_0.with(|rc| *rc.borrow()) == 2) as i32)) != 0 }; - Map::subscript( - (m.as_pointer() as Ptr, Value)>>), - &a, - ) - .write(11); + Map::subscript(m.as_pointer(), &a).write(11); ok = { ((ok as i32) & ((copies_0.with(|rc| *rc.borrow()) == 2) as i32)) != 0 }; { let rhs_0 = ((ok as i32) - & (((*(*(m.as_pointer() as Ptr, Value)>>) + & (((*(*m + .as_pointer() .with(|__m: &Map, Value)>| __m.find(&a)) .iter_deref() .upgrade() @@ -144,13 +133,13 @@ fn main_0() -> i32 { }; ok = { ((ok as i32) & ((copies_0.with(|rc| *rc.borrow()) == 2) as i32)) != 0 }; Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(({ make_key_3(4) }))).as_pointer(), |__k| cpp_move!(__k), ) .write(40); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(({ make_key_3(4) }))).as_pointer(), |__k| cpp_move!(__k), ) @@ -161,18 +150,8 @@ fn main_0() -> i32 { && (copies_0.with(|rc| *rc.borrow()) == 2)) as i32)) != 0 }; - Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), - c.as_pointer(), - |__k| cpp_move!(__k), - ) - .write(30); - Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), - c.as_pointer(), - |__k| cpp_move!(__k), - ) - .write(31); + Map::subscript_move(m.as_pointer(), c.as_pointer(), |__k| cpp_move!(__k)).write(30); + Map::subscript_move(m.as_pointer(), c.as_pointer(), |__k| cpp_move!(__k)).write(31); ok = { ((ok as i32) & ((((moves_1.with(|rc| *rc.borrow()) == 2) && (copies_0.with(|rc| *rc.borrow()) == 2)) @@ -185,8 +164,9 @@ fn main_0() -> i32 { }; { Map::subscript( - (m.as_pointer() as Ptr, Value)>>), - &(*(*(m.as_pointer() as Ptr, Value)>>) + m.as_pointer(), + &(*(*m + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()) .iter_deref() .upgrade() @@ -199,16 +179,12 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (((copies_0.with(|rc| *rc.borrow()) == 2) - && ((Map::subscript( - (m.as_pointer() as Ptr, Value)>>), - &a, - ) - .read()) - == 12)) as i32)) + && ((Map::subscript(m.as_pointer(), &a).read()) == 12)) as i32)) != 0; ok = rhs_0 }; - let mut first: Ptr = ((*(m.as_pointer() as Ptr, Value)>>) + let mut first: Ptr = ((*m + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()) .iter_deref() .upgrade() @@ -216,7 +192,7 @@ fn main_0() -> i32 { .0 .as_pointer()); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(Key::new({ 0 }))).as_pointer(), |__k| cpp_move!(__k), ) @@ -225,7 +201,7 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (({ - ((*(m.as_pointer() as Ptr, Value)>>) + ((*m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&a)) .iter_deref() .upgrade() @@ -241,46 +217,30 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & ((((*n.borrow()).len() == 5_usize) - && ((Map::subscript( - (n.as_pointer() as Ptr, Value)>>), - &a, - ) - .read()) - == 12)) as i32)) + && ((Map::subscript(n.as_pointer(), &a).read()) == 12)) as i32)) != 0; ok = rhs_0 }; { - let __it = (m.as_pointer() as Ptr, Value)>>) + let __it = m + .as_pointer() .with(|__m: &Map, Value)>| __m.find(&a)); - Map::erase( - (m.as_pointer() as Ptr, Value)>>), - &__it, - ) + Map::erase(m.as_pointer(), &__it) }; { - let rhs_0 = ((ok as i32) - & ((Map::erase_key( - (m.as_pointer() as Ptr, Value)>>), - &b, - ) == 1_usize) as i32)) - != 0; + let rhs_0 = ((ok as i32) & ((Map::erase_key(m.as_pointer(), &b) == 1_usize) as i32)) != 0; ok = rhs_0 }; { - let rhs_0 = ((ok as i32) - & ((Map::erase_key( - (m.as_pointer() as Ptr, Value)>>), - &b, - ) == 0_usize) as i32)) - != 0; + let rhs_0 = ((ok as i32) & ((Map::erase_key(m.as_pointer(), &b) == 0_usize) as i32)) != 0; ok = rhs_0 }; { let rhs_0 = ((ok as i32) & ((Map::erase_key( - (m.as_pointer() as Ptr, Value)>>), - &(*(*(m.as_pointer() as Ptr, Value)>>) + m.as_pointer(), + &(*(*m + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()) .iter_deref() .upgrade() @@ -305,9 +265,9 @@ fn main_0() -> i32 { }; let mut sum: i32 = 0; 'loop_: for entry in IterRange::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let entry: Ptr<(Value, Value)> = entry.iter_deref(); diff --git a/tests/unit/out/refcount/map_key_identity.rs b/tests/unit/out/refcount/map_key_identity.rs index 804d71c99..29388ee2d 100644 --- a/tests/unit/out/refcount/map_key_identity.rs +++ b/tests/unit/out/refcount/map_key_identity.rs @@ -124,28 +124,22 @@ fn main_0() -> i32 { ok = rhs_0 }; let distinct: Value, Value)>> = Rc::new(RefCell::new(Map::new())); - let a: Ptr = Map::subscript( - (distinct.as_pointer() as Ptr, Value)>>), - &(*distinct_a.borrow()), - ); + let a: Ptr = Map::subscript(distinct.as_pointer(), &(*distinct_a.borrow())); field!(a, value).write(11); - let a_it: Value, Value)>> = Rc::new(RefCell::new( - (distinct.as_pointer() as Ptr, Value)>>) - .with(|__m: &Map, Value)>| __m.find(&(*distinct_a.borrow()))), - )); + let a_it: Value, Value)>> = + Rc::new(RefCell::new(distinct.as_pointer().with( + |__m: &Map, Value)>| __m.find(&(*distinct_a.borrow())), + ))); let mut a_value: Ptr = ((*(*a_it.borrow()).iter_deref().upgrade().deref()) .1 .as_pointer()); ok = { ((ok as i32) & ((default_constructions_0.with(|rc| *rc.borrow()) == 1) as i32)) != 0 }; - let b: Ptr = Map::subscript( - (distinct.as_pointer() as Ptr, Value)>>), - &(*distinct_b.borrow()), - ); + let b: Ptr = Map::subscript(distinct.as_pointer(), &(*distinct_b.borrow())); field!(b, value).write(22); - let b_it: Value, Value)>> = Rc::new(RefCell::new( - (distinct.as_pointer() as Ptr, Value)>>) - .with(|__m: &Map, Value)>| __m.find(&(*distinct_b.borrow()))), - )); + let b_it: Value, Value)>> = + Rc::new(RefCell::new(distinct.as_pointer().with( + |__m: &Map, Value)>| __m.find(&(*distinct_b.borrow())), + ))); ok = { ((ok as i32) & ((default_constructions_0.with(|rc| *rc.borrow()) == 2) as i32)) != 0 }; { let rhs_0 = ((ok as i32) & (((*distinct.borrow()).len() == 2_usize) as i32)) != 0; @@ -160,25 +154,30 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (((*a_it.borrow()) - == (distinct.as_pointer() as Ptr, Value)>>).with( - |__m: &Map, Value)>| __m.find(&(*distinct_a.borrow())), - )) as i32)) + == distinct + .as_pointer() + .with(|__m: &Map, Value)>| { + __m.find(&(*distinct_a.borrow())) + })) as i32)) != 0; ok = rhs_0 }; { let rhs_0 = ((ok as i32) & (((*b_it.borrow()) - == (distinct.as_pointer() as Ptr, Value)>>).with( - |__m: &Map, Value)>| __m.find(&(*distinct_b.borrow())), - )) as i32)) + == distinct + .as_pointer() + .with(|__m: &Map, Value)>| { + __m.find(&(*distinct_b.borrow())) + })) as i32)) != 0; ok = rhs_0 }; { let rhs_0 = ((ok as i32) & (((*b_it.borrow()) - != (distinct.as_pointer() as Ptr, Value)>>) + != distinct + .as_pointer() .with(|__m: &Map, Value)>| __m.end())) as i32)) != 0; @@ -214,9 +213,11 @@ fn main_0() -> i32 { }; let mut distinct_count: usize = 0_usize; 'loop_: for entry in IterRange::new( - (distinct.as_pointer() as Ptr, Value)>>) + distinct + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (distinct.as_pointer() as Ptr, Value)>>) + distinct + .as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let entry: Ptr<(Value, Value)> = entry.iter_deref(); @@ -260,17 +261,12 @@ fn main_0() -> i32 { let equivalent: Value, Value)>> = Rc::new(RefCell::new(Map::new())); let mut before_equivalent: i32 = default_constructions_0.with(|rc| *rc.borrow()); - let first: Ptr = Map::subscript( - (equivalent.as_pointer() as Ptr, Value)>>), - &(*equivalent_a.borrow()), - ); + let first: Ptr = Map::subscript(equivalent.as_pointer(), &(*equivalent_a.borrow())); field!(first, value).write(31); let first_it: Value, Value)>> = - Rc::new(RefCell::new( - (equivalent.as_pointer() as Ptr, Value)>>).with( - |__m: &Map, Value)>| __m.find(&(*equivalent_a.borrow())), - ), - )); + Rc::new(RefCell::new(equivalent.as_pointer().with( + |__m: &Map, Value)>| __m.find(&(*equivalent_a.borrow())), + ))); let mut first_value: Ptr = ((*(*first_it.borrow()).iter_deref().upgrade().deref()) .1 .as_pointer()); @@ -279,10 +275,7 @@ fn main_0() -> i32 { & ((default_constructions_0.with(|rc| *rc.borrow()) == (before_equivalent + 1)) as i32)) != 0 }; - let second: Ptr = Map::subscript( - (equivalent.as_pointer() as Ptr, Value)>>), - &(*equivalent_b.borrow()), - ); + let second: Ptr = Map::subscript(equivalent.as_pointer(), &(*equivalent_b.borrow())); let mut reused: bool = (default_constructions_0.with(|rc| *rc.borrow()) == (before_equivalent + 1)); ok = { ((ok as i32) & (reused as i32)) != 0 }; @@ -294,7 +287,8 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (((*first_it.borrow()) - != (equivalent.as_pointer() as Ptr, Value)>>) + != equivalent + .as_pointer() .with(|__m: &Map, Value)>| __m.end())) as i32)) != 0; @@ -304,20 +298,22 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (((*first_it.borrow()) - == (equivalent.as_pointer() as Ptr, Value)>>) - .with(|__m: &Map, Value)>| { + == equivalent.as_pointer().with( + |__m: &Map, Value)>| { __m.find(&(*equivalent_a.borrow())) - })) as i32)) + }, + )) as i32)) != 0; ok = rhs_0 }; { let rhs_0 = ((ok as i32) & (((*first_it.borrow()) - == (equivalent.as_pointer() as Ptr, Value)>>) - .with(|__m: &Map, Value)>| { + == equivalent.as_pointer().with( + |__m: &Map, Value)>| { __m.find(&(*equivalent_b.borrow())) - })) as i32)) + }, + )) as i32)) != 0; ok = rhs_0 }; @@ -343,9 +339,11 @@ fn main_0() -> i32 { }; let mut equivalent_count: usize = 0_usize; 'loop_: for entry in IterRange::new( - (equivalent.as_pointer() as Ptr, Value)>>) + equivalent + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()), - (equivalent.as_pointer() as Ptr, Value)>>) + equivalent + .as_pointer() .with(|__m: &Map, Value)>| __m.end()), ) { let entry: Ptr<(Value, Value)> = entry.iter_deref(); @@ -373,10 +371,7 @@ fn main_0() -> i32 { order: 4, identity: 10, }; - let later: Ptr = Map::subscript( - (equivalent.as_pointer() as Ptr, Value)>>), - &later_key, - ); + let later: Ptr = Map::subscript(equivalent.as_pointer(), &later_key); field!(later, value).write(41); ok = { ((ok as i32) @@ -391,10 +386,11 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (((*first_it.borrow()) - == (equivalent.as_pointer() as Ptr, Value)>>) - .with(|__m: &Map, Value)>| { + == equivalent.as_pointer().with( + |__m: &Map, Value)>| { __m.find(&(*equivalent_a.borrow())) - })) as i32)) + }, + )) as i32)) != 0; ok = rhs_0 }; @@ -432,16 +428,12 @@ fn main_0() -> i32 { }; let mut before_matching: i32 = default_constructions_0.with(|rc| *rc.borrow()); let matching: Value, Value)>> = Rc::new(RefCell::new(Map::new())); - let matched: Ptr = Map::subscript( - (matching.as_pointer() as Ptr, Value)>>), - &matching_a, - ); + let matched: Ptr = Map::subscript(matching.as_pointer(), &matching_a); field!(matched, value).write(51); let matched_it: Value, Value)>> = - Rc::new(RefCell::new( - (matching.as_pointer() as Ptr, Value)>>) - .with(|__m: &Map, Value)>| __m.find(&matching_a)), - )); + Rc::new(RefCell::new(matching.as_pointer().with( + |__m: &Map, Value)>| __m.find(&matching_a), + ))); let mut matched_value: Ptr = ((*(*matched_it.borrow()).iter_deref().upgrade().deref()) .1 .as_pointer()); @@ -450,10 +442,7 @@ fn main_0() -> i32 { & ((default_constructions_0.with(|rc| *rc.borrow()) == (before_matching + 1)) as i32)) != 0 }; - let matched_again: Ptr = Map::subscript( - (matching.as_pointer() as Ptr, Value)>>), - &matching_b, - ); + let matched_again: Ptr = Map::subscript(matching.as_pointer(), &matching_b); ok = { ((ok as i32) & ((default_constructions_0.with(|rc| *rc.borrow()) == (before_matching + 1)) as i32)) @@ -467,7 +456,8 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (((*matched_it.borrow()) - == (matching.as_pointer() as Ptr, Value)>>) + == matching + .as_pointer() .with(|__m: &Map, Value)>| __m.find(&matching_b))) as i32)) != 0; @@ -492,10 +482,7 @@ fn main_0() -> i32 { != 0; ok = rhs_0 }; - let other: Ptr = Map::subscript( - (matching.as_pointer() as Ptr, Value)>>), - &matching_c, - ); + let other: Ptr = Map::subscript(matching.as_pointer(), &matching_c); field!(other, value).write(61); ok = { ((ok as i32) @@ -509,7 +496,8 @@ fn main_0() -> i32 { { let rhs_0 = ((ok as i32) & (((*matched_it.borrow()) - == (matching.as_pointer() as Ptr, Value)>>) + == matching + .as_pointer() .with(|__m: &Map, Value)>| __m.find(&matching_a))) as i32)) != 0; diff --git a/tests/unit/out/refcount/operator_traits.rs b/tests/unit/out/refcount/operator_traits.rs index e045f2118..ac16005fa 100644 --- a/tests/unit/out/refcount/operator_traits.rs +++ b/tests/unit/out/refcount/operator_traits.rs @@ -165,24 +165,22 @@ fn main_0() -> i32 { Lt { v: 2 }, ]))); { - let __n = (lts.as_pointer() as Ptr) + let __n = lts + .as_pointer() + .decay() .end() - .iter_distance(&(lts.as_pointer() as Ptr).begin()); + .iter_distance(<s.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (lts.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (lts.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) - }); - reorder(__order, |__i| { - (lts.as_pointer() as Ptr).begin().iter_at(__i) + lts.as_pointer().decay().begin().iter_at(__x).with(|__a| { + lts.as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); + reorder(__order, |__i| lts.as_pointer().decay().begin().iter_at(__i)); }; assert!( (({ (*lts.borrow())[0_usize].v } == 1) && ({ (*lts.borrow())[1_usize].v } == 2)) @@ -197,8 +195,8 @@ fn main_0() -> i32 { let mut nine: Eq = Eq { v: 9 }; assert!( ({ - let mut __it = (eqs.as_pointer() as Ptr).begin(); - while __it != (eqs.as_pointer() as Ptr).end() + let mut __it = eqs.as_pointer().decay().begin(); + while __it != eqs.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != two) { __it.iter_inc(); @@ -211,14 +209,14 @@ fn main_0() -> i32 { ); assert!( { - let mut __it = (eqs.as_pointer() as Ptr).begin(); - while __it != (eqs.as_pointer() as Ptr).end() + let mut __it = eqs.as_pointer().decay().begin(); + while __it != eqs.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != nine) { __it.iter_inc(); } __it - } == (eqs.as_pointer() as Ptr).end() + } == eqs.as_pointer().decay().end() ); let cmps: Value> = Rc::new(RefCell::new(Vec::from([ Cmp { v: 3 }, @@ -226,31 +224,31 @@ fn main_0() -> i32 { Cmp { v: 2 }, ]))); { - let __n = (cmps.as_pointer() as Ptr) + let __n = cmps + .as_pointer() + .decay() .end() - .iter_distance(&(cmps.as_pointer() as Ptr).begin()); + .iter_distance(&cmps.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (cmps.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (cmps.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) + cmps.as_pointer().decay().begin().iter_at(__x).with(|__a| { + cmps.as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); reorder(__order, |__i| { - (cmps.as_pointer() as Ptr).begin().iter_at(__i) + cmps.as_pointer().decay().begin().iter_at(__i) }); }; assert!(({ (*cmps.borrow())[0_usize].v } == 1) && ({ (*cmps.borrow())[2_usize].v } == 3)); let mut three: Cmp = Cmp { v: 3 }; assert!( ({ - let mut __it = (cmps.as_pointer() as Ptr).begin(); - while __it != (cmps.as_pointer() as Ptr).end() + let mut __it = cmps.as_pointer().decay().begin(); + while __it != cmps.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != three) { __it.iter_inc(); @@ -263,31 +261,32 @@ fn main_0() -> i32 { ); let frees: Value> = Rc::new(RefCell::new(Vec::from([Free { v: 2 }, Free { v: 1 }]))); { - let __n = (frees.as_pointer() as Ptr) + let __n = frees + .as_pointer() + .decay() .end() - .iter_distance(&(frees.as_pointer() as Ptr).begin()); + .iter_distance(&frees.as_pointer().decay().begin()); let mut __order: Vec = (0..__n).collect(); __order.sort_by(|&__x, &__y| { - (frees.as_pointer() as Ptr) - .begin() - .iter_at(__x) - .with(|__a| { - (frees.as_pointer() as Ptr) - .begin() - .iter_at(__y) - .with(|__b| __a.cmp(__b)) - }) + frees.as_pointer().decay().begin().iter_at(__x).with(|__a| { + frees + .as_pointer() + .decay() + .begin() + .iter_at(__y) + .with(|__b| __a.cmp(__b)) + }) }); reorder(__order, |__i| { - (frees.as_pointer() as Ptr).begin().iter_at(__i) + frees.as_pointer().decay().begin().iter_at(__i) }); }; assert!(({ (*frees.borrow())[0_usize].v } == 1)); let mut ftwo: Free = Free { v: 2 }; assert!( ({ - let mut __it = (frees.as_pointer() as Ptr).begin(); - while __it != (frees.as_pointer() as Ptr).end() + let mut __it = frees.as_pointer().decay().begin(); + while __it != frees.as_pointer().decay().end() && __it.iter_deref().with(|__v| *__v != ftwo) { __it.iter_inc(); @@ -300,19 +299,20 @@ fn main_0() -> i32 { ); let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(Lt { v: 2 })).as_pointer(), |__k| cpp_move!(__k), ) .write(20); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(Lt { v: 1 })).as_pointer(), |__k| cpp_move!(__k), ) .write(10); assert!( - ((*(*(m.as_pointer() as Ptr, Value)>>) + ((*(*m + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()) .iter_deref() .upgrade() @@ -323,7 +323,7 @@ fn main_0() -> i32 { ); assert!( ((Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(Lt { v: 2 })).as_pointer(), |__k| cpp_move!(__k) ) diff --git a/tests/unit/out/refcount/redundant_copy_in_conversion.rs b/tests/unit/out/refcount/redundant_copy_in_conversion.rs index bb8163ded..d71efdc68 100644 --- a/tests/unit/out/refcount/redundant_copy_in_conversion.rs +++ b/tests/unit/out/refcount/redundant_copy_in_conversion.rs @@ -26,17 +26,17 @@ pub fn main() { fn main_0() -> i32 { let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(0)).as_pointer(), |__k| cpp_move!(__k), ) .write(1); let end: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.end()), )); let it0: Value, Value)>> = Rc::new(RefCell::new( - (m.as_pointer() as Ptr, Value)>>) + m.as_pointer() .with(|__m: &Map, Value)>| __m.find(&0)), )); let const_it: Value, Value)>> = Rc::new(RefCell::new( diff --git a/tests/unit/out/refcount/rvalue_rule_arg_move.rs b/tests/unit/out/refcount/rvalue_rule_arg_move.rs index c0e534c99..80d3dc2be 100644 --- a/tests/unit/out/refcount/rvalue_rule_arg_move.rs +++ b/tests/unit/out/refcount/rvalue_rule_arg_move.rs @@ -56,14 +56,14 @@ fn main_0() -> i32 { let a: Value = Rc::new(RefCell::new(Elem::new({ 1 }))); let mut b: Elem = Elem::new({ 2 }); { - let __off = >::from((v.as_pointer() as Ptr).end()).index(); + let __off = >::from(v.as_pointer().decay().end()).index(); (*v.borrow_mut()).insert(__off, Elem::move_from({ a.as_pointer() })); - >::from((v.as_pointer() as Ptr).end()) + >::from(v.as_pointer().decay().end()) }; { - let __off = >::from((v.as_pointer() as Ptr).end()).index(); + let __off = >::from(v.as_pointer().decay().end()).index(); (*v.borrow_mut()).insert(__off, (b).clone()); - >::from((v.as_pointer() as Ptr).end()) + >::from(v.as_pointer().decay().end()) }; let mut ok: bool = (((copies_0.with(|rc| *rc.borrow()) == 1) && (moves_1.with(|rc| *rc.borrow()) == 1)) diff --git a/tests/unit/out/refcount/swap_map_no_copy.rs b/tests/unit/out/refcount/swap_map_no_copy.rs index ae5683659..2a67cc2fb 100644 --- a/tests/unit/out/refcount/swap_map_no_copy.rs +++ b/tests/unit/out/refcount/swap_map_no_copy.rs @@ -227,7 +227,7 @@ fn main_0() -> i32 { let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 10 }))); TrackedImpl::move_assign( &Map::subscript_move( - (m1.as_pointer() as Ptr, Value)>>), + m1.as_pointer(), Rc::new(RefCell::new(1)).as_pointer(), |__k| cpp_move!(__k), ), @@ -238,7 +238,7 @@ fn main_0() -> i32 { let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 20 }))); TrackedImpl::move_assign( &Map::subscript_move( - (m1.as_pointer() as Ptr, Value)>>), + m1.as_pointer(), Rc::new(RefCell::new(2)).as_pointer(), |__k| cpp_move!(__k), ), @@ -250,7 +250,7 @@ fn main_0() -> i32 { let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 30 }))); TrackedImpl::move_assign( &Map::subscript_move( - (m2.as_pointer() as Ptr, Value)>>), + m2.as_pointer(), Rc::new(RefCell::new(3)).as_pointer(), |__k| cpp_move!(__k), ), @@ -260,26 +260,26 @@ fn main_0() -> i32 { assert!((copies_0.with(|rc| *rc.borrow()) == 0)); cpp_swap!( Map::subscript_move( - (m1.as_pointer() as Ptr, Value)>>), + m1.as_pointer(), Rc::new(RefCell::new(1)).as_pointer(), |__k| cpp_move!(__k) ), Map::subscript_move( - (m1.as_pointer() as Ptr, Value)>>), + m1.as_pointer(), Rc::new(RefCell::new(2)).as_pointer(), |__k| cpp_move!(__k) ) ); assert!( (Map::subscript_move( - (m1.as_pointer() as Ptr, Value)>>), + m1.as_pointer(), Rc::new(RefCell::new(1)).as_pointer(), |__k| cpp_move!(__k) ) .with(|__s| __s.v) == 20) && (Map::subscript_move( - (m1.as_pointer() as Ptr, Value)>>), + m1.as_pointer(), Rc::new(RefCell::new(2)).as_pointer(), |__k| cpp_move!(__k) ) @@ -291,7 +291,7 @@ fn main_0() -> i32 { assert!( ((*m1.borrow()).len() == 1_usize) && (Map::subscript_move( - (m1.as_pointer() as Ptr, Value)>>), + m1.as_pointer(), Rc::new(RefCell::new(3)).as_pointer(), |__k| cpp_move!(__k) ) @@ -301,14 +301,14 @@ fn main_0() -> i32 { assert!( (((*m2.borrow()).len() == 2_usize) && (Map::subscript_move( - (m2.as_pointer() as Ptr, Value)>>), + m2.as_pointer(), Rc::new(RefCell::new(1)).as_pointer(), |__k| cpp_move!(__k) ) .with(|__s| __s.v) == 20)) && (Map::subscript_move( - (m2.as_pointer() as Ptr, Value)>>), + m2.as_pointer(), Rc::new(RefCell::new(2)).as_pointer(), |__k| cpp_move!(__k) ) @@ -344,8 +344,8 @@ fn main_0() -> i32 { (*vec_.borrow_mut()).push(__init) }; cpp_swap!( - (vec_.as_pointer() as Ptr).offset(0_usize), - (vec_.as_pointer() as Ptr).offset(1_usize) + vec_.as_pointer().decay().offset(0_usize), + vec_.as_pointer().decay().offset(1_usize) ); assert!(({ (*vec_.borrow())[0_usize].v } == 5) && ({ (*vec_.borrow())[1_usize].v } == 4)); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); @@ -415,61 +415,42 @@ fn main_0() -> i32 { )); { let __init = Tracked::new_2({ 1 }); - elem!((grid.as_pointer() as Ptr>), 0_usize) + elem!(grid.as_pointer().decay(), 0_usize) .with_mut(|__v: &mut Vec| __v.push(__init)) }; { let __init = Tracked::new_2({ 2 }); - elem!((grid.as_pointer() as Ptr>), 0_usize) + elem!(grid.as_pointer().decay(), 0_usize) .with_mut(|__v: &mut Vec| __v.push(__init)) }; { let __init = Tracked::new_2({ 3 }); - elem!((grid.as_pointer() as Ptr>), 1_usize) + elem!(grid.as_pointer().decay(), 1_usize) .with_mut(|__v: &mut Vec| __v.push(__init)) }; cpp_swap!( - ((grid.as_pointer() as Ptr>) + grid.as_pointer() + .decay() .offset(0_usize) - .as_pointer() as Ptr) + .decay() .offset(1_usize), - ((grid.as_pointer() as Ptr>) + grid.as_pointer() + .decay() .offset(1_usize) - .as_pointer() as Ptr) + .decay() .offset(0_usize) ); assert!( - (index!( - elem!((grid.as_pointer() as Ptr>), 0_usize), - 1_usize - ) - .with(|__s| __s.v) - == 3) - && (index!( - elem!((grid.as_pointer() as Ptr>), 1_usize), - 0_usize - ) - .with(|__s| __s.v) - == 2) + (index!(elem!(grid.as_pointer().decay(), 0_usize), 1_usize).with(|__s| __s.v) == 3) + && (index!(elem!(grid.as_pointer().decay(), 1_usize), 0_usize).with(|__s| __s.v) == 2) ); cpp_swap!( - (grid.as_pointer() as Ptr>).offset(0_usize), - (grid.as_pointer() as Ptr>).offset(1_usize) + grid.as_pointer().decay().offset(0_usize), + grid.as_pointer().decay().offset(1_usize) ); assert!( - ((*((grid.as_pointer() as Ptr>) - .offset(0_usize) - .as_pointer() as Ptr>) - .upgrade() - .deref()) - .len() - == 1_usize) - && (index!( - elem!((grid.as_pointer() as Ptr>), 0_usize), - 0_usize - ) - .with(|__s| __s.v) - == 2) + ((*grid.as_pointer().decay().offset(0_usize).upgrade().deref()).len() == 1_usize) + && (index!(elem!(grid.as_pointer().decay(), 0_usize), 0_usize).with(|__s| __s.v) == 2) ); assert!((copies_0.with(|rc| *rc.borrow()) == 0)); let maps: Value, Value)>]>> = Rc::new(RefCell::new( @@ -481,8 +462,7 @@ fn main_0() -> i32 { let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 1 }))); TrackedImpl::move_assign( &Map::subscript_move( - ((maps.as_pointer() as Ptr, Value)>>).offset(0) - as Ptr, Value)>>), + (maps.as_pointer() as Ptr, Value)>>).offset(0), Rc::new(RefCell::new(1)).as_pointer(), |__k| cpp_move!(__k), ), @@ -493,8 +473,7 @@ fn main_0() -> i32 { let _o: Value = Rc::new(RefCell::new(Tracked::new_2({ 2 }))); TrackedImpl::move_assign( &Map::subscript_move( - ((maps.as_pointer() as Ptr, Value)>>).offset(1) - as Ptr, Value)>>), + (maps.as_pointer() as Ptr, Value)>>).offset(1), Rc::new(RefCell::new(2)).as_pointer(), |__k| cpp_move!(__k), ), @@ -508,8 +487,7 @@ fn main_0() -> i32 { assert!( ((*maps.borrow())[(0) as usize].len() == 1_usize) && (Map::subscript_move( - ((maps.as_pointer() as Ptr, Value)>>).offset(0) - as Ptr, Value)>>), + (maps.as_pointer() as Ptr, Value)>>).offset(0), Rc::new(RefCell::new(2)).as_pointer(), |__k| cpp_move!(__k) ) @@ -519,8 +497,7 @@ fn main_0() -> i32 { assert!( ((*maps.borrow())[(1) as usize].len() == 1_usize) && (Map::subscript_move( - ((maps.as_pointer() as Ptr, Value)>>).offset(1) - as Ptr, Value)>>), + (maps.as_pointer() as Ptr, Value)>>).offset(1), Rc::new(RefCell::new(1)).as_pointer(), |__k| cpp_move!(__k) ) @@ -728,7 +705,7 @@ pub trait OwnerImpl { } impl OwnerImpl for Ptr { fn move_assign(&self, _a0: Ptr) -> Ptr { - (field_ptr!((*self), p) as Ptr>>) + field_ptr!((*self), p) .write(field!(_a0, p).with_mut(|__v: &mut Option>| __v.take())); return (*self).clone(); } diff --git a/tests/unit/out/refcount/vector_iter_range_ctor.rs b/tests/unit/out/refcount/vector_iter_range_ctor.rs index 45ee37119..30339d783 100644 --- a/tests/unit/out/refcount/vector_iter_range_ctor.rs +++ b/tests/unit/out/refcount/vector_iter_range_ctor.rs @@ -74,29 +74,30 @@ fn main_0() -> i32 { assert!(((v5[0_usize] as i32) == 10) && ((v5[4_usize] as i32) == 50)); let m: Value, Value)>> = Rc::new(RefCell::new(Map::new())); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(1)).as_pointer(), |__k| cpp_move!(__k), ) .write(10); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(2)).as_pointer(), |__k| cpp_move!(__k), ) .write(20); Map::subscript_move( - (m.as_pointer() as Ptr, Value)>>), + m.as_pointer(), Rc::new(RefCell::new(3)).as_pointer(), |__k| cpp_move!(__k), ) .write(30); let v6: Value, Value)>> = Rc::new(RefCell::new({ let mut __v = Vec::new(); - let mut __it = (m.as_pointer() as Ptr, Value)>>) + let mut __it = m + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()); while __it - != (m.as_pointer() as Ptr, Value)>>) + != m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) { __v.push( @@ -119,29 +120,25 @@ fn main_0() -> i32 { ); { let start_idx = , Value)>>::from( - (v6.as_pointer() as Ptr<(Value, Value)>) - .begin() - .iter_add(1_isize), + v6.as_pointer().decay().begin().iter_add(1_isize), ) .index(); let mut temp_vec: Vec<(Value, Value)> = Vec::new(); - let mut __it = (m.as_pointer() as Ptr, Value)>>) + let mut __it = m + .as_pointer() .with(|__m: &Map, Value)>| __m.begin()); while __it - != (m.as_pointer() as Ptr, Value)>>) + != m.as_pointer() .with(|__m: &Map, Value)>| __m.end()) { temp_vec.push(__it.iter_deref().read()); __it.iter_inc(); } - (v6.as_pointer() as Ptr, Value)>>).with_mut( - |v: &mut Vec<(Value, Value)>| { + v6.as_pointer() + .with_mut(|v: &mut Vec<(Value, Value)>| { v.splice(start_idx..start_idx, temp_vec); - }, - ); - RandomAccessIterator::Vec( - (v6.as_pointer() as Ptr, Value)>>).decay() + start_idx, - ) + }); + RandomAccessIterator::Vec(v6.as_pointer().decay() + start_idx) }; assert!(((*v6.borrow()).len() == 6_usize)); assert!( From b028befbf91e780592121ea6024fdced16c21f71 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 10:33:27 +0100 Subject: [PATCH 44/62] Add more rules --- rules/allocator_traits/src.cpp | 3 +++ rules/allocator_traits/tgt_unsafe.rs | 4 ++++ rules/functional/src.cpp | 3 +++ rules/functional/tgt_unsafe.rs | 4 ++++ rules/string/src.cpp | 1 + rules/string/src_cxx17.cpp | 3 +++ rules/string/tgt_refcount.rs | 8 ++++++++ rules/string/tgt_unsafe.rs | 8 ++++++++ 8 files changed, 34 insertions(+) diff --git a/rules/allocator_traits/src.cpp b/rules/allocator_traits/src.cpp index d39313344..49bf09cfb 100644 --- a/rules/allocator_traits/src.cpp +++ b/rules/allocator_traits/src.cpp @@ -5,3 +5,6 @@ template using t1 = typename std::allocator_traits::value_type; + +template +using t2 = typename std::allocator_traits::size_type; diff --git a/rules/allocator_traits/tgt_unsafe.rs b/rules/allocator_traits/tgt_unsafe.rs index eb48fd0c0..7b101e582 100644 --- a/rules/allocator_traits/tgt_unsafe.rs +++ b/rules/allocator_traits/tgt_unsafe.rs @@ -4,3 +4,7 @@ fn t1() -> T1 { unimplemented!() } + +fn t2() -> usize { + 0_usize +} diff --git a/rules/functional/src.cpp b/rules/functional/src.cpp index f788ba082..699e65f14 100644 --- a/rules/functional/src.cpp +++ b/rules/functional/src.cpp @@ -5,6 +5,9 @@ template using t1 = std::reference_wrapper; +template +using t2 = typename std::reference_wrapper::type; + template std::reference_wrapper f1(T1 &a0) { return std::reference_wrapper(a0); } diff --git a/rules/functional/tgt_unsafe.rs b/rules/functional/tgt_unsafe.rs index 973000c44..96f576023 100644 --- a/rules/functional/tgt_unsafe.rs +++ b/rules/functional/tgt_unsafe.rs @@ -5,6 +5,10 @@ fn t1() -> *mut T1 { Default::default() } +fn t2() -> T1 { + unimplemented!() +} + unsafe fn f1(a0: *mut T1) -> *mut T1 { a0 } diff --git a/rules/string/src.cpp b/rules/string/src.cpp index eda350d5e..a17d32bdb 100644 --- a/rules/string/src.cpp +++ b/rules/string/src.cpp @@ -10,6 +10,7 @@ using t4 = std::basic_string; typedef std::string::size_type t3; using t5 = std::string::reference; using t6 = std::string::const_reference; +typedef std::string::value_type t7; std::string f1(const std::string &s, std::size_t pos, std::size_t count) { return s.substr(pos, count); diff --git a/rules/string/src_cxx17.cpp b/rules/string/src_cxx17.cpp index 3ad1e6587..a938aecc7 100644 --- a/rules/string/src_cxx17.cpp +++ b/rules/string/src_cxx17.cpp @@ -1,6 +1,9 @@ // Copyright (c) 2022-present INESC-ID. // Distributed under the MIT license that can be found in the LICENSE file. +#include #include +typedef std::filesystem::path::string_type t8; + auto f6(std::string &s) -> decltype(s.data()) { return s.data(); } diff --git a/rules/string/tgt_refcount.rs b/rules/string/tgt_refcount.rs index 35eec7587..1dd47416e 100644 --- a/rules/string/tgt_refcount.rs +++ b/rules/string/tgt_refcount.rs @@ -21,6 +21,14 @@ fn t6() -> Ptr { Ptr::null() } +fn t7() -> i8 { + 0_i8 +} + +fn t8() -> Vec { + vec![0] +} + fn f1(a0: Vec, a1: usize, a2: usize) -> Vec { let mut __tmp1 = a0[(a1) as usize..::std::cmp::min((a1 + a2) as usize, a0.len().saturating_sub(1))].to_vec(); diff --git a/rules/string/tgt_unsafe.rs b/rules/string/tgt_unsafe.rs index db1871597..569df08eb 100644 --- a/rules/string/tgt_unsafe.rs +++ b/rules/string/tgt_unsafe.rs @@ -23,6 +23,14 @@ fn t3() -> usize { 0_usize } +fn t7() -> libc::c_char { + 0 as libc::c_char +} + +fn t8() -> Vec { + vec![0] +} + unsafe fn f1(a0: Vec, a1: usize, a2: usize) -> Vec { let mut __tmp1 = a0[(a1) as usize..::std::cmp::min((a1 + a2) as usize, a0.len() - 1)].to_vec(); __tmp1.push(0); From 35243a22b42be35ee0b7ddec6ce344000d5f4809 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 10:33:41 +0100 Subject: [PATCH 45/62] Ignore internal private/protected typedefs --- cpp2rust/converter/rules/type_matcher.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cpp2rust/converter/rules/type_matcher.cpp b/cpp2rust/converter/rules/type_matcher.cpp index 97fc6c116..fc1f6bae0 100644 --- a/cpp2rust/converter/rules/type_matcher.cpp +++ b/cpp2rust/converter/rules/type_matcher.cpp @@ -56,6 +56,10 @@ clang::QualType peelSugar(clang::ASTContext &ctx, clang::QualType type) { } bool isInternal(const clang::NamedDecl *decl) { + if (decl->getAccess() == clang::AS_private || + decl->getAccess() == clang::AS_protected) { + return true; + } auto &opts = decl->getASTContext().getLangOpts(); if (decl->isReserved(opts) != clang::ReservedIdentifierStatus::NotReserved) { return true; From f3d9ac6ec983b43e004a79db8f1e9c3e622d86c1 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 10:42:41 +0100 Subject: [PATCH 46/62] Fix glibc private typedefs like __off_t --- cpp2rust/converter/rules/registry.cpp | 18 ++++++++++ cpp2rust/converter/rules/type_matcher.cpp | 18 ++++++++++ cpp2rust/converter/rules/type_matcher.h | 3 ++ rules/allocator_traits/src.cpp | 3 +- rules/functional/src.cpp | 3 +- tests/unit/out/refcount/sys_stat.rs | 40 ++++++++++++--------- tests/unit/out/unsafe/sys_stat.rs | 44 +++++++++++++---------- 7 files changed, 89 insertions(+), 40 deletions(-) diff --git a/cpp2rust/converter/rules/registry.cpp b/cpp2rust/converter/rules/registry.cpp index 3b0279dd9..0a689299c 100644 --- a/cpp2rust/converter/rules/registry.cpp +++ b/cpp2rust/converter/rules/registry.cpp @@ -274,6 +274,24 @@ struct TypeRuleMatch { TypeRuleMatch findType(clang::QualType use) { TypeRuleMatch best; + for (auto key : RuleKeys::GetTypeKeys(sema_->Context, use)) { + auto [begin, end] = types_.equal_range(key); + for (auto it = begin; it != end; ++it) { + if (!AstMatcher::MatchPublicAlias(sema_->Context, use, it->second.decl)) { + continue; + } + if (best.rule_decl) { + use.dump(llvm::errs(), sema_->Context); + it->second.decl->dump(llvm::errs()); + best.rule_decl->decl->dump(llvm::errs()); + llvm::report_fatal_error("type matches several public aliases"); + } + best = {&it->second, {}}; + } + } + if (best.rule_decl) { + return best; + } use = AstMatcher::SkipInternalTypedefs(sema_->Context, use); if (auto tag = use->getAsTagDecl(); tag && diff --git a/cpp2rust/converter/rules/type_matcher.cpp b/cpp2rust/converter/rules/type_matcher.cpp index fc1f6bae0..642d188a9 100644 --- a/cpp2rust/converter/rules/type_matcher.cpp +++ b/cpp2rust/converter/rules/type_matcher.cpp @@ -156,6 +156,24 @@ std::optional MatchType(clang::Sema &sema, clang::QualType use, return std::nullopt; } +bool MatchPublicAlias(clang::ASTContext &ctx, clang::QualType use, + const clang::NamedDecl *rule) { + auto internal = + llvm::dyn_cast(peelSugar(ctx, use).getTypePtr()); + auto alias = llvm::dyn_cast(rule); + if (!internal || !alias || !isInternal(internal->getDecl()) || + IsUserDefinedDecl(internal->getDecl())) { + return false; + } + auto pattern = llvm::dyn_cast( + peelSugar(ctx, alias->getUnderlyingType()).getTypePtr()); + if (!pattern || isInternal(pattern->getDecl())) { + return false; + } + auto target = peelSugar(ctx, pattern->getDecl()->getUnderlyingType()); + return isSameSugar(target.getTypePtr(), internal); +} + clang::QualType SkipInternalTypedefs(clang::ASTContext &ctx, clang::QualType use) { auto cvr = use.getLocalCVRQualifiers(); diff --git a/cpp2rust/converter/rules/type_matcher.h b/cpp2rust/converter/rules/type_matcher.h index 8b5826110..1c6cf62d3 100644 --- a/cpp2rust/converter/rules/type_matcher.h +++ b/cpp2rust/converter/rules/type_matcher.h @@ -19,6 +19,9 @@ struct TypeMatch { std::optional MatchType(clang::Sema &sema, clang::QualType use, const clang::NamedDecl *rule); +bool MatchPublicAlias(clang::ASTContext &ctx, clang::QualType use, + const clang::NamedDecl *rule); + clang::QualType SkipInternalTypedefs(clang::ASTContext &ctx, clang::QualType use); diff --git a/rules/allocator_traits/src.cpp b/rules/allocator_traits/src.cpp index 49bf09cfb..5a8a22e6f 100644 --- a/rules/allocator_traits/src.cpp +++ b/rules/allocator_traits/src.cpp @@ -6,5 +6,4 @@ template using t1 = typename std::allocator_traits::value_type; -template -using t2 = typename std::allocator_traits::size_type; +template using t2 = typename std::allocator_traits::size_type; diff --git a/rules/functional/src.cpp b/rules/functional/src.cpp index 699e65f14..5d72932d6 100644 --- a/rules/functional/src.cpp +++ b/rules/functional/src.cpp @@ -5,8 +5,7 @@ template using t1 = std::reference_wrapper; -template -using t2 = typename std::reference_wrapper::type; +template using t2 = typename std::reference_wrapper::type; template std::reference_wrapper f1(T1 &a0) { return std::reference_wrapper(a0); diff --git a/tests/unit/out/refcount/sys_stat.rs b/tests/unit/out/refcount/sys_stat.rs index 45e28f069..0d6ef8c56 100644 --- a/tests/unit/out/refcount/sys_stat.rs +++ b/tests/unit/out/refcount/sys_stat.rs @@ -45,7 +45,7 @@ pub fn test_stat_0() { != 0) ); assert!(((({ (*st.borrow()).st_size } == 5_i64) as i32) != 0)); - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) > 0_i64) as i32) != 0)); + assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) > 0 as ::libc::time_t) as i32) != 0)); match nix::unistd::unlink(path.to_rust_string().as_str()) { Ok(()) => 0, Err(__e) => { @@ -87,7 +87,7 @@ pub fn test_fstat_1() { != 0) ); assert!(((({ (*st.borrow()).st_size } == 11_i64) as i32) != 0)); - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) > 0_i64) as i32) != 0)); + assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) > 0 as ::libc::time_t) as i32) != 0)); assert!( ((({ let __r = fp.with(|__f| __f.close()); @@ -107,30 +107,36 @@ pub fn test_fstat_1() { pub fn test_st_mtime_access_2() { let st: Value = Rc::new(RefCell::new(Default::default())); let mut sp: Ptr = (st.as_pointer()); - field_ptr!(st.as_pointer(), st_mtime).write(5_i64); - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 5_i64) as i32) != 0)); - field_ptr!(sp, st_mtime).write(6_i64); - assert!(((((field_ptr!(sp, st_mtime).read()) == 6_i64) as i32) != 0)); + field_ptr!(st.as_pointer(), st_mtime).write((5 as ::libc::time_t)); + assert!( + ((((field_ptr!(st.as_pointer(), st_mtime).read()) == (5 as ::libc::time_t)) as i32) != 0) + ); + field_ptr!(sp, st_mtime).write((6 as ::libc::time_t)); + assert!(((((field_ptr!(sp, st_mtime).read()) == (6 as ::libc::time_t)) as i32) != 0)); { - field_ptr!(st.as_pointer(), st_mtime).with_mut(|__v| *__v = *__v + 2_i64) + field_ptr!(st.as_pointer(), st_mtime).with_mut(|__v| *__v = *__v + (2 as ::libc::time_t)) }; - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 8_i64) as i32) != 0)); + assert!( + ((((field_ptr!(st.as_pointer(), st_mtime).read()) == (8 as ::libc::time_t)) as i32) != 0) + ); { - field_ptr!(sp, st_mtime).with_mut(|__v| *__v = *__v - 1_i64) + field_ptr!(sp, st_mtime).with_mut(|__v| *__v = *__v - (1 as ::libc::time_t)) }; - assert!(((((field_ptr!(sp, st_mtime).read()) == 7_i64) as i32) != 0)); + assert!(((((field_ptr!(sp, st_mtime).read()) == (7 as ::libc::time_t)) as i32) != 0)); field_ptr!(st.as_pointer(), st_mtime).with_mut(|__v| __v.postfix_inc()); field_ptr!(sp, st_mtime).with_mut(|__v| __v.prefix_inc()); - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 9_i64) as i32) != 0)); - let mut mtime: Ptr<::libc::time_t> = - (field_ptr!(st.as_pointer(), st_mtime)).reinterpret_cast::<::libc::time_t>(); + assert!( + ((((field_ptr!(st.as_pointer(), st_mtime).read()) == (9 as ::libc::time_t)) as i32) != 0) + ); + let mut mtime: Ptr<::libc::time_t> = (field_ptr!(st.as_pointer(), st_mtime)); mtime.write((10 as ::libc::time_t)); - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 10_i64) as i32) != 0)); - let mut mtime_via_ptr: Ptr<::libc::time_t> = - (field_ptr!(sp, st_mtime)).reinterpret_cast::<::libc::time_t>(); + assert!( + ((((field_ptr!(st.as_pointer(), st_mtime).read()) == (10 as ::libc::time_t)) as i32) != 0) + ); + let mut mtime_via_ptr: Ptr<::libc::time_t> = (field_ptr!(sp, st_mtime)); mtime_via_ptr.write((11 as ::libc::time_t)); assert!(((((mtime.read()) == (11 as ::libc::time_t)) as i32) != 0)); - let mut copy: ::libc::time_t = ((field_ptr!(sp, st_mtime).read()) as ::libc::time_t); + let mut copy: ::libc::time_t = (field_ptr!(sp, st_mtime).read()); assert!((((copy == (11 as ::libc::time_t)) as i32) != 0)); } pub fn main() { diff --git a/tests/unit/out/unsafe/sys_stat.rs b/tests/unit/out/unsafe/sys_stat.rs index 70e8de135..c4811e381 100644 --- a/tests/unit/out/unsafe/sys_stat.rs +++ b/tests/unit/out/unsafe/sys_stat.rs @@ -16,7 +16,7 @@ pub unsafe fn test_stat_0() { let mut st: ::libc::stat = unsafe { std::mem::zeroed() }; assert!(((((libc::stat(path, (&mut st as *mut ::libc::stat))) == (0)) as i32) != 0)); assert!(((((st.st_size) == (5_i64)) as i32) != 0)); - assert!((((((*(&mut st as *mut ::libc::stat)).st_mtime) > (0_i64)) as i32) != 0)); + assert!((((((*(&mut st as *mut ::libc::stat)).st_mtime) > (0 as ::libc::time_t)) as i32) != 0)); libc::unlink(path); } pub unsafe fn test_fstat_1() { @@ -30,35 +30,41 @@ pub unsafe fn test_fstat_1() { let mut st: ::libc::stat = unsafe { std::mem::zeroed() }; assert!(((((libc::fstat(fd, (&mut st as *mut ::libc::stat))) == (0)) as i32) != 0)); assert!(((((st.st_size) == (11_i64)) as i32) != 0)); - assert!((((((*(&mut st as *mut ::libc::stat)).st_mtime) > (0_i64)) as i32) != 0)); + assert!((((((*(&mut st as *mut ::libc::stat)).st_mtime) > (0 as ::libc::time_t)) as i32) != 0)); assert!(((((libc::fclose(fp)) == (0)) as i32) != 0)); libc::unlink(path); } pub unsafe fn test_st_mtime_access_2() { let mut st: ::libc::stat = unsafe { std::mem::zeroed() }; let mut sp: *mut ::libc::stat = (&mut st as *mut ::libc::stat); - (*(&mut st as *mut ::libc::stat)).st_mtime = 5_i64; - assert!((((((*(&mut st as *mut ::libc::stat)).st_mtime) == (5_i64)) as i32) != 0)); - (*(sp as *mut ::libc::stat)).st_mtime = 6_i64; - assert!((((((*(sp as *mut ::libc::stat)).st_mtime) == (6_i64)) as i32) != 0)); - (*(&mut st as *mut ::libc::stat)).st_mtime += 2_i64; - assert!((((((*(&mut st as *mut ::libc::stat)).st_mtime) == (8_i64)) as i32) != 0)); - (*(sp as *mut ::libc::stat)).st_mtime -= 1_i64; - assert!((((((*(sp as *mut ::libc::stat)).st_mtime) == (7_i64)) as i32) != 0)); + (*(&mut st as *mut ::libc::stat)).st_mtime = (5 as ::libc::time_t); + assert!( + (((((*(&mut st as *mut ::libc::stat)).st_mtime) == (5 as ::libc::time_t)) as i32) != 0) + ); + (*(sp as *mut ::libc::stat)).st_mtime = (6 as ::libc::time_t); + assert!((((((*(sp as *mut ::libc::stat)).st_mtime) == (6 as ::libc::time_t)) as i32) != 0)); + (*(&mut st as *mut ::libc::stat)).st_mtime += (2 as ::libc::time_t); + assert!( + (((((*(&mut st as *mut ::libc::stat)).st_mtime) == (8 as ::libc::time_t)) as i32) != 0) + ); + (*(sp as *mut ::libc::stat)).st_mtime -= (1 as ::libc::time_t); + assert!((((((*(sp as *mut ::libc::stat)).st_mtime) == (7 as ::libc::time_t)) as i32) != 0)); (*(&mut st as *mut ::libc::stat)).st_mtime.postfix_inc(); (*(sp as *mut ::libc::stat)).st_mtime.prefix_inc(); - assert!((((((*(&mut st as *mut ::libc::stat)).st_mtime) == (9_i64)) as i32) != 0)); - let mut mtime: *mut ::libc::time_t = ((&mut (*(&mut st as *mut ::libc::stat)).st_mtime - as *mut i64) as *mut i64) - .cast::<::libc::time_t>(); + assert!( + (((((*(&mut st as *mut ::libc::stat)).st_mtime) == (9 as ::libc::time_t)) as i32) != 0) + ); + let mut mtime: *mut ::libc::time_t = + (&mut (*(&mut st as *mut ::libc::stat)).st_mtime as *mut ::libc::time_t); (*mtime) = (10 as ::libc::time_t); - assert!((((((*(&mut st as *mut ::libc::stat)).st_mtime) == (10_i64)) as i32) != 0)); - let mut mtime_via_ptr: *mut ::libc::time_t = ((&mut (*(sp as *mut ::libc::stat)).st_mtime - as *mut i64) as *mut i64) - .cast::<::libc::time_t>(); + assert!( + (((((*(&mut st as *mut ::libc::stat)).st_mtime) == (10 as ::libc::time_t)) as i32) != 0) + ); + let mut mtime_via_ptr: *mut ::libc::time_t = + (&mut (*(sp as *mut ::libc::stat)).st_mtime as *mut ::libc::time_t); (*mtime_via_ptr) = (11 as ::libc::time_t); assert!(((((*mtime) == (11 as ::libc::time_t)) as i32) != 0)); - let mut copy: ::libc::time_t = ((*(sp as *mut ::libc::stat)).st_mtime as ::libc::time_t); + let mut copy: ::libc::time_t = (*(sp as *mut ::libc::stat)).st_mtime; assert!(((((copy) == (11 as ::libc::time_t)) as i32) != 0)); } pub fn main() { From f2d8c6d01df7a7fde741753db673d7f92aff7393 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 11:04:14 +0100 Subject: [PATCH 47/62] Update tests --- tests/unit/out/refcount/inet_pton_ntop.rs | 8 ++-- tests/unit/out/refcount/sys_stat.rs | 46 +++++++++++++---------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/tests/unit/out/refcount/inet_pton_ntop.rs b/tests/unit/out/refcount/inet_pton_ntop.rs index f62541cec..9fbda7344 100644 --- a/tests/unit/out/refcount/inet_pton_ntop.rs +++ b/tests/unit/out/refcount/inet_pton_ntop.rs @@ -312,7 +312,8 @@ fn main_0() -> i32 { }; match __text { Some(__s) - if (__s.len() as u32) < (::std::mem::size_of::<[i8; 64]>() as u32) => + if (__s.len() as u32) + < (::std::mem::size_of::<[i8; 64]>() as libc::socklen_t) => { let __n = __s.len(); (text.as_pointer() as Ptr).write_c_bytes(__s.as_bytes()); @@ -369,7 +370,8 @@ fn main_0() -> i32 { }; match __text { Some(__s) - if (__s.len() as u32) < (::std::mem::size_of::<[i8; 64]>() as u32) => + if (__s.len() as u32) + < (::std::mem::size_of::<[i8; 64]>() as libc::socklen_t) => { let __n = __s.len(); (text.as_pointer() as Ptr).write_c_bytes(__s.as_bytes()); @@ -419,7 +421,7 @@ fn main_0() -> i32 { None }; match __text { - Some(__s) if (__s.len() as u32) < 4_u32 => { + Some(__s) if (__s.len() as u32) < (4 as libc::socklen_t) => { let __n = __s.len(); (text.as_pointer() as Ptr).write_c_bytes(__s.as_bytes()); elem!((text.as_pointer() as Ptr::), __n).write(0); diff --git a/tests/unit/out/refcount/sys_stat.rs b/tests/unit/out/refcount/sys_stat.rs index 25445bb2c..0d6ef8c56 100644 --- a/tests/unit/out/refcount/sys_stat.rs +++ b/tests/unit/out/refcount/sys_stat.rs @@ -45,7 +45,7 @@ pub fn test_stat_0() { != 0) ); assert!(((({ (*st.borrow()).st_size } == 5_i64) as i32) != 0)); - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) > 0_i64) as i32) != 0)); + assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) > 0 as ::libc::time_t) as i32) != 0)); match nix::unistd::unlink(path.to_rust_string().as_str()) { Ok(()) => 0, Err(__e) => { @@ -87,7 +87,7 @@ pub fn test_fstat_1() { != 0) ); assert!(((({ (*st.borrow()).st_size } == 11_i64) as i32) != 0)); - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) > 0_i64) as i32) != 0)); + assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) > 0 as ::libc::time_t) as i32) != 0)); assert!( ((({ let __r = fp.with(|__f| __f.close()); @@ -107,29 +107,37 @@ pub fn test_fstat_1() { pub fn test_st_mtime_access_2() { let st: Value = Rc::new(RefCell::new(Default::default())); let mut sp: Ptr = (st.as_pointer()); - field_ptr!(st.as_pointer(), st_mtime).write(5_i64); - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 5_i64) as i32) != 0)); - field_ptr!(sp, st_mtime).write(6_i64); - assert!(((((field_ptr!(sp, st_mtime).read()) == 6_i64) as i32) != 0)); + field_ptr!(st.as_pointer(), st_mtime).write((5 as ::libc::time_t)); + assert!( + ((((field_ptr!(st.as_pointer(), st_mtime).read()) == (5 as ::libc::time_t)) as i32) != 0) + ); + field_ptr!(sp, st_mtime).write((6 as ::libc::time_t)); + assert!(((((field_ptr!(sp, st_mtime).read()) == (6 as ::libc::time_t)) as i32) != 0)); { - field_ptr!(st.as_pointer(), st_mtime).with_mut(|__v| *__v = *__v + 2_i64) + field_ptr!(st.as_pointer(), st_mtime).with_mut(|__v| *__v = *__v + (2 as ::libc::time_t)) }; - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 8_i64) as i32) != 0)); + assert!( + ((((field_ptr!(st.as_pointer(), st_mtime).read()) == (8 as ::libc::time_t)) as i32) != 0) + ); { - field_ptr!(sp, st_mtime).with_mut(|__v| *__v = *__v - 1_i64) + field_ptr!(sp, st_mtime).with_mut(|__v| *__v = *__v - (1 as ::libc::time_t)) }; - assert!(((((field_ptr!(sp, st_mtime).read()) == 7_i64) as i32) != 0)); + assert!(((((field_ptr!(sp, st_mtime).read()) == (7 as ::libc::time_t)) as i32) != 0)); field_ptr!(st.as_pointer(), st_mtime).with_mut(|__v| __v.postfix_inc()); field_ptr!(sp, st_mtime).with_mut(|__v| __v.prefix_inc()); - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 9_i64) as i32) != 0)); - let mut mtime: Ptr = (field_ptr!(st.as_pointer(), st_mtime)); - mtime.write(10_i64); - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) == 10_i64) as i32) != 0)); - let mut mtime_via_ptr: Ptr = (field_ptr!(sp, st_mtime)); - mtime_via_ptr.write(11_i64); - assert!(((((mtime.read()) == 11_i64) as i32) != 0)); - let mut copy: i64 = (field_ptr!(sp, st_mtime).read()); - assert!((((copy == 11_i64) as i32) != 0)); + assert!( + ((((field_ptr!(st.as_pointer(), st_mtime).read()) == (9 as ::libc::time_t)) as i32) != 0) + ); + let mut mtime: Ptr<::libc::time_t> = (field_ptr!(st.as_pointer(), st_mtime)); + mtime.write((10 as ::libc::time_t)); + assert!( + ((((field_ptr!(st.as_pointer(), st_mtime).read()) == (10 as ::libc::time_t)) as i32) != 0) + ); + let mut mtime_via_ptr: Ptr<::libc::time_t> = (field_ptr!(sp, st_mtime)); + mtime_via_ptr.write((11 as ::libc::time_t)); + assert!(((((mtime.read()) == (11 as ::libc::time_t)) as i32) != 0)); + let mut copy: ::libc::time_t = (field_ptr!(sp, st_mtime).read()); + assert!((((copy == (11 as ::libc::time_t)) as i32) != 0)); } pub fn main() { __cpp2rust_init_globals(); From 66b753004b2b587f01130dc80e58a77cb13e6d0c Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 11:06:45 +0100 Subject: [PATCH 48/62] Add fs::string_type rule --- rules/fs_path/src_cxx17.cpp | 6 ++++++ rules/fs_path/tgt_refcount.rs | 6 ++++++ rules/fs_path/tgt_unsafe.rs | 6 ++++++ 3 files changed, 18 insertions(+) create mode 100644 rules/fs_path/src_cxx17.cpp create mode 100644 rules/fs_path/tgt_refcount.rs create mode 100644 rules/fs_path/tgt_unsafe.rs diff --git a/rules/fs_path/src_cxx17.cpp b/rules/fs_path/src_cxx17.cpp new file mode 100644 index 000000000..e028d1f49 --- /dev/null +++ b/rules/fs_path/src_cxx17.cpp @@ -0,0 +1,6 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +#include + +typedef std::filesystem::path::string_type t2; diff --git a/rules/fs_path/tgt_refcount.rs b/rules/fs_path/tgt_refcount.rs new file mode 100644 index 000000000..be99095f6 --- /dev/null +++ b/rules/fs_path/tgt_refcount.rs @@ -0,0 +1,6 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +fn t2() -> Vec { + vec![0] +} diff --git a/rules/fs_path/tgt_unsafe.rs b/rules/fs_path/tgt_unsafe.rs new file mode 100644 index 000000000..685d5555f --- /dev/null +++ b/rules/fs_path/tgt_unsafe.rs @@ -0,0 +1,6 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +fn t2() -> Vec { + vec![0] +} From 391eb1883b5da3ef5d9ef6d9d2f02b01757a47a5 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 11:17:26 +0100 Subject: [PATCH 49/62] Drop is zero check for initializer --- cpp2rust/converter/converter.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index 7c6496e4a..20dd92eda 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -2304,11 +2304,6 @@ std::string Converter::getIntegerLiteral(clang::IntegerLiteral *expr, auto type_as_string = GetUnsafeTypeAsString(ty); if (ty->isFloatingType() || incl_type) { - if (value.isZero()) { - if (auto init = Mapper::MapInitializer(*this, ty); !init.empty()) { - return init; - } - } return getTypedLiteral(num_as_string.c_str(), type_as_string); } From 5f3e809d65b281483f2935991e053690bb50e66c Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 11:28:47 +0100 Subject: [PATCH 50/62] Update tests --- tests/unit/out/refcount/fstat.rs | 2 +- .../refcount/libc_struct_without_default.rs | 4 ++-- tests/unit/out/refcount/lseek_ftruncate.rs | 23 +++++++++++++------ tests/unit/out/refcount/netdb.rs | 4 ++-- tests/unit/out/refcount/pwd.rs | 19 +++++++-------- tests/unit/out/refcount/select.rs | 4 ++-- tests/unit/out/refcount/stdio_nofd.rs | 6 ++--- tests/unit/out/refcount/sys_stat.rs | 12 ++++++---- tests/unit/out/refcount/sys_time.rs | 6 ++--- tests/unit/out/unsafe/fstat.rs | 2 +- .../out/unsafe/libc_struct_without_default.rs | 4 ++-- tests/unit/out/unsafe/lseek_ftruncate.rs | 20 ++++++++++++---- tests/unit/out/unsafe/netdb.rs | 4 ++-- tests/unit/out/unsafe/pwd.rs | 2 +- tests/unit/out/unsafe/select.rs | 4 ++-- tests/unit/out/unsafe/stdio_nofd.rs | 18 ++++++++++++--- tests/unit/out/unsafe/sys_stat.rs | 4 ++-- tests/unit/out/unsafe/sys_time.rs | 6 ++--- tests/unit/out/unsafe/unistd.rs | 20 ++++++++++++---- 19 files changed, 107 insertions(+), 57 deletions(-) diff --git a/tests/unit/out/refcount/fstat.rs b/tests/unit/out/refcount/fstat.rs index 338384356..2c829c984 100644 --- a/tests/unit/out/refcount/fstat.rs +++ b/tests/unit/out/refcount/fstat.rs @@ -61,7 +61,7 @@ fn main_0() -> i32 { } == 0) as i32) != 0) ); - assert!(((({ (*st.borrow()).st_size } == 5_i64) as i32) != 0)); + assert!(((({ (*st.borrow()).st_size } == (5 as ::libc::off_t)) as i32) != 0)); assert!((((FdRegistry::close(fd) == 0) as i32) != 0)); assert!( (((match nix::unistd::unlink(path.to_rust_string().as_str()) { diff --git a/tests/unit/out/refcount/libc_struct_without_default.rs b/tests/unit/out/refcount/libc_struct_without_default.rs index 3c9c18729..0cbc1f64e 100644 --- a/tests/unit/out/refcount/libc_struct_without_default.rs +++ b/tests/unit/out/refcount/libc_struct_without_default.rs @@ -65,8 +65,8 @@ fn main_0() -> i32 { assert!(({ (*t.borrow()).tm_mon } == 5)); assert!(({ (*t.borrow()).tm_mday } == 15)); let st: Value = Rc::new(RefCell::new(Default::default())); - (*st.borrow_mut()).st_size = 1024_i64; - assert!(({ (*st.borrow()).st_size } == 1024_i64)); + (*st.borrow_mut()).st_size = (1024 as ::libc::off_t); + assert!(({ (*st.borrow()).st_size } == (1024 as ::libc::off_t))); let ud: Value = Rc::new(RefCell::new(::default())); assert!(((vec_elem!(ud.as_pointer(), a, 0_usize).read()) == 0)); assert!(((*ud.borrow()).v.len() == 0_usize)); diff --git a/tests/unit/out/refcount/lseek_ftruncate.rs b/tests/unit/out/refcount/lseek_ftruncate.rs index 92284d790..dbd850c20 100644 --- a/tests/unit/out/refcount/lseek_ftruncate.rs +++ b/tests/unit/out/refcount/lseek_ftruncate.rs @@ -55,14 +55,16 @@ fn main_0() -> i32 { 2 => nix::unistd::Whence::SeekEnd, __w => panic!("lseek: unsupported whence {__w}"), }; - match FdRegistry::with_fd(fd, |__fd| nix::unistd::lseek(__fd, 0_i64, __whence)) { + match FdRegistry::with_fd(fd, |__fd| { + nix::unistd::lseek(__fd, (0 as ::libc::off_t), __whence) + }) { Ok(__off) => __off, Err(__e) => { libcc2rs::cpp2rust_errno().write(__e as i32); -1 } } - } == 11_i64) as i32) + } == (11 as ::libc::off_t)) as i32) != 0) ); assert!( @@ -73,14 +75,16 @@ fn main_0() -> i32 { 2 => nix::unistd::Whence::SeekEnd, __w => panic!("lseek: unsupported whence {__w}"), }; - match FdRegistry::with_fd(fd, |__fd| nix::unistd::lseek(__fd, 6_i64, __whence)) { + match FdRegistry::with_fd(fd, |__fd| { + nix::unistd::lseek(__fd, (6 as ::libc::off_t), __whence) + }) { Ok(__off) => __off, Err(__e) => { libcc2rs::cpp2rust_errno().write(__e as i32); -1 } } - } == 6_i64) as i32) + } == (6 as ::libc::off_t)) as i32) != 0) ); let buf: Value> = Rc::new(RefCell::new((0..16).map(|_| 0_i8).collect::>())); @@ -125,7 +129,10 @@ fn main_0() -> i32 { != 0) ); assert!( - (((match FdRegistry::with_fd(fd, |__fd| nix::unistd::ftruncate(__fd, 5_i64)) { + (((match FdRegistry::with_fd(fd, |__fd| nix::unistd::ftruncate( + __fd, + (5 as ::libc::off_t) + )) { Ok(()) => 0, Err(__e) => { libcc2rs::cpp2rust_errno().write(__e as i32); @@ -142,14 +149,16 @@ fn main_0() -> i32 { 2 => nix::unistd::Whence::SeekEnd, __w => panic!("lseek: unsupported whence {__w}"), }; - match FdRegistry::with_fd(fd, |__fd| nix::unistd::lseek(__fd, 0_i64, __whence)) { + match FdRegistry::with_fd(fd, |__fd| { + nix::unistd::lseek(__fd, (0 as ::libc::off_t), __whence) + }) { Ok(__off) => __off, Err(__e) => { libcc2rs::cpp2rust_errno().write(__e as i32); -1 } } - } == 5_i64) as i32) + } == (5 as ::libc::off_t)) as i32) != 0) ); assert!((((FdRegistry::close(fd) == 0) as i32) != 0)); diff --git a/tests/unit/out/refcount/netdb.rs b/tests/unit/out/refcount/netdb.rs index 8e706f17f..7d2fd3b33 100644 --- a/tests/unit/out/refcount/netdb.rs +++ b/tests/unit/out/refcount/netdb.rs @@ -10,7 +10,7 @@ pub fn test_ipv4_literal_0() { let hints: Value = Rc::new(RefCell::new(Default::default())); (*hints.borrow_mut()).ai_flags = 0; (*hints.borrow_mut()).ai_protocol = 0; - (*hints.borrow_mut()).ai_addrlen = 0 as libc::socklen_t; + (*hints.borrow_mut()).ai_addrlen = (0 as libc::socklen_t); (*hints.borrow_mut()).ai_addr = Ptr::::null(); (*hints.borrow_mut()).ai_canonname = Ptr::::null(); (*hints.borrow_mut()).ai_next = Ptr::::null(); @@ -160,7 +160,7 @@ pub fn test_ipv6_literal_1() { let hints: Value = Rc::new(RefCell::new(Default::default())); (*hints.borrow_mut()).ai_flags = 0; (*hints.borrow_mut()).ai_protocol = 0; - (*hints.borrow_mut()).ai_addrlen = 0 as libc::socklen_t; + (*hints.borrow_mut()).ai_addrlen = (0 as libc::socklen_t); (*hints.borrow_mut()).ai_addr = Ptr::::null(); (*hints.borrow_mut()).ai_canonname = Ptr::::null(); (*hints.borrow_mut()).ai_next = Ptr::::null(); diff --git a/tests/unit/out/refcount/pwd.rs b/tests/unit/out/refcount/pwd.rs index abc775a97..7ef7df3f8 100644 --- a/tests/unit/out/refcount/pwd.rs +++ b/tests/unit/out/refcount/pwd.rs @@ -32,15 +32,16 @@ pub fn test_getpwuid_0() { } pub fn test_getpwuid_missing_1() { libcc2rs::cpp2rust_errno().write(0); - let mut pw: Ptr = - match nix::unistd::User::from_uid(nix::unistd::Uid::from_raw(2147483646_u32)) { - Ok(Some(__u)) => Ptr::alloc(Passwd::from_user(&__u)), - Ok(None) => Ptr::null(), - Err(__e) => { - libcc2rs::cpp2rust_errno().write(__e as i32); - Ptr::null() - } - }; + let mut pw: Ptr = match nix::unistd::User::from_uid( + nix::unistd::Uid::from_raw((2147483646 as ::libc::uid_t)), + ) { + Ok(Some(__u)) => Ptr::alloc(Passwd::from_user(&__u)), + Ok(None) => Ptr::null(), + Err(__e) => { + libcc2rs::cpp2rust_errno().write(__e as i32); + Ptr::null() + } + }; assert!(((((pw).is_null()) as i32) != 0)); assert!(((((libcc2rs::cpp2rust_errno().read()) == 0) as i32) != 0)); } diff --git a/tests/unit/out/refcount/select.rs b/tests/unit/out/refcount/select.rs index 0df886cd9..45a6ee230 100644 --- a/tests/unit/out/refcount/select.rs +++ b/tests/unit/out/refcount/select.rs @@ -38,7 +38,7 @@ fn main_0() -> i32 { .memset((0) as u8, 16usize as usize); ((tv.as_pointer()) as Ptr).to_any() }; - (*tv.borrow_mut()).tv_sec = 0_i64; + (*tv.borrow_mut()).tv_sec = (0 as ::libc::time_t); assert!( ((({ let __rp = (rset.as_pointer()); @@ -184,7 +184,7 @@ fn main_0() -> i32 { ); (rset.as_pointer()).with_mut(|__s| __s.zero()); (rset.as_pointer()).with_mut(|__s| __s.set((*fds.borrow())[(0) as usize])); - (*tv.borrow_mut()).tv_sec = 1_i64; + (*tv.borrow_mut()).tv_sec = (1 as ::libc::time_t); assert!( ((({ let __rp = (rset.as_pointer()); diff --git a/tests/unit/out/refcount/stdio_nofd.rs b/tests/unit/out/refcount/stdio_nofd.rs index ab88c9f83..8b8192650 100644 --- a/tests/unit/out/refcount/stdio_nofd.rs +++ b/tests/unit/out/refcount/stdio_nofd.rs @@ -444,7 +444,7 @@ pub fn test_fseeko_4() { }; assert!((((!((fp).is_null())) as i32) != 0)); assert!( - (((match fp.with_mut(|__f| __f.seek(6_i64, ::libc::SEEK_SET)) { + (((match fp.with_mut(|__f| __f.seek((6 as ::libc::off_t), ::libc::SEEK_SET)) { -1 => -1, _ => 0, } == 0) as i32) @@ -471,7 +471,7 @@ pub fn test_fseeko_4() { != 0) ); assert!( - (((match fp.with_mut(|__f| __f.seek((-5_i32 as i64), ::libc::SEEK_END)) { + (((match fp.with_mut(|__f| __f.seek((-5_i32 as ::libc::off_t), ::libc::SEEK_END)) { -1 => -1, _ => 0, } == 0) as i32) @@ -479,7 +479,7 @@ pub fn test_fseeko_4() { ); assert!((((fp.with_mut(|__f| __f.getc()) == ('w' as i32)) as i32) != 0)); assert!( - (((match fp.with_mut(|__f| __f.seek(1_i64, ::libc::SEEK_CUR)) { + (((match fp.with_mut(|__f| __f.seek((1 as ::libc::off_t), ::libc::SEEK_CUR)) { -1 => -1, _ => 0, } == 0) as i32) diff --git a/tests/unit/out/refcount/sys_stat.rs b/tests/unit/out/refcount/sys_stat.rs index 0d6ef8c56..47b550e66 100644 --- a/tests/unit/out/refcount/sys_stat.rs +++ b/tests/unit/out/refcount/sys_stat.rs @@ -44,8 +44,10 @@ pub fn test_stat_0() { } == 0) as i32) != 0) ); - assert!(((({ (*st.borrow()).st_size } == 5_i64) as i32) != 0)); - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) > 0 as ::libc::time_t) as i32) != 0)); + assert!(((({ (*st.borrow()).st_size } == (5 as ::libc::off_t)) as i32) != 0)); + assert!( + ((((field_ptr!(st.as_pointer(), st_mtime).read()) > (0 as ::libc::time_t)) as i32) != 0) + ); match nix::unistd::unlink(path.to_rust_string().as_str()) { Ok(()) => 0, Err(__e) => { @@ -86,8 +88,10 @@ pub fn test_fstat_1() { } == 0) as i32) != 0) ); - assert!(((({ (*st.borrow()).st_size } == 11_i64) as i32) != 0)); - assert!(((((field_ptr!(st.as_pointer(), st_mtime).read()) > 0 as ::libc::time_t) as i32) != 0)); + assert!(((({ (*st.borrow()).st_size } == (11 as ::libc::off_t)) as i32) != 0)); + assert!( + ((((field_ptr!(st.as_pointer(), st_mtime).read()) > (0 as ::libc::time_t)) as i32) != 0) + ); assert!( ((({ let __r = fp.with(|__f| __f.close()); diff --git a/tests/unit/out/refcount/sys_time.rs b/tests/unit/out/refcount/sys_time.rs index 0bc283ce1..0c9640dc6 100644 --- a/tests/unit/out/refcount/sys_time.rs +++ b/tests/unit/out/refcount/sys_time.rs @@ -23,7 +23,7 @@ pub fn test_time_0() { } } }; - let t2: Value<::libc::time_t> = Rc::new(RefCell::new(0 as ::libc::time_t)); + let t2: Value<::libc::time_t> = Rc::new(RefCell::new((0 as ::libc::time_t))); let mut t3: ::libc::time_t = { let __out = (t2.as_pointer()); match nix::time::clock_gettime(nix::time::ClockId::CLOCK_REALTIME) { @@ -81,7 +81,7 @@ pub fn print_tm_1(t: ::libc::time_t) { ); } pub fn test_gmtime_r_2() { - ({ print_tm_1(0 as ::libc::time_t) }); + ({ print_tm_1((0 as ::libc::time_t)) }); ({ print_tm_1((1 as ::libc::time_t)) }); ({ print_tm_1((86399 as ::libc::time_t)) }); ({ print_tm_1((86400 as ::libc::time_t)) }); @@ -135,7 +135,7 @@ pub fn print_local_tm_3(t: ::libc::time_t) { ); } pub fn test_localtime_r_4() { - ({ print_local_tm_3(0 as ::libc::time_t) }); + ({ print_local_tm_3((0 as ::libc::time_t)) }); ({ print_local_tm_3((951782400 as ::libc::time_t)) }); ({ print_local_tm_3((1704067199 as ::libc::time_t)) }); ({ print_local_tm_3((1721126096 as ::libc::time_t)) }); diff --git a/tests/unit/out/unsafe/fstat.rs b/tests/unit/out/unsafe/fstat.rs index c66a04f0e..a047d34e1 100644 --- a/tests/unit/out/unsafe/fstat.rs +++ b/tests/unit/out/unsafe/fstat.rs @@ -33,7 +33,7 @@ unsafe fn main_0() -> i32 { ); let mut st: ::libc::stat = unsafe { std::mem::zeroed() }; assert!(((((libc::fstat(fd, (&mut st as *mut ::libc::stat))) == (0)) as i32) != 0)); - assert!(((((st.st_size) == (5_i64)) as i32) != 0)); + assert!(((((st.st_size) == (5 as ::libc::off_t)) as i32) != 0)); assert!(((((libc::close(fd)) == (0)) as i32) != 0)); assert!(((((libc::unlink(path)) == (0)) as i32) != 0)); return 0; diff --git a/tests/unit/out/unsafe/libc_struct_without_default.rs b/tests/unit/out/unsafe/libc_struct_without_default.rs index 5da91d26c..1a0066685 100644 --- a/tests/unit/out/unsafe/libc_struct_without_default.rs +++ b/tests/unit/out/unsafe/libc_struct_without_default.rs @@ -61,8 +61,8 @@ unsafe fn main_0() -> i32 { assert!(((t.tm_mon) == (5))); assert!(((t.tm_mday) == (15))); let mut st: ::libc::stat = unsafe { std::mem::zeroed() }; - st.st_size = 1024_i64; - assert!(((st.st_size) == (1024_i64))); + st.st_size = (1024 as ::libc::off_t); + assert!(((st.st_size) == (1024 as ::libc::off_t))); let mut ud: UserDefined = ::default(); assert!(((ud.a[(0_usize)]) == (0))); assert!(((ud.v.len()) == (0_usize))); diff --git a/tests/unit/out/unsafe/lseek_ftruncate.rs b/tests/unit/out/unsafe/lseek_ftruncate.rs index 68a850c46..ea179629c 100644 --- a/tests/unit/out/unsafe/lseek_ftruncate.rs +++ b/tests/unit/out/unsafe/lseek_ftruncate.rs @@ -31,8 +31,16 @@ unsafe fn main_0() -> i32 { )) == (11_isize)) as i32) != 0) ); - assert!(((((libc::lseek(fd, 0_i64, ::libc::SEEK_END)) == (11_i64)) as i32) != 0)); - assert!(((((libc::lseek(fd, 6_i64, ::libc::SEEK_SET)) == (6_i64)) as i32) != 0)); + assert!( + ((((libc::lseek(fd, (0 as ::libc::off_t), ::libc::SEEK_END)) == (11 as ::libc::off_t)) + as i32) + != 0) + ); + assert!( + ((((libc::lseek(fd, (6 as ::libc::off_t), ::libc::SEEK_SET)) == (6 as ::libc::off_t)) + as i32) + != 0) + ); let mut buf: [libc::c_char; 16] = [(0 as libc::c_char); 16]; { let byte_0 = (buf.as_mut_ptr() as *mut ::libc::c_void) as *mut u8; @@ -56,8 +64,12 @@ unsafe fn main_0() -> i32 { )) == (0)) as i32) != 0) ); - assert!(((((libc::ftruncate(fd, 5_i64)) == (0)) as i32) != 0)); - assert!(((((libc::lseek(fd, 0_i64, ::libc::SEEK_END)) == (5_i64)) as i32) != 0)); + assert!(((((libc::ftruncate(fd, (5 as ::libc::off_t))) == (0)) as i32) != 0)); + assert!( + ((((libc::lseek(fd, (0 as ::libc::off_t), ::libc::SEEK_END)) == (5 as ::libc::off_t)) + as i32) + != 0) + ); assert!(((((libc::close(fd)) == (0)) as i32) != 0)); assert!(((((libc::unlink(path)) == (0)) as i32) != 0)); return 0; diff --git a/tests/unit/out/unsafe/netdb.rs b/tests/unit/out/unsafe/netdb.rs index 2b83826d9..78a080965 100644 --- a/tests/unit/out/unsafe/netdb.rs +++ b/tests/unit/out/unsafe/netdb.rs @@ -10,7 +10,7 @@ pub unsafe fn test_ipv4_literal_0() { let mut hints: ::libc::addrinfo = unsafe { std::mem::zeroed() }; hints.ai_flags = 0; hints.ai_protocol = 0; - hints.ai_addrlen = 0 as libc::socklen_t; + hints.ai_addrlen = (0 as libc::socklen_t); hints.ai_addr = std::ptr::null_mut(); hints.ai_canonname = std::ptr::null_mut(); hints.ai_next = std::ptr::null_mut(); @@ -88,7 +88,7 @@ pub unsafe fn test_ipv6_literal_1() { let mut hints: ::libc::addrinfo = unsafe { std::mem::zeroed() }; hints.ai_flags = 0; hints.ai_protocol = 0; - hints.ai_addrlen = 0 as libc::socklen_t; + hints.ai_addrlen = (0 as libc::socklen_t); hints.ai_addr = std::ptr::null_mut(); hints.ai_canonname = std::ptr::null_mut(); hints.ai_next = std::ptr::null_mut(); diff --git a/tests/unit/out/unsafe/pwd.rs b/tests/unit/out/unsafe/pwd.rs index dfd607f14..b6b217418 100644 --- a/tests/unit/out/unsafe/pwd.rs +++ b/tests/unit/out/unsafe/pwd.rs @@ -21,7 +21,7 @@ pub unsafe fn test_getpwuid_0() { } pub unsafe fn test_getpwuid_missing_1() { (*libcc2rs::cpp2rust_errno_unsafe()) = 0; - let mut pw: *mut ::libc::passwd = libc::getpwuid(2147483646_u32); + let mut pw: *mut ::libc::passwd = libc::getpwuid((2147483646 as ::libc::uid_t)); assert!(((((pw).is_null()) as i32) != 0)); assert!(((((*libcc2rs::cpp2rust_errno_unsafe()) == (0)) as i32) != 0)); } diff --git a/tests/unit/out/unsafe/select.rs b/tests/unit/out/unsafe/select.rs index 549f9b9a0..154bd62db 100644 --- a/tests/unit/out/unsafe/select.rs +++ b/tests/unit/out/unsafe/select.rs @@ -26,7 +26,7 @@ unsafe fn main_0() -> i32 { } ((&mut tv as *mut ::libc::timeval) as *mut ::libc::c_void) }; - tv.tv_sec = 0_i64; + tv.tv_sec = (0 as ::libc::time_t); assert!( ((((libc::select( ((fds[(0) as usize]) + (1)), @@ -55,7 +55,7 @@ unsafe fn main_0() -> i32 { ); libc::FD_ZERO((&mut rset as *mut ::libc::fd_set)); libc::FD_SET(fds[(0) as usize], (&mut rset as *mut ::libc::fd_set)); - tv.tv_sec = 1_i64; + tv.tv_sec = (1 as ::libc::time_t); assert!( ((((libc::select( ((fds[(0) as usize]) + (1)), diff --git a/tests/unit/out/unsafe/stdio_nofd.rs b/tests/unit/out/unsafe/stdio_nofd.rs index 8559abe37..273b8f9c4 100644 --- a/tests/unit/out/unsafe/stdio_nofd.rs +++ b/tests/unit/out/unsafe/stdio_nofd.rs @@ -226,7 +226,11 @@ pub unsafe fn test_fseeko_4() { assert!(((((libc::fclose(fp)) == (0)) as i32) != 0)); fp = libc::fopen(path, (c"rb".as_ptr().cast_mut()).cast_const()); assert!((((!((fp).is_null())) as i32) != 0)); - assert!(((((libc::fseeko(fp, 6_i64 as ::libc::off_t, ::libc::SEEK_SET)) == (0)) as i32) != 0)); + assert!( + ((((libc::fseeko(fp, (6 as ::libc::off_t) as ::libc::off_t, ::libc::SEEK_SET)) == (0)) + as i32) + != 0) + ); let mut buf: [libc::c_char; 8] = [ (0 as libc::c_char), (0 as libc::c_char), @@ -268,11 +272,19 @@ pub unsafe fn test_fseeko_4() { != 0) ); assert!( - ((((libc::fseeko(fp, (-5_i32 as i64) as ::libc::off_t, ::libc::SEEK_END)) == (0)) as i32) + ((((libc::fseeko( + fp, + (-5_i32 as ::libc::off_t) as ::libc::off_t, + ::libc::SEEK_END + )) == (0)) as i32) != 0) ); assert!(((((libc::fgetc(fp)) == ('w' as i32)) as i32) != 0)); - assert!(((((libc::fseeko(fp, 1_i64 as ::libc::off_t, ::libc::SEEK_CUR)) == (0)) as i32) != 0)); + assert!( + ((((libc::fseeko(fp, (1 as ::libc::off_t) as ::libc::off_t, ::libc::SEEK_CUR)) == (0)) + as i32) + != 0) + ); assert!(((((libc::fgetc(fp)) == ('r' as i32)) as i32) != 0)); assert!(((((libc::fclose(fp)) == (0)) as i32) != 0)); assert!(((((libc::unlink(path)) == (0)) as i32) != 0)); diff --git a/tests/unit/out/unsafe/sys_stat.rs b/tests/unit/out/unsafe/sys_stat.rs index c4811e381..e8faa9168 100644 --- a/tests/unit/out/unsafe/sys_stat.rs +++ b/tests/unit/out/unsafe/sys_stat.rs @@ -15,7 +15,7 @@ pub unsafe fn test_stat_0() { assert!(((((libc::fclose(fp)) == (0)) as i32) != 0)); let mut st: ::libc::stat = unsafe { std::mem::zeroed() }; assert!(((((libc::stat(path, (&mut st as *mut ::libc::stat))) == (0)) as i32) != 0)); - assert!(((((st.st_size) == (5_i64)) as i32) != 0)); + assert!(((((st.st_size) == (5 as ::libc::off_t)) as i32) != 0)); assert!((((((*(&mut st as *mut ::libc::stat)).st_mtime) > (0 as ::libc::time_t)) as i32) != 0)); libc::unlink(path); } @@ -29,7 +29,7 @@ pub unsafe fn test_fstat_1() { let mut fd: i32 = libc::fileno(fp); let mut st: ::libc::stat = unsafe { std::mem::zeroed() }; assert!(((((libc::fstat(fd, (&mut st as *mut ::libc::stat))) == (0)) as i32) != 0)); - assert!(((((st.st_size) == (11_i64)) as i32) != 0)); + assert!(((((st.st_size) == (11 as ::libc::off_t)) as i32) != 0)); assert!((((((*(&mut st as *mut ::libc::stat)).st_mtime) > (0 as ::libc::time_t)) as i32) != 0)); assert!(((((libc::fclose(fp)) == (0)) as i32) != 0)); libc::unlink(path); diff --git a/tests/unit/out/unsafe/sys_time.rs b/tests/unit/out/unsafe/sys_time.rs index 4196c97a6..7ba639b7e 100644 --- a/tests/unit/out/unsafe/sys_time.rs +++ b/tests/unit/out/unsafe/sys_time.rs @@ -8,7 +8,7 @@ use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; pub unsafe fn test_time_0() { let mut t1: ::libc::time_t = libc::time(std::ptr::null_mut()); - let mut t2: ::libc::time_t = 0 as ::libc::time_t; + let mut t2: ::libc::time_t = (0 as ::libc::time_t); let mut t3: ::libc::time_t = libc::time((&mut t2 as *mut ::libc::time_t)); assert!(((((t1) > (1500000000 as ::libc::time_t)) as i32) != 0)); assert!(((((t2) == (t3)) as i32) != 0)); @@ -45,7 +45,7 @@ pub unsafe fn print_tm_1(mut t: ::libc::time_t) { }); } pub unsafe fn test_gmtime_r_2() { - (unsafe { print_tm_1(0 as ::libc::time_t) }); + (unsafe { print_tm_1((0 as ::libc::time_t)) }); (unsafe { print_tm_1((1 as ::libc::time_t)) }); (unsafe { print_tm_1((86399 as ::libc::time_t)) }); (unsafe { print_tm_1((86400 as ::libc::time_t)) }); @@ -87,7 +87,7 @@ pub unsafe fn print_local_tm_3(mut t: ::libc::time_t) { }); } pub unsafe fn test_localtime_r_4() { - (unsafe { print_local_tm_3(0 as ::libc::time_t) }); + (unsafe { print_local_tm_3((0 as ::libc::time_t)) }); (unsafe { print_local_tm_3((951782400 as ::libc::time_t)) }); (unsafe { print_local_tm_3((1704067199 as ::libc::time_t)) }); (unsafe { print_local_tm_3((1721126096 as ::libc::time_t)) }); diff --git a/tests/unit/out/unsafe/unistd.rs b/tests/unit/out/unsafe/unistd.rs index 905de26ee..3dc678e18 100644 --- a/tests/unit/out/unsafe/unistd.rs +++ b/tests/unit/out/unsafe/unistd.rs @@ -31,8 +31,16 @@ pub unsafe fn test_lseek_1() { fp = libc::fopen(path, (c"rb".as_ptr().cast_mut()).cast_const()); assert!((((!((fp).is_null())) as i32) != 0)); let mut fd: i32 = libc::fileno(fp); - assert!(((((libc::lseek(fd, 0_i64, ::libc::SEEK_END)) == (11_i64)) as i32) != 0)); - assert!(((((libc::lseek(fd, 6_i64, ::libc::SEEK_SET)) == (6_i64)) as i32) != 0)); + assert!( + ((((libc::lseek(fd, (0 as ::libc::off_t), ::libc::SEEK_END)) == (11 as ::libc::off_t)) + as i32) + != 0) + ); + assert!( + ((((libc::lseek(fd, (6 as ::libc::off_t), ::libc::SEEK_SET)) == (6 as ::libc::off_t)) + as i32) + != 0) + ); let mut buf: [libc::c_char; 8] = [ (0 as libc::c_char), (0 as libc::c_char), @@ -205,12 +213,16 @@ pub unsafe fn test_ftruncate_5() { libc::fputs((c"hello world".as_ptr().cast_mut()).cast_const(), fp); libc::fflush(fp); let mut fd: i32 = libc::fileno(fp); - assert!(((((libc::ftruncate(fd, 5_i64)) == (0)) as i32) != 0)); + assert!(((((libc::ftruncate(fd, (5 as ::libc::off_t))) == (0)) as i32) != 0)); assert!(((((libc::fclose(fp)) == (0)) as i32) != 0)); fp = libc::fopen(path, (c"rb".as_ptr().cast_mut()).cast_const()); assert!((((!((fp).is_null())) as i32) != 0)); fd = libc::fileno(fp); - assert!(((((libc::lseek(fd, 0_i64, ::libc::SEEK_END)) == (5_i64)) as i32) != 0)); + assert!( + ((((libc::lseek(fd, (0 as ::libc::off_t), ::libc::SEEK_END)) == (5 as ::libc::off_t)) + as i32) + != 0) + ); assert!(((((libc::fclose(fp)) == (0)) as i32) != 0)); libc::unlink(path); } From 476344ac180d6e0a9fde2ca1956d7b01a40045d0 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 11:32:09 +0100 Subject: [PATCH 51/62] Add rules for private __off_t --- cpp2rust/converter/rules/registry.cpp | 40 ++++++++++++++--------- cpp2rust/converter/rules/type_matcher.cpp | 18 ---------- cpp2rust/converter/rules/type_matcher.h | 3 -- rules/sys_types/src.c | 6 ++++ rules/sys_types/tgt_unsafe.rs | 8 +++++ 5 files changed, 38 insertions(+), 37 deletions(-) diff --git a/cpp2rust/converter/rules/registry.cpp b/cpp2rust/converter/rules/registry.cpp index 0a689299c..07f0bf20b 100644 --- a/cpp2rust/converter/rules/registry.cpp +++ b/cpp2rust/converter/rules/registry.cpp @@ -274,25 +274,33 @@ struct TypeRuleMatch { TypeRuleMatch findType(clang::QualType use) { TypeRuleMatch best; - for (auto key : RuleKeys::GetTypeKeys(sema_->Context, use)) { - auto [begin, end] = types_.equal_range(key); - for (auto it = begin; it != end; ++it) { - if (!AstMatcher::MatchPublicAlias(sema_->Context, use, it->second.decl)) { - continue; - } - if (best.rule_decl) { - use.dump(llvm::errs(), sema_->Context); - it->second.decl->dump(llvm::errs()); - best.rule_decl->decl->dump(llvm::errs()); - llvm::report_fatal_error("type matches several public aliases"); + auto &ctx = sema_->Context; + auto spelled = AstMatcher::SpelledTypedef(ctx, use); + auto skipped = AstMatcher::SkipInternalTypedefs(ctx, use); + if (spelled && AstMatcher::SpelledTypedef(ctx, skipped) != spelled) { + for (auto key : RuleKeys::GetTypeKeys(ctx, use)) { + auto [begin, end] = types_.equal_range(key); + for (auto it = begin; it != end; ++it) { + auto alias = llvm::dyn_cast(it->second.decl); + if (!alias || + AstMatcher::SpelledTypedef(ctx, alias->getUnderlyingType()) != + spelled) { + continue; + } + if (best.rule_decl) { + use.dump(llvm::errs(), ctx); + it->second.decl->dump(llvm::errs()); + best.rule_decl->decl->dump(llvm::errs()); + llvm::report_fatal_error("internal typedef matches several rules"); + } + best = {&it->second, {}}; } - best = {&it->second, {}}; + } + if (best.rule_decl) { + return best; } } - if (best.rule_decl) { - return best; - } - use = AstMatcher::SkipInternalTypedefs(sema_->Context, use); + use = skipped; if (auto tag = use->getAsTagDecl(); tag && (IsUserDefinedDecl(tag) || tag->hasAttr())) { diff --git a/cpp2rust/converter/rules/type_matcher.cpp b/cpp2rust/converter/rules/type_matcher.cpp index 642d188a9..fc1f6bae0 100644 --- a/cpp2rust/converter/rules/type_matcher.cpp +++ b/cpp2rust/converter/rules/type_matcher.cpp @@ -156,24 +156,6 @@ std::optional MatchType(clang::Sema &sema, clang::QualType use, return std::nullopt; } -bool MatchPublicAlias(clang::ASTContext &ctx, clang::QualType use, - const clang::NamedDecl *rule) { - auto internal = - llvm::dyn_cast(peelSugar(ctx, use).getTypePtr()); - auto alias = llvm::dyn_cast(rule); - if (!internal || !alias || !isInternal(internal->getDecl()) || - IsUserDefinedDecl(internal->getDecl())) { - return false; - } - auto pattern = llvm::dyn_cast( - peelSugar(ctx, alias->getUnderlyingType()).getTypePtr()); - if (!pattern || isInternal(pattern->getDecl())) { - return false; - } - auto target = peelSugar(ctx, pattern->getDecl()->getUnderlyingType()); - return isSameSugar(target.getTypePtr(), internal); -} - clang::QualType SkipInternalTypedefs(clang::ASTContext &ctx, clang::QualType use) { auto cvr = use.getLocalCVRQualifiers(); diff --git a/cpp2rust/converter/rules/type_matcher.h b/cpp2rust/converter/rules/type_matcher.h index 1c6cf62d3..8b5826110 100644 --- a/cpp2rust/converter/rules/type_matcher.h +++ b/cpp2rust/converter/rules/type_matcher.h @@ -19,9 +19,6 @@ struct TypeMatch { std::optional MatchType(clang::Sema &sema, clang::QualType use, const clang::NamedDecl *rule); -bool MatchPublicAlias(clang::ASTContext &ctx, clang::QualType use, - const clang::NamedDecl *rule); - clang::QualType SkipInternalTypedefs(clang::ASTContext &ctx, clang::QualType use); diff --git a/rules/sys_types/src.c b/rules/sys_types/src.c index 19d34179e..13ab5fa19 100644 --- a/rules/sys_types/src.c +++ b/rules/sys_types/src.c @@ -2,6 +2,12 @@ // Distributed under the MIT license that can be found in the LICENSE file. #include +#include typedef uid_t t1; typedef off_t t2; + +#ifdef __GLIBC__ +typedef __typeof__(getuid()) t3; +typedef __typeof__(lseek(0, 0, 0)) t4; +#endif diff --git a/rules/sys_types/tgt_unsafe.rs b/rules/sys_types/tgt_unsafe.rs index 9b5bb05d0..4538a0811 100644 --- a/rules/sys_types/tgt_unsafe.rs +++ b/rules/sys_types/tgt_unsafe.rs @@ -8,3 +8,11 @@ fn t1() -> ::libc::uid_t { fn t2() -> ::libc::off_t { 0 as ::libc::off_t } + +fn t3() -> ::libc::uid_t { + 0 as ::libc::uid_t +} + +fn t4() -> ::libc::off_t { + 0 as ::libc::off_t +} From 885f9165af6f8b27c56e0b9088cb11ccab3f5cc0 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 11:40:24 +0100 Subject: [PATCH 52/62] Add rules for private typedefs --- cpp2rust/converter/rules/registry.cpp | 5 ++--- rules/sys_types/src.c | 5 ++--- rules/time/src.c | 8 ++++++++ rules/time/tgt_unsafe.rs | 4 ++++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/cpp2rust/converter/rules/registry.cpp b/cpp2rust/converter/rules/registry.cpp index 07f0bf20b..55ce85dc2 100644 --- a/cpp2rust/converter/rules/registry.cpp +++ b/cpp2rust/converter/rules/registry.cpp @@ -282,9 +282,8 @@ TypeRuleMatch findType(clang::QualType use) { auto [begin, end] = types_.equal_range(key); for (auto it = begin; it != end; ++it) { auto alias = llvm::dyn_cast(it->second.decl); - if (!alias || - AstMatcher::SpelledTypedef(ctx, alias->getUnderlyingType()) != - spelled) { + if (!alias || AstMatcher::SpelledTypedef( + ctx, alias->getUnderlyingType()) != spelled) { continue; } if (best.rule_decl) { diff --git a/rules/sys_types/src.c b/rules/sys_types/src.c index 13ab5fa19..1ff3310fb 100644 --- a/rules/sys_types/src.c +++ b/rules/sys_types/src.c @@ -2,12 +2,11 @@ // Distributed under the MIT license that can be found in the LICENSE file. #include -#include typedef uid_t t1; typedef off_t t2; #ifdef __GLIBC__ -typedef __typeof__(getuid()) t3; -typedef __typeof__(lseek(0, 0, 0)) t4; +typedef __uid_t t3; +typedef __off_t t4; #endif diff --git a/rules/time/src.c b/rules/time/src.c index beb9f89bb..86c741c58 100644 --- a/rules/time/src.c +++ b/rules/time/src.c @@ -9,6 +9,14 @@ typedef struct timeval t2; typedef struct timespec t3; typedef time_t t4; +#if defined(__GLIBC__) +typedef __time_t t5; +#elif defined(__APPLE__) +typedef __darwin_time_t t5; +#else +#error "Unsupported platform for time_t" +#endif + time_t f1(time_t *t) { return time(t); } int f2(clockid_t clk_id, struct timespec *tp) { diff --git a/rules/time/tgt_unsafe.rs b/rules/time/tgt_unsafe.rs index e244133ce..747532907 100644 --- a/rules/time/tgt_unsafe.rs +++ b/rules/time/tgt_unsafe.rs @@ -17,6 +17,10 @@ fn t4() -> ::libc::time_t { 0 as ::libc::time_t } +fn t5() -> ::libc::time_t { + 0 as ::libc::time_t +} + unsafe fn f1(a0: *mut ::libc::time_t) -> ::libc::time_t { libc::time(a0) } From c5156acacb78933a982bb9e89f7a272371820177 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 20 Oct 2026 20:51:42 +0100 Subject: [PATCH 53/62] Only analyse user code in address taken visitor --- cpp2rust/converter/models/boxed_vars.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cpp2rust/converter/models/boxed_vars.cpp b/cpp2rust/converter/models/boxed_vars.cpp index e5c13c981..a0667b771 100644 --- a/cpp2rust/converter/models/boxed_vars.cpp +++ b/cpp2rust/converter/models/boxed_vars.cpp @@ -4,6 +4,7 @@ #include "converter/models/boxed_vars.h" #include +#include #include #include @@ -110,6 +111,14 @@ class AddressTakenVisitor bool shouldVisitTemplateInstantiations() const { return true; } + bool TraverseDecl(clang::Decl *decl) { + if (decl && !llvm::isa(decl) && + ctx_.getSourceManager().isInSystemHeader(decl->getLocation())) { + return true; + } + return RecursiveASTVisitor::TraverseDecl(decl); + } + // Only the semantic form of an initializer list is converted, in which the // values of variables are read through lvalue-to-rvalue conversions. bool TraverseInitListExpr(clang::InitListExpr *expr, From b8180441e79992c4fd13a46536c269e89f2f80a8 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 12:12:04 +0100 Subject: [PATCH 54/62] Insert rule for private typedef to avoid spelling them in rules --- cpp2rust/converter/rules/decls.cpp | 24 ++++++++++++++ cpp2rust/converter/rules/decls.h | 2 ++ cpp2rust/converter/rules/type_matcher.cpp | 26 +--------------- .../rule_preprocessing/cpp_rule_indexer.cpp | 31 +++++++++++++++++++ rules/sys_types/src.c | 5 --- rules/sys_types/tgt_unsafe.rs | 8 ----- rules/time/src.c | 8 ----- rules/time/tgt_unsafe.rs | 4 --- 8 files changed, 58 insertions(+), 50 deletions(-) diff --git a/cpp2rust/converter/rules/decls.cpp b/cpp2rust/converter/rules/decls.cpp index 5c7eb83a5..c6eded79f 100644 --- a/cpp2rust/converter/rules/decls.cpp +++ b/cpp2rust/converter/rules/decls.cpp @@ -103,4 +103,28 @@ DeduceFromType(clang::Sema &sema, clang::TemplateParameterList *params, return std::vector(deduced.begin(), deduced.end()); } +bool IsInternal(const clang::NamedDecl *decl) { + if (decl->getAccess() == clang::AS_private || + decl->getAccess() == clang::AS_protected) { + return true; + } + auto &opts = decl->getASTContext().getLangOpts(); + if (decl->isReserved(opts) != clang::ReservedIdentifierStatus::NotReserved) { + return true; + } + for (auto context = decl->getDeclContext(); context; + context = context->getParent()) { + if (context->isInlineNamespace()) { + continue; + } + auto named = llvm::dyn_cast(context); + if (named && named->getIdentifier() && + named->isReserved(opts) != + clang::ReservedIdentifierStatus::NotReserved) { + return true; + } + } + return false; +} + } // namespace cpp2rust::RuleDecls diff --git a/cpp2rust/converter/rules/decls.h b/cpp2rust/converter/rules/decls.h index 2ab5a2729..6719633ed 100644 --- a/cpp2rust/converter/rules/decls.h +++ b/cpp2rust/converter/rules/decls.h @@ -46,4 +46,6 @@ std::optional> DeduceFromType(clang::Sema &sema, clang::TemplateParameterList *params, clang::QualType pattern, clang::QualType actual); +bool IsInternal(const clang::NamedDecl *decl); + } // namespace cpp2rust::RuleDecls diff --git a/cpp2rust/converter/rules/type_matcher.cpp b/cpp2rust/converter/rules/type_matcher.cpp index fc1f6bae0..34d874c68 100644 --- a/cpp2rust/converter/rules/type_matcher.cpp +++ b/cpp2rust/converter/rules/type_matcher.cpp @@ -55,30 +55,6 @@ clang::QualType peelSugar(clang::ASTContext &ctx, clang::QualType type) { return type; } -bool isInternal(const clang::NamedDecl *decl) { - if (decl->getAccess() == clang::AS_private || - decl->getAccess() == clang::AS_protected) { - return true; - } - auto &opts = decl->getASTContext().getLangOpts(); - if (decl->isReserved(opts) != clang::ReservedIdentifierStatus::NotReserved) { - return true; - } - for (auto context = decl->getDeclContext(); context; - context = context->getParent()) { - if (context->isInlineNamespace()) { - continue; - } - auto named = llvm::dyn_cast(context); - if (named && named->getIdentifier() && - named->isReserved(opts) != - clang::ReservedIdentifierStatus::NotReserved) { - return true; - } - } - return false; -} - const clang::Type *getSugar(clang::QualType type) { if (auto typeof_type = llvm::dyn_cast(type.getTypePtr())) { @@ -163,7 +139,7 @@ clang::QualType SkipInternalTypedefs(clang::ASTContext &ctx, while (auto typedef_type = llvm::dyn_cast(type.getTypePtr())) { auto decl = typedef_type->getDecl(); - if (!isInternal(decl) && !IsUserDefinedDecl(decl)) { + if (!RuleDecls::IsInternal(decl) && !IsUserDefinedDecl(decl)) { break; } type = peelSugar(ctx, typedef_type->desugar()); diff --git a/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp b/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp index 7879881b7..4f4cd061c 100644 --- a/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp +++ b/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp @@ -27,6 +27,7 @@ #include "compat/platform_flags.h" #include "converter/rules/rules_loader.h" +#include "converter/rules/decls.h" namespace fs = std::filesystem; @@ -230,6 +231,28 @@ std::string TypeKey(const clang::TypedefNameDecl *rule) { return ClassOf(type); } +const clang::TypedefNameDecl *InternalTypedefOf(const clang::Decl *rule) { + auto alias = llvm::dyn_cast(rule); + if (!alias) { + return nullptr; + } + auto pattern = alias->getUnderlyingType()->getAs(); + if (!pattern || RuleDecls::IsInternal(pattern->getDecl()) || + !pattern->getDecl()->getDeclContext()->getRedeclContext()->isFileContext()) { + return nullptr; + } + auto internal = + pattern->getDecl()->getUnderlyingType()->getAs(); + if (!internal || !RuleDecls::IsInternal(internal->getDecl()) || + !internal->getDecl() + ->getDeclContext() + ->getRedeclContext() + ->isTranslationUnit()) { + return nullptr; + } + return internal->getDecl(); +} + void AddRule(llvm::json::Object &rules, std::string key, llvm::json::Value rule) { auto &slot = rules[llvm::json::ObjectKey(std::move(key))]; @@ -285,6 +308,14 @@ void IndexRuleFile(clang::ASTContext &ctx, const std::string &dir_name, rule["requires"] = llvm::json::Array(required); } AddRule(rules, key, std::move(rule)); + if (auto internal = InternalTypedefOf(decl)) { + AddRule(rules, RulesLoader::DeclKey(internal), + llvm::json::Object{ + {"dir", dir_name}, + {"name", name}, + {"text", std::format("typedef {} {};\n", + internal->getName().str(), name)}}); + } } } diff --git a/rules/sys_types/src.c b/rules/sys_types/src.c index 1ff3310fb..19d34179e 100644 --- a/rules/sys_types/src.c +++ b/rules/sys_types/src.c @@ -5,8 +5,3 @@ typedef uid_t t1; typedef off_t t2; - -#ifdef __GLIBC__ -typedef __uid_t t3; -typedef __off_t t4; -#endif diff --git a/rules/sys_types/tgt_unsafe.rs b/rules/sys_types/tgt_unsafe.rs index 4538a0811..9b5bb05d0 100644 --- a/rules/sys_types/tgt_unsafe.rs +++ b/rules/sys_types/tgt_unsafe.rs @@ -8,11 +8,3 @@ fn t1() -> ::libc::uid_t { fn t2() -> ::libc::off_t { 0 as ::libc::off_t } - -fn t3() -> ::libc::uid_t { - 0 as ::libc::uid_t -} - -fn t4() -> ::libc::off_t { - 0 as ::libc::off_t -} diff --git a/rules/time/src.c b/rules/time/src.c index 86c741c58..beb9f89bb 100644 --- a/rules/time/src.c +++ b/rules/time/src.c @@ -9,14 +9,6 @@ typedef struct timeval t2; typedef struct timespec t3; typedef time_t t4; -#if defined(__GLIBC__) -typedef __time_t t5; -#elif defined(__APPLE__) -typedef __darwin_time_t t5; -#else -#error "Unsupported platform for time_t" -#endif - time_t f1(time_t *t) { return time(t); } int f2(clockid_t clk_id, struct timespec *tp) { diff --git a/rules/time/tgt_unsafe.rs b/rules/time/tgt_unsafe.rs index 747532907..e244133ce 100644 --- a/rules/time/tgt_unsafe.rs +++ b/rules/time/tgt_unsafe.rs @@ -17,10 +17,6 @@ fn t4() -> ::libc::time_t { 0 as ::libc::time_t } -fn t5() -> ::libc::time_t { - 0 as ::libc::time_t -} - unsafe fn f1(a0: *mut ::libc::time_t) -> ::libc::time_t { libc::time(a0) } From 5aa797739b816b4074179f9c054c8f9773a76506 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 12:13:03 +0100 Subject: [PATCH 55/62] Delete duplicated --- rules/fs_path/src_cxx17.cpp | 2 -- rules/fs_path/tgt_refcount.rs | 4 ---- rules/fs_path/tgt_unsafe.rs | 4 ---- 3 files changed, 10 deletions(-) diff --git a/rules/fs_path/src_cxx17.cpp b/rules/fs_path/src_cxx17.cpp index 364861f49..9293ddd62 100644 --- a/rules/fs_path/src_cxx17.cpp +++ b/rules/fs_path/src_cxx17.cpp @@ -7,8 +7,6 @@ using t1 = std::filesystem::path; -typedef std::filesystem::path::string_type t2; - std::filesystem::path f1(const char *a0) { return std::filesystem::path(a0); } std::string f2(const std::filesystem::path &a0) { diff --git a/rules/fs_path/tgt_refcount.rs b/rules/fs_path/tgt_refcount.rs index 3ef84b185..0c0aa15ac 100644 --- a/rules/fs_path/tgt_refcount.rs +++ b/rules/fs_path/tgt_refcount.rs @@ -7,10 +7,6 @@ fn t1() -> Vec { vec![0] } -fn t2() -> Vec { - vec![0] -} - fn f1(a0: Ptr) -> Vec { let mut __v = Vec::new(); a0.with_c_str(|__s| __v.extend_from_slice(__s)); diff --git a/rules/fs_path/tgt_unsafe.rs b/rules/fs_path/tgt_unsafe.rs index 1e600b6f7..a76d55f60 100644 --- a/rules/fs_path/tgt_unsafe.rs +++ b/rules/fs_path/tgt_unsafe.rs @@ -5,10 +5,6 @@ fn t1() -> Vec { vec![0] } -fn t2() -> Vec { - vec![0] -} - unsafe fn f1(a0: *const libc::c_char) -> Vec { let mut __v = ::std::ffi::CStr::from_ptr(a0) .to_bytes() From 57f2cdc59e03bbd7221abfb24e0dfa80edc471d7 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 12:14:34 +0100 Subject: [PATCH 56/62] format --- cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp | 7 +++++-- rules/fs_path/src_cxx17.cpp | 1 - 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp b/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp index 4f4cd061c..47445ed51 100644 --- a/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp +++ b/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp @@ -26,8 +26,8 @@ #include #include "compat/platform_flags.h" -#include "converter/rules/rules_loader.h" #include "converter/rules/decls.h" +#include "converter/rules/rules_loader.h" namespace fs = std::filesystem; @@ -238,7 +238,10 @@ const clang::TypedefNameDecl *InternalTypedefOf(const clang::Decl *rule) { } auto pattern = alias->getUnderlyingType()->getAs(); if (!pattern || RuleDecls::IsInternal(pattern->getDecl()) || - !pattern->getDecl()->getDeclContext()->getRedeclContext()->isFileContext()) { + !pattern->getDecl() + ->getDeclContext() + ->getRedeclContext() + ->isFileContext()) { return nullptr; } auto internal = diff --git a/rules/fs_path/src_cxx17.cpp b/rules/fs_path/src_cxx17.cpp index 9293ddd62..8d8e5b192 100644 --- a/rules/fs_path/src_cxx17.cpp +++ b/rules/fs_path/src_cxx17.cpp @@ -2,7 +2,6 @@ // Distributed under the MIT license that can be found in the LICENSE file. #include - #include using t1 = std::filesystem::path; From f54d1fe60d9e095e852574cf8a593e463e7dbd5b Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 12:16:54 +0100 Subject: [PATCH 57/62] Move filesystem rule in fs_path --- rules/fs_path/src_cxx17.cpp | 2 ++ rules/fs_path/tgt_refcount.rs | 4 ++++ rules/fs_path/tgt_unsafe.rs | 4 ++++ rules/string/src_cxx17.cpp | 3 --- rules/string/tgt_refcount.rs | 4 ---- rules/string/tgt_unsafe.rs | 4 ---- 6 files changed, 10 insertions(+), 11 deletions(-) diff --git a/rules/fs_path/src_cxx17.cpp b/rules/fs_path/src_cxx17.cpp index 8d8e5b192..3ee40c87b 100644 --- a/rules/fs_path/src_cxx17.cpp +++ b/rules/fs_path/src_cxx17.cpp @@ -6,6 +6,8 @@ using t1 = std::filesystem::path; +typedef std::filesystem::path::string_type t2; + std::filesystem::path f1(const char *a0) { return std::filesystem::path(a0); } std::string f2(const std::filesystem::path &a0) { diff --git a/rules/fs_path/tgt_refcount.rs b/rules/fs_path/tgt_refcount.rs index 0c0aa15ac..3ef84b185 100644 --- a/rules/fs_path/tgt_refcount.rs +++ b/rules/fs_path/tgt_refcount.rs @@ -7,6 +7,10 @@ fn t1() -> Vec { vec![0] } +fn t2() -> Vec { + vec![0] +} + fn f1(a0: Ptr) -> Vec { let mut __v = Vec::new(); a0.with_c_str(|__s| __v.extend_from_slice(__s)); diff --git a/rules/fs_path/tgt_unsafe.rs b/rules/fs_path/tgt_unsafe.rs index a76d55f60..1e600b6f7 100644 --- a/rules/fs_path/tgt_unsafe.rs +++ b/rules/fs_path/tgt_unsafe.rs @@ -5,6 +5,10 @@ fn t1() -> Vec { vec![0] } +fn t2() -> Vec { + vec![0] +} + unsafe fn f1(a0: *const libc::c_char) -> Vec { let mut __v = ::std::ffi::CStr::from_ptr(a0) .to_bytes() diff --git a/rules/string/src_cxx17.cpp b/rules/string/src_cxx17.cpp index a938aecc7..3ad1e6587 100644 --- a/rules/string/src_cxx17.cpp +++ b/rules/string/src_cxx17.cpp @@ -1,9 +1,6 @@ // Copyright (c) 2022-present INESC-ID. // Distributed under the MIT license that can be found in the LICENSE file. -#include #include -typedef std::filesystem::path::string_type t8; - auto f6(std::string &s) -> decltype(s.data()) { return s.data(); } diff --git a/rules/string/tgt_refcount.rs b/rules/string/tgt_refcount.rs index 1dd47416e..64e2350f0 100644 --- a/rules/string/tgt_refcount.rs +++ b/rules/string/tgt_refcount.rs @@ -25,10 +25,6 @@ fn t7() -> i8 { 0_i8 } -fn t8() -> Vec { - vec![0] -} - fn f1(a0: Vec, a1: usize, a2: usize) -> Vec { let mut __tmp1 = a0[(a1) as usize..::std::cmp::min((a1 + a2) as usize, a0.len().saturating_sub(1))].to_vec(); diff --git a/rules/string/tgt_unsafe.rs b/rules/string/tgt_unsafe.rs index 569df08eb..958a74029 100644 --- a/rules/string/tgt_unsafe.rs +++ b/rules/string/tgt_unsafe.rs @@ -27,10 +27,6 @@ fn t7() -> libc::c_char { 0 as libc::c_char } -fn t8() -> Vec { - vec![0] -} - unsafe fn f1(a0: Vec, a1: usize, a2: usize) -> Vec { let mut __tmp1 = a0[(a1) as usize..::std::cmp::min((a1 + a2) as usize, a0.len() - 1)].to_vec(); __tmp1.push(0); From 0c91bae54ee478f9689b72256ca305d7445dd7b9 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 12:22:40 +0100 Subject: [PATCH 58/62] Refactor --- cpp2rust/converter/rules/decls.cpp | 46 +++++++++++++++ cpp2rust/converter/rules/decls.h | 10 ++++ cpp2rust/converter/rules/registry.cpp | 69 +++++++++-------------- cpp2rust/converter/rules/type_matcher.cpp | 53 ++--------------- cpp2rust/converter/rules/type_matcher.h | 6 -- 5 files changed, 88 insertions(+), 96 deletions(-) diff --git a/cpp2rust/converter/rules/decls.cpp b/cpp2rust/converter/rules/decls.cpp index c6eded79f..9de6b42e7 100644 --- a/cpp2rust/converter/rules/decls.cpp +++ b/cpp2rust/converter/rules/decls.cpp @@ -13,6 +13,8 @@ #include #include +#include "converter/converter_lib.h" + namespace cpp2rust::RuleDecls { const clang::Expr *SkipImplicit(const clang::Expr *expr) { @@ -127,4 +129,48 @@ bool IsInternal(const clang::NamedDecl *decl) { return false; } +clang::QualType PeelSugar(clang::ASTContext &ctx, clang::QualType type) { + while (!llvm::isa( + type.getTypePtr()) && + type != type.getSingleStepDesugaredType(ctx)) { + type = type.getSingleStepDesugaredType(ctx); + } + return type; +} + +const clang::Type *GetSugar(clang::QualType type) { + if (auto typeof_type = + llvm::dyn_cast(type.getTypePtr())) { + type = typeof_type->getUnderlyingExpr()->getType(); + } + if (llvm::isa( + type.getTypePtr())) { + return type.getTypePtr(); + } + return nullptr; +} + +clang::QualType SkipInternalTypedefs(clang::ASTContext &ctx, + clang::QualType use) { + auto cvr = use.getLocalCVRQualifiers(); + auto type = PeelSugar(ctx, use); + while (auto typedef_type = + llvm::dyn_cast(type.getTypePtr())) { + auto decl = typedef_type->getDecl(); + if (!IsInternal(decl) && !IsUserDefinedDecl(decl)) { + break; + } + type = PeelSugar(ctx, typedef_type->desugar()); + cvr |= type.getLocalCVRQualifiers(); + } + return type.withCVRQualifiers(cvr); +} + +const clang::TypedefNameDecl *SpelledTypedef(clang::ASTContext &ctx, + clang::QualType use) { + auto sugar = GetSugar(PeelSugar(ctx, use)); + auto typedef_type = llvm::dyn_cast_or_null(sugar); + return typedef_type ? typedef_type->getDecl() : nullptr; +} + } // namespace cpp2rust::RuleDecls diff --git a/cpp2rust/converter/rules/decls.h b/cpp2rust/converter/rules/decls.h index 6719633ed..934200e5b 100644 --- a/cpp2rust/converter/rules/decls.h +++ b/cpp2rust/converter/rules/decls.h @@ -48,4 +48,14 @@ DeduceFromType(clang::Sema &sema, clang::TemplateParameterList *params, bool IsInternal(const clang::NamedDecl *decl); +clang::QualType PeelSugar(clang::ASTContext &ctx, clang::QualType type); + +const clang::Type *GetSugar(clang::QualType type); + +clang::QualType SkipInternalTypedefs(clang::ASTContext &ctx, + clang::QualType use); + +const clang::TypedefNameDecl *SpelledTypedef(clang::ASTContext &ctx, + clang::QualType use); + } // namespace cpp2rust::RuleDecls diff --git a/cpp2rust/converter/rules/registry.cpp b/cpp2rust/converter/rules/registry.cpp index 55ce85dc2..63091d20f 100644 --- a/cpp2rust/converter/rules/registry.cpp +++ b/cpp2rust/converter/rules/registry.cpp @@ -275,26 +275,39 @@ struct TypeRuleMatch { TypeRuleMatch findType(clang::QualType use) { TypeRuleMatch best; auto &ctx = sema_->Context; - auto spelled = AstMatcher::SpelledTypedef(ctx, use); - auto skipped = AstMatcher::SkipInternalTypedefs(ctx, use); - if (spelled && AstMatcher::SpelledTypedef(ctx, skipped) != spelled) { - for (auto key : RuleKeys::GetTypeKeys(ctx, use)) { + auto consider = [&](clang::QualType type, bool templates) { + for (auto key : RuleKeys::GetTypeKeys(ctx, type)) { auto [begin, end] = types_.equal_range(key); for (auto it = begin; it != end; ++it) { - auto alias = llvm::dyn_cast(it->second.decl); - if (!alias || AstMatcher::SpelledTypedef( - ctx, alias->getUnderlyingType()) != spelled) { + if (!templates && llvm::isa(it->second.decl)) { + continue; + } + auto match = AstMatcher::MatchType(*sema_, type, it->second.decl); + if (!match) { continue; } if (best.rule_decl) { - use.dump(llvm::errs(), ctx); - it->second.decl->dump(llvm::errs()); - best.rule_decl->decl->dump(llvm::errs()); - llvm::report_fatal_error("internal typedef matches several rules"); + auto better = AstMatcher::MoreSpecializedType( + *sema_, it->second.decl, best.rule_decl->decl); + if (!better) { + type.dump(llvm::errs(), ctx); + it->second.decl->dump(llvm::errs()); + best.rule_decl->decl->dump(llvm::errs()); + llvm::report_fatal_error( + "type matches several rules, none more specialized"); + } + if (better != it->second.decl) { + continue; + } } - best = {&it->second, {}}; + best = {&it->second, *std::move(match)}; } } + }; + auto skipped = RuleDecls::SkipInternalTypedefs(ctx, use); + if (RuleDecls::SpelledTypedef(ctx, skipped) != + RuleDecls::SpelledTypedef(ctx, use)) { + consider(use, /*templates=*/false); if (best.rule_decl) { return best; } @@ -305,37 +318,11 @@ TypeRuleMatch findType(clang::QualType use) { (IsUserDefinedDecl(tag) || tag->hasAttr())) { return best; } - auto consider = [&](const RuleKeys::TypeKey &key) { - auto [begin, end] = types_.equal_range(key); - for (auto it = begin; it != end; ++it) { - auto match = AstMatcher::MatchType(*sema_, use, it->second.decl); - if (!match) { - continue; - } - if (best.rule_decl) { - auto better = AstMatcher::MoreSpecializedType(*sema_, it->second.decl, - best.rule_decl->decl); - if (!better) { - use.dump(llvm::errs(), sema_->Context); - it->second.decl->dump(llvm::errs()); - best.rule_decl->decl->dump(llvm::errs()); - llvm::report_fatal_error( - "type matches several rules, none more specialized"); - } - if (better != it->second.decl) { - continue; - } - } - best = {&it->second, *std::move(match)}; - } - }; - for (auto key : RuleKeys::GetTypeKeys(sema_->Context, use)) { - consider(key); - } + consider(use, /*templates=*/true); if (!best.rule_decl) { - auto spelled = AstMatcher::SpelledTypedef(sema_->Context, use); + auto spelled = RuleDecls::SpelledTypedef(ctx, use); if (spelled && !IsUserDefinedDecl(spelled)) { - use.dump(llvm::errs(), sema_->Context); + use.dump(llvm::errs(), ctx); llvm::report_fatal_error("typedef has no type rule"); } } diff --git a/cpp2rust/converter/rules/type_matcher.cpp b/cpp2rust/converter/rules/type_matcher.cpp index 34d874c68..5b8db2542 100644 --- a/cpp2rust/converter/rules/type_matcher.cpp +++ b/cpp2rust/converter/rules/type_matcher.cpp @@ -10,7 +10,6 @@ #include #include -#include "converter/converter_lib.h" #include "converter/rules/decls.h" namespace cpp2rust::AstMatcher { @@ -46,27 +45,6 @@ completeArgs(clang::Sema &sema, const clang::TypeAliasTemplateDecl *tmpl, info.CanonicalConverted.end()); } -clang::QualType peelSugar(clang::ASTContext &ctx, clang::QualType type) { - while (!llvm::isa( - type.getTypePtr()) && - type != type.getSingleStepDesugaredType(ctx)) { - type = type.getSingleStepDesugaredType(ctx); - } - return type; -} - -const clang::Type *getSugar(clang::QualType type) { - if (auto typeof_type = - llvm::dyn_cast(type.getTypePtr())) { - type = typeof_type->getUnderlyingExpr()->getType(); - } - if (llvm::isa( - type.getTypePtr())) { - return type.getTypePtr(); - } - return nullptr; -} - bool isSameSugar(const clang::Type *a, const clang::Type *b) { auto a_typedef = llvm::dyn_cast(a); auto b_typedef = llvm::dyn_cast(b); @@ -83,19 +61,19 @@ bool isSameSugar(const clang::Type *a, const clang::Type *b) { std::optional MatchType(clang::Sema &sema, clang::QualType use, const clang::NamedDecl *rule) { auto &ctx = sema.Context; - auto spelled = peelSugar(ctx, use).getUnqualifiedType(); + auto spelled = RuleDecls::PeelSugar(ctx, use).getUnqualifiedType(); auto tmpl = llvm::dyn_cast(rule); auto alias = tmpl ? tmpl->getTemplatedDecl() : llvm::cast(rule); auto pattern = alias->getUnderlyingType(); if (!tmpl) { - if (auto sugar = getSugar(pattern)) { + if (auto sugar = RuleDecls::GetSugar(pattern)) { if (!isSameSugar(spelled.getTypePtr(), sugar)) { return std::nullopt; } return TypeMatch{}; } - if (getSugar(spelled) || !ctx.hasSameUnqualifiedType(pattern, spelled)) { + if (RuleDecls::GetSugar(spelled) || !ctx.hasSameUnqualifiedType(pattern, spelled)) { return std::nullopt; } return TypeMatch{}; @@ -122,7 +100,7 @@ std::optional MatchType(clang::Sema &sema, clang::QualType use, } return std::nullopt; } - if (getSugar(spelled) && !pattern->getAs()) { + if (RuleDecls::GetSugar(spelled) && !pattern->getAs()) { return std::nullopt; } auto args = RuleDecls::DeduceFromType(sema, params, pattern, spelled); @@ -132,29 +110,6 @@ std::optional MatchType(clang::Sema &sema, clang::QualType use, return std::nullopt; } -clang::QualType SkipInternalTypedefs(clang::ASTContext &ctx, - clang::QualType use) { - auto cvr = use.getLocalCVRQualifiers(); - auto type = peelSugar(ctx, use); - while (auto typedef_type = - llvm::dyn_cast(type.getTypePtr())) { - auto decl = typedef_type->getDecl(); - if (!RuleDecls::IsInternal(decl) && !IsUserDefinedDecl(decl)) { - break; - } - type = peelSugar(ctx, typedef_type->desugar()); - cvr |= type.getLocalCVRQualifiers(); - } - return type.withCVRQualifiers(cvr); -} - -const clang::TypedefNameDecl *SpelledTypedef(clang::ASTContext &ctx, - clang::QualType use) { - auto sugar = getSugar(peelSugar(ctx, use)); - auto typedef_type = llvm::dyn_cast_or_null(sugar); - return typedef_type ? typedef_type->getDecl() : nullptr; -} - const clang::NamedDecl *MoreSpecializedType(clang::Sema &sema, const clang::NamedDecl *a, const clang::NamedDecl *b) { diff --git a/cpp2rust/converter/rules/type_matcher.h b/cpp2rust/converter/rules/type_matcher.h index 8b5826110..f1740ae30 100644 --- a/cpp2rust/converter/rules/type_matcher.h +++ b/cpp2rust/converter/rules/type_matcher.h @@ -19,12 +19,6 @@ struct TypeMatch { std::optional MatchType(clang::Sema &sema, clang::QualType use, const clang::NamedDecl *rule); -clang::QualType SkipInternalTypedefs(clang::ASTContext &ctx, - clang::QualType use); - -const clang::TypedefNameDecl *SpelledTypedef(clang::ASTContext &ctx, - clang::QualType use); - const clang::NamedDecl *MoreSpecializedType(clang::Sema &sema, const clang::NamedDecl *a, const clang::NamedDecl *b); From 3ba89a5c0c93f576e772d4eaa5ca8143b07f7839 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 12:41:18 +0100 Subject: [PATCH 59/62] Revert platform specific names --- .../rule_preprocessing/cpp_rule_indexer.cpp | 34 ------------------- rules/sys_types/src.c | 5 +++ rules/sys_types/tgt_unsafe.rs | 8 +++++ rules/time/src.c | 8 +++++ rules/time/tgt_unsafe.rs | 4 +++ 5 files changed, 25 insertions(+), 34 deletions(-) diff --git a/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp b/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp index 47445ed51..7879881b7 100644 --- a/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp +++ b/cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp @@ -26,7 +26,6 @@ #include #include "compat/platform_flags.h" -#include "converter/rules/decls.h" #include "converter/rules/rules_loader.h" namespace fs = std::filesystem; @@ -231,31 +230,6 @@ std::string TypeKey(const clang::TypedefNameDecl *rule) { return ClassOf(type); } -const clang::TypedefNameDecl *InternalTypedefOf(const clang::Decl *rule) { - auto alias = llvm::dyn_cast(rule); - if (!alias) { - return nullptr; - } - auto pattern = alias->getUnderlyingType()->getAs(); - if (!pattern || RuleDecls::IsInternal(pattern->getDecl()) || - !pattern->getDecl() - ->getDeclContext() - ->getRedeclContext() - ->isFileContext()) { - return nullptr; - } - auto internal = - pattern->getDecl()->getUnderlyingType()->getAs(); - if (!internal || !RuleDecls::IsInternal(internal->getDecl()) || - !internal->getDecl() - ->getDeclContext() - ->getRedeclContext() - ->isTranslationUnit()) { - return nullptr; - } - return internal->getDecl(); -} - void AddRule(llvm::json::Object &rules, std::string key, llvm::json::Value rule) { auto &slot = rules[llvm::json::ObjectKey(std::move(key))]; @@ -311,14 +285,6 @@ void IndexRuleFile(clang::ASTContext &ctx, const std::string &dir_name, rule["requires"] = llvm::json::Array(required); } AddRule(rules, key, std::move(rule)); - if (auto internal = InternalTypedefOf(decl)) { - AddRule(rules, RulesLoader::DeclKey(internal), - llvm::json::Object{ - {"dir", dir_name}, - {"name", name}, - {"text", std::format("typedef {} {};\n", - internal->getName().str(), name)}}); - } } } diff --git a/rules/sys_types/src.c b/rules/sys_types/src.c index 19d34179e..1ff3310fb 100644 --- a/rules/sys_types/src.c +++ b/rules/sys_types/src.c @@ -5,3 +5,8 @@ typedef uid_t t1; typedef off_t t2; + +#ifdef __GLIBC__ +typedef __uid_t t3; +typedef __off_t t4; +#endif diff --git a/rules/sys_types/tgt_unsafe.rs b/rules/sys_types/tgt_unsafe.rs index 9b5bb05d0..4538a0811 100644 --- a/rules/sys_types/tgt_unsafe.rs +++ b/rules/sys_types/tgt_unsafe.rs @@ -8,3 +8,11 @@ fn t1() -> ::libc::uid_t { fn t2() -> ::libc::off_t { 0 as ::libc::off_t } + +fn t3() -> ::libc::uid_t { + 0 as ::libc::uid_t +} + +fn t4() -> ::libc::off_t { + 0 as ::libc::off_t +} diff --git a/rules/time/src.c b/rules/time/src.c index beb9f89bb..86c741c58 100644 --- a/rules/time/src.c +++ b/rules/time/src.c @@ -9,6 +9,14 @@ typedef struct timeval t2; typedef struct timespec t3; typedef time_t t4; +#if defined(__GLIBC__) +typedef __time_t t5; +#elif defined(__APPLE__) +typedef __darwin_time_t t5; +#else +#error "Unsupported platform for time_t" +#endif + time_t f1(time_t *t) { return time(t); } int f2(clockid_t clk_id, struct timespec *tp) { diff --git a/rules/time/tgt_unsafe.rs b/rules/time/tgt_unsafe.rs index e244133ce..747532907 100644 --- a/rules/time/tgt_unsafe.rs +++ b/rules/time/tgt_unsafe.rs @@ -17,6 +17,10 @@ fn t4() -> ::libc::time_t { 0 as ::libc::time_t } +fn t5() -> ::libc::time_t { + 0 as ::libc::time_t +} + unsafe fn f1(a0: *mut ::libc::time_t) -> ::libc::time_t { libc::time(a0) } From b71a9c4b26ab9a32ed9c1a91ea9068969dd97377 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 12:49:37 +0100 Subject: [PATCH 60/62] Format --- cpp2rust/converter/rules/registry.cpp | 4 ++-- cpp2rust/converter/rules/type_matcher.cpp | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cpp2rust/converter/rules/registry.cpp b/cpp2rust/converter/rules/registry.cpp index 63091d20f..a526239da 100644 --- a/cpp2rust/converter/rules/registry.cpp +++ b/cpp2rust/converter/rules/registry.cpp @@ -287,8 +287,8 @@ TypeRuleMatch findType(clang::QualType use) { continue; } if (best.rule_decl) { - auto better = AstMatcher::MoreSpecializedType( - *sema_, it->second.decl, best.rule_decl->decl); + auto better = AstMatcher::MoreSpecializedType(*sema_, it->second.decl, + best.rule_decl->decl); if (!better) { type.dump(llvm::errs(), ctx); it->second.decl->dump(llvm::errs()); diff --git a/cpp2rust/converter/rules/type_matcher.cpp b/cpp2rust/converter/rules/type_matcher.cpp index 5b8db2542..84b6ba7a8 100644 --- a/cpp2rust/converter/rules/type_matcher.cpp +++ b/cpp2rust/converter/rules/type_matcher.cpp @@ -73,7 +73,8 @@ std::optional MatchType(clang::Sema &sema, clang::QualType use, } return TypeMatch{}; } - if (RuleDecls::GetSugar(spelled) || !ctx.hasSameUnqualifiedType(pattern, spelled)) { + if (RuleDecls::GetSugar(spelled) || + !ctx.hasSameUnqualifiedType(pattern, spelled)) { return std::nullopt; } return TypeMatch{}; @@ -100,7 +101,8 @@ std::optional MatchType(clang::Sema &sema, clang::QualType use, } return std::nullopt; } - if (RuleDecls::GetSugar(spelled) && !pattern->getAs()) { + if (RuleDecls::GetSugar(spelled) && + !pattern->getAs()) { return std::nullopt; } auto args = RuleDecls::DeduceFromType(sema, params, pattern, spelled); From 292faf34b1b833332919cda7fe55ebee211e31f7 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 13:09:38 +0100 Subject: [PATCH 61/62] Add TODO --- rules/sys_types/src.c | 13 +++++++++++++ rules/time/src.c | 12 ++++++++++++ 2 files changed, 25 insertions(+) diff --git a/rules/sys_types/src.c b/rules/sys_types/src.c index 1ff3310fb..596945e08 100644 --- a/rules/sys_types/src.c +++ b/rules/sys_types/src.c @@ -6,6 +6,19 @@ typedef uid_t t1; typedef off_t t2; +// glibc declares some APIs with private typedefs, e.g. `__off_t lseek(...)`, +// where Darwin uses `off_t`. Give them the public typedef's translation so +// both platforms produce the same output. +// +// TODO: +// +// Rules are written in terms of standard names `off_t lseek(...)`, however +// libraries choose to implement them using library specific names `__off_t +// lseek(...)`. +// +// Fix this in converter by using the names in the rules, not the +// library-specific names. + #ifdef __GLIBC__ typedef __uid_t t3; typedef __off_t t4; diff --git a/rules/time/src.c b/rules/time/src.c index 86c741c58..15a7b8b68 100644 --- a/rules/time/src.c +++ b/rules/time/src.c @@ -9,6 +9,18 @@ typedef struct timeval t2; typedef struct timespec t3; typedef time_t t4; +// struct timespec::tv_sec is `__time_t` on glibc and `__darwin_time_t` on +// Darwin. Give both time_t's translation. +// +// TODO: +// +// Rules are written in terms of standard names `time_t tv_sec`, however +// libraries choose to implement them using library specific names `__time_t +// tv_sec`. +// +// Fix this in converter by using the names in the rules, not the +// library-specific names. + #if defined(__GLIBC__) typedef __time_t t5; #elif defined(__APPLE__) From 08a03d75b60439e7a4b681a3e8eff443233aea68 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 21 Oct 2026 13:11:27 +0100 Subject: [PATCH 62/62] Trigger CI