diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index 5f4ce08e..9ba109d2 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -2235,7 +2235,7 @@ void Converter::ConvertBinaryOperator(clang::BinaryOperator *expr) { auto op = opcode_as_string; op.remove_suffix(1); // remove '=' from operator StrCat(op); - Convert(rhs); + Convert(rhs, computation_result_type); } if (lhs_type->isBooleanType()) { StrCat(token::kDiff, token::kZero); diff --git a/tests/unit/out/refcount/size_t_ssize_t.rs b/tests/unit/out/refcount/size_t_ssize_t.rs index 24e72ffc..e45737c4 100644 --- a/tests/unit/out/refcount/size_t_ssize_t.rs +++ b/tests/unit/out/refcount/size_t_ssize_t.rs @@ -211,5 +211,14 @@ fn main_0() -> i32 { (((*sz.borrow()) as isize) - ((*ul.borrow()) as isize)), )); assert!(((*delta.borrow()) == 11_isize)); + let a64: Value = Rc::new(RefCell::new(100_i64)); + let b: Value = Rc::new(RefCell::new(30_isize)); + (*a64.borrow_mut()) -= ((*b.borrow()) as i64); + assert!(((*a64.borrow()) == 70_i64)); + (*a64.borrow_mut()) += ((*b.borrow()) as i64); + assert!(((*a64.borrow()) == 100_i64)); + let c: Value = Rc::new(RefCell::new((-20_i32 as isize))); + (*a64.borrow_mut()) -= ((*c.borrow()) as i64); + assert!(((*a64.borrow()) == 120_i64)); return (((*n.borrow()).wrapping_rem(7_usize)) as i32); } diff --git a/tests/unit/out/unsafe/size_t_ssize_t.rs b/tests/unit/out/unsafe/size_t_ssize_t.rs index dab5949d..1c5755f8 100644 --- a/tests/unit/out/unsafe/size_t_ssize_t.rs +++ b/tests/unit/out/unsafe/size_t_ssize_t.rs @@ -156,5 +156,14 @@ unsafe fn main_0() -> i32 { assert!(((smax) == (15_isize))); let mut delta: isize = ((sz as isize) - (ul as isize)); assert!(((delta) == (11_isize))); + let mut a64: i64 = 100_i64; + let mut b: isize = 30_isize; + a64 -= (b as i64); + assert!(((a64) == (70_i64))); + a64 += (b as i64); + assert!(((a64) == (100_i64))); + let mut c: isize = (-20_i32 as isize); + a64 -= (c as i64); + assert!(((a64) == (120_i64))); return (((n).wrapping_rem(7_usize)) as i32); } diff --git a/tests/unit/size_t_ssize_t.cpp b/tests/unit/size_t_ssize_t.cpp index dbcbcc32..e07f8f52 100644 --- a/tests/unit/size_t_ssize_t.cpp +++ b/tests/unit/size_t_ssize_t.cpp @@ -85,5 +85,16 @@ int main() { ssize_t delta = (ssize_t)sz - (ssize_t)ul; assert(delta == 11); + typedef long long ll_t; + ll_t a64 = 100; + ssize_t b = 30; + a64 -= b; + assert(a64 == 70); + a64 += b; + assert(a64 == 100); + ssize_t c = -20; + a64 -= c; + assert(a64 == 120); + return (int)(n % 7); }