Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions cpp2rust/converter/models/converter_refcount.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2060,7 +2060,7 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(
StrCat(
std::format("{}.as_ref().unwrap()", ConvertRValue(expr->getArg(0))));
if (isAddrOf()) {
StrCat(std::format(".as_pointer().offset(({}) as isize)",
StrCat(std::format(".as_pointer().offset(({}))",
ConvertRValue(expr->getArg(1))));
} else {
if (isRValue()) {
Expand All @@ -2080,7 +2080,7 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(

if (isLValue()) {
PushConversionKind push_ck(*this, ConversionKind::Unboxed);
pending_deref_.set(std::format("({} as {}).offset({} as isize)",
pending_deref_.set(std::format("({} as {}).offset({})",
ConvertObject(expr->getArg(0)),
ConvertPtrType(expr->getArg(0)->getType()),
ConvertRValue(expr->getArg(1))),
Expand All @@ -2100,7 +2100,7 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(
}

PushConversionKind push(*this, ConversionKind::Unboxed);
StrCat(std::format("({} as {}).offset({} as isize)",
StrCat(std::format("({} as {}).offset({})",
ConvertObject(expr->getArg(0)),
ConvertPtrType(expr->getArg(0)->getType()),
ConvertRValue(expr->getArg(1))));
Expand Down Expand Up @@ -2151,7 +2151,7 @@ void ConverterRefCount::ConvertArraySubscript(clang::Expr *base,

{
PushParen paren(*this, is_inner_boxed);
StrCat(std::format("({} as {}).offset({} as isize)",
StrCat(std::format("({} as {}).offset({})",
ToString(base->IgnoreImplicit()),
ConvertPtrType(base->IgnoreImplicit()->getType()),
ConvertRValue(idx)));
Expand Down
6 changes: 5 additions & 1 deletion libcc2rs/src/rc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,11 @@ impl<T> Ptr<T> {
}

#[inline]
pub fn offset(&self, offset: isize) -> Self {
pub fn offset(&self, offset: impl TryInto<isize>) -> Self {
let offset = offset
.try_into()
.ok()
.expect("the offset must fit in a isize");
let step = self.elem_step();
Self {
kind: self.kind.clone(),
Expand Down
2 changes: 1 addition & 1 deletion tests/ub/out/refcount/ub7.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,5 @@ fn main_0() -> i32 {
('n' as u8),
('g' as u8),
])));
return (({ strlen_0(((s.as_pointer() as Ptr<u8>).offset(0 as isize))) }) as i32);
return (({ strlen_0(((s.as_pointer() as Ptr<u8>).offset(0))) }) as i32);
}
2 changes: 1 addition & 1 deletion tests/unit/out/refcount/04_address_taken_array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ fn main_0() -> i32 {
let arr2_ptr: Value<Ptr<i32>> = Rc::new(RefCell::new((arr2.as_pointer() as Ptr<i32>)));
(*arr2_ptr.borrow()).offset((0) as isize).write(5);
(*arr2_ptr.borrow()).offset((1) as isize).write(6);
let arr2_ref1: Ptr<i32> = (arr2.as_pointer() as Ptr<i32>).offset(1 as isize);
let arr2_ref1: Ptr<i32> = (arr2.as_pointer() as Ptr<i32>).offset(1);
arr2_ref1.write(7);
return ((*arr2.borrow())[(0) as usize] + (*arr2.borrow())[(1) as usize]);
}
2 changes: 1 addition & 1 deletion tests/unit/out/refcount/array_of_noncopy_struct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ fn main_0() -> i32 {
assert!(((*(*arr.borrow())[(1) as usize].data.borrow()).len() == 1_usize));
assert!(
((((*arr.borrow())[(1) as usize].data.as_pointer() as Ptr<i32>)
.offset(0_usize as isize)
.offset(0_usize)
.read())
== 42)
);
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/out/refcount/borrow_mut_opt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ pub fn convert_with_rhs_1() {
(*x.borrow_mut()) += __rhs;
let __rhs = ((*p.borrow()).read());
(*y.borrow_mut()) += __rhs;
(*p.borrow_mut()) = ((arr.as_pointer() as Ptr<i32>).offset(0 as isize));
(*p.borrow_mut()) = ((arr.as_pointer() as Ptr<i32>).offset(0));
let __rhs = ((*p.borrow()).read());
(*arr.borrow_mut())[(0) as usize] = __rhs;
let __rhs = (*x.borrow());
Expand Down
4 changes: 1 addition & 3 deletions tests/unit/out/refcount/bounded_struct_ptr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,7 @@ fn main_0() -> i32 {
((*arr.borrow())[(1) as usize].x1.as_pointer()),
));
let a: Value<i32> = Rc::new(RefCell::new(((*p1.borrow()).read())));
let p2: Value<Ptr<Foo>> = Rc::new(RefCell::new(
((arr.as_pointer() as Ptr<Foo>).offset(0 as isize)),
));
let p2: Value<Ptr<Foo>> = Rc::new(RefCell::new(((arr.as_pointer() as Ptr<Foo>).offset(0))));
return {
let _lhs = (*a.borrow());
_lhs + (*(*(*p2.borrow()).upgrade().deref()).x2.borrow())
Expand Down
16 changes: 4 additions & 12 deletions tests/unit/out/refcount/char_printing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,8 @@ fn main_0() -> i32 {
write!(libcc2rs::cout(), "{:} a", (*i.borrow()),);
libcc2rs::cout().write_all(
&([
(&[((vec_.as_pointer() as Ptr<u8>)
.offset(0_usize as isize)
.read())] as &[u8]),
(&[((vec_.as_pointer() as Ptr<u8>)
.offset(1_usize as isize)
.read())] as &[u8]),
(&[((vec_.as_pointer() as Ptr<u8>).offset(0_usize).read())] as &[u8]),
(&[((vec_.as_pointer() as Ptr<u8>).offset(1_usize).read())] as &[u8]),
(&[('o' as u8)] as &[u8]),
(&(*str.borrow())[..(*str.borrow()).len() - 1] as &[u8]),
(&[b'\n'] as &[u8]),
Expand All @@ -46,13 +42,9 @@ fn main_0() -> i32 {
write!(libcc2rs::cout(), "Hello, World!\n",);
libcc2rs::cout().write_all(
&([
(&[((vec_.as_pointer() as Ptr<u8>)
.offset(0_usize as isize)
.read())] as &[u8]),
(&[((vec_.as_pointer() as Ptr<u8>).offset(0_usize).read())] as &[u8]),
(&[('\n' as u8)] as &[u8]),
(&[((vec_.as_pointer() as Ptr<u8>)
.offset(1_usize as isize)
.read())] as &[u8]),
(&[((vec_.as_pointer() as Ptr<u8>).offset(1_usize).read())] as &[u8]),
(&[('\n' as u8)] as &[u8]),
]
.concat()),
Expand Down
16 changes: 4 additions & 12 deletions tests/unit/out/refcount/char_printing_cerr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,8 @@ fn main_0() -> i32 {
write!(libcc2rs::cerr(), "{:} a", (*i.borrow()),);
libcc2rs::cerr().write_all(
&([
(&[((vec_.as_pointer() as Ptr<u8>)
.offset(0_usize as isize)
.read())] as &[u8]),
(&[((vec_.as_pointer() as Ptr<u8>)
.offset(1_usize as isize)
.read())] as &[u8]),
(&[((vec_.as_pointer() as Ptr<u8>).offset(0_usize).read())] as &[u8]),
(&[((vec_.as_pointer() as Ptr<u8>).offset(1_usize).read())] as &[u8]),
(&[('o' as u8)] as &[u8]),
(&(*str.borrow())[..(*str.borrow()).len() - 1] as &[u8]),
(&[b'\n'] as &[u8]),
Expand All @@ -46,13 +42,9 @@ fn main_0() -> i32 {
write!(libcc2rs::cerr(), "Hello, World!\n",);
libcc2rs::cerr().write_all(
&([
(&[((vec_.as_pointer() as Ptr<u8>)
.offset(0_usize as isize)
.read())] as &[u8]),
(&[((vec_.as_pointer() as Ptr<u8>).offset(0_usize).read())] as &[u8]),
(&[('\n' as u8)] as &[u8]),
(&[((vec_.as_pointer() as Ptr<u8>)
.offset(1_usize as isize)
.read())] as &[u8]),
(&[((vec_.as_pointer() as Ptr<u8>).offset(1_usize).read())] as &[u8]),
(&[('\n' as u8)] as &[u8]),
]
.concat()),
Expand Down
68 changes: 31 additions & 37 deletions tests/unit/out/refcount/clone_vs_move.rs
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ fn main_0() -> i32 {
'loop_: while ((*i.borrow()) < (*N.borrow())) {
assert!(
(((v2.as_pointer() as Ptr<i32>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.read())
== (*i.borrow()))
);
Expand All @@ -171,21 +171,21 @@ fn main_0() -> i32 {
let i: Value<i32> = Rc::new(RefCell::new(0));
'loop_: while ((*i.borrow()) < (*N.borrow())) {
(v2.as_pointer() as Ptr<i32>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.with_mut(|__v| __v.prefix_inc());
(*i.borrow_mut()).prefix_inc();
}
let i: Value<i32> = Rc::new(RefCell::new(0));
'loop_: while ((*i.borrow()) < (*N.borrow())) {
assert!(
(((v2.as_pointer() as Ptr<i32>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.read())
== ((*i.borrow()) + 1))
);
assert!(
(((v1.as_pointer() as Ptr<i32>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.read())
== (*i.borrow()))
);
Expand Down Expand Up @@ -216,7 +216,7 @@ fn main_0() -> i32 {
'loop_: while ((*i.borrow()) < (*N.borrow())) {
assert!(
((*((m1.as_pointer() as Ptr<Value<Vec<i32>>>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.upgrade()
.deref()
.as_pointer() as Ptr<Vec<i32>>)
Expand All @@ -227,7 +227,7 @@ fn main_0() -> i32 {
);
assert!(
((*((m2.as_pointer() as Ptr<Value<Vec<i32>>>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.upgrade()
.deref()
.as_pointer() as Ptr<Vec<i32>>)
Expand All @@ -240,21 +240,21 @@ fn main_0() -> i32 {
'loop_: while ((*j.borrow()) < 10) {
assert!(
((((m1.as_pointer() as Ptr<Value<Vec<i32>>>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.upgrade()
.deref()
.as_pointer() as Ptr<i32>)
.offset(((*j.borrow()) as usize) as isize)
.offset(((*j.borrow()) as usize))
.read())
== 0)
);
assert!(
((((m2.as_pointer() as Ptr<Value<Vec<i32>>>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.upgrade()
.deref()
.as_pointer() as Ptr<i32>)
.offset(((*j.borrow()) as usize) as isize)
.offset(((*j.borrow()) as usize))
.read())
== 0)
);
Expand All @@ -267,11 +267,11 @@ fn main_0() -> i32 {
let j: Value<i32> = Rc::new(RefCell::new(0));
'loop_: while ((*j.borrow()) < 10) {
((m2.as_pointer() as Ptr<Value<Vec<i32>>>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.upgrade()
.deref()
.as_pointer() as Ptr<i32>)
.offset(((*j.borrow()) as usize) as isize)
.offset(((*j.borrow()) as usize))
.with_mut(|__v| __v.postfix_inc());
(*j.borrow_mut()).prefix_inc();
}
Expand All @@ -281,7 +281,7 @@ fn main_0() -> i32 {
'loop_: while ((*i.borrow()) < (*N.borrow())) {
assert!(
((*((m1.as_pointer() as Ptr<Value<Vec<i32>>>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.upgrade()
.deref()
.as_pointer() as Ptr<Vec<i32>>)
Expand All @@ -292,7 +292,7 @@ fn main_0() -> i32 {
);
assert!(
((*((m2.as_pointer() as Ptr<Value<Vec<i32>>>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.upgrade()
.deref()
.as_pointer() as Ptr<Vec<i32>>)
Expand All @@ -305,21 +305,21 @@ fn main_0() -> i32 {
'loop_: while ((*j.borrow()) < 10) {
assert!(
((((m1.as_pointer() as Ptr<Value<Vec<i32>>>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.upgrade()
.deref()
.as_pointer() as Ptr<i32>)
.offset(((*j.borrow()) as usize) as isize)
.offset(((*j.borrow()) as usize))
.read())
== 0)
);
assert!(
((((m2.as_pointer() as Ptr<Value<Vec<i32>>>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.upgrade()
.deref()
.as_pointer() as Ptr<i32>)
.offset(((*j.borrow()) as usize) as isize)
.offset(((*j.borrow()) as usize))
.read())
== 1)
);
Expand Down Expand Up @@ -436,37 +436,31 @@ fn main_0() -> i32 {
));
let s2: Value<Vec<u8>> = Rc::new(RefCell::new((*s1.borrow()).clone()));
(s2.as_pointer() as Ptr<u8>)
.offset(0_usize as isize)
.offset(0_usize)
.write(('b' as u8));
(s2.as_pointer() as Ptr<u8>)
.offset(1_usize as isize)
.offset(1_usize)
.write(('b' as u8));
(s2.as_pointer() as Ptr<u8>)
.offset(2_usize as isize)
.offset(2_usize)
.write(('b' as u8));
assert!(
((((s2.as_pointer() as Ptr<u8>).offset(0_usize as isize).read()) as i32)
== (('b' as u8) as i32))
((((s2.as_pointer() as Ptr<u8>).offset(0_usize).read()) as i32) == (('b' as u8) as i32))
);
assert!(
((((s2.as_pointer() as Ptr<u8>).offset(1_usize as isize).read()) as i32)
== (('b' as u8) as i32))
((((s2.as_pointer() as Ptr<u8>).offset(1_usize).read()) as i32) == (('b' as u8) as i32))
);
assert!(
((((s2.as_pointer() as Ptr<u8>).offset(2_usize as isize).read()) as i32)
== (('b' as u8) as i32))
((((s2.as_pointer() as Ptr<u8>).offset(2_usize).read()) as i32) == (('b' as u8) as i32))
);
assert!(
((((s1.as_pointer() as Ptr<u8>).offset(0_usize as isize).read()) as i32)
== (('a' as u8) as i32))
((((s1.as_pointer() as Ptr<u8>).offset(0_usize).read()) as i32) == (('a' as u8) as i32))
);
assert!(
((((s1.as_pointer() as Ptr<u8>).offset(1_usize as isize).read()) as i32)
== (('a' as u8) as i32))
((((s1.as_pointer() as Ptr<u8>).offset(1_usize).read()) as i32) == (('a' as u8) as i32))
);
assert!(
((((s1.as_pointer() as Ptr<u8>).offset(2_usize as isize).read()) as i32)
== (('a' as u8) as i32))
((((s1.as_pointer() as Ptr<u8>).offset(2_usize).read()) as i32) == (('a' as u8) as i32))
);
let b1: Value<Bar> = Rc::new(RefCell::new(Bar {
w: Rc::new(RefCell::new(1)),
Expand All @@ -484,26 +478,26 @@ fn main_0() -> i32 {
'loop_: while ((*i.borrow()) < (*N.borrow())) {
assert!(
(((v4.as_pointer() as Ptr<i32>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.read())
== ((*i.borrow()) + 1))
);
(v4.as_pointer() as Ptr<i32>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.with_mut(|__v| __v.prefix_inc());
(*i.borrow_mut()).prefix_inc();
}
let i: Value<i32> = Rc::new(RefCell::new(0));
'loop_: while ((*i.borrow()) < (*N.borrow())) {
assert!(
(((v4.as_pointer() as Ptr<i32>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.read())
== ((*i.borrow()) + 2))
);
assert!(
(((v2.as_pointer() as Ptr<i32>)
.offset(((*i.borrow()) as usize) as isize)
.offset(((*i.borrow()) as usize))
.read())
== ((*i.borrow()) + 1))
);
Expand Down
6 changes: 3 additions & 3 deletions tests/unit/out/refcount/fn_ptr_stable_sort.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ fn main_0() -> i32 {
);
assert!(
((*(*(v.as_pointer() as Ptr<Item>)
.offset(0_usize as isize)
.offset(0_usize)
.upgrade()
.deref())
.key
Expand All @@ -73,7 +73,7 @@ fn main_0() -> i32 {
);
assert!(
((*(*(v.as_pointer() as Ptr<Item>)
.offset(1_usize as isize)
.offset(1_usize)
.upgrade()
.deref())
.key
Expand All @@ -82,7 +82,7 @@ fn main_0() -> i32 {
);
assert!(
((*(*(v.as_pointer() as Ptr<Item>)
.offset(2_usize as isize)
.offset(2_usize)
.upgrade()
.deref())
.key
Expand Down
Loading
Loading