Skip to content

Commit be5eec4

Browse files
authored
Fix paren in compound assign (#230)
1 parent 22edd84 commit be5eec4

6 files changed

Lines changed: 184 additions & 12 deletions

File tree

cpp2rust/converter/models/converter_refcount.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,6 +1373,7 @@ void ConverterRefCount::ConvertBinaryOperator(clang::BinaryOperator *expr) {
13731373
assign && GetSafeTypeAsString(lhs_type) !=
13741374
GetSafeTypeAsString(assign->getComputationResultType())) {
13751375
auto computation_result_type = assign->getComputationResultType();
1376+
PushBrace brace(*this);
13761377
StrCat(keyword::kLet, "rhs_0", token::kAssign);
13771378
if (IsUnsignedArithOp(assign)) {
13781379
PushParen outer(*this);
@@ -1405,6 +1406,7 @@ void ConverterRefCount::ConvertBinaryOperator(clang::BinaryOperator *expr) {
14051406
}
14061407

14071408
if (IsUnsignedArithOp(expr)) {
1409+
PushBrace brace(*this, expr->isCompoundAssignmentOp());
14081410
if (expr->isCompoundAssignmentOp()) {
14091411
StrCat(keyword::kLet, "rhs_0", token::kAssign);
14101412
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include <assert.h>
2+
#include <stdint.h>
3+
4+
#define SET_FLAG(s, f) ((s)->flags |= (f))
5+
#define CLEAR_FLAG(s, f) ((s)->flags &= (uint8_t)~(f))
6+
#define MARK_USED(bits, i) ((bits)[(i) / 8] |= (unsigned char)(1 << ((i) & 7)))
7+
8+
struct Item {
9+
uint8_t flags;
10+
};
11+
12+
int main() {
13+
Item item = {0};
14+
Item *ptr = &item;
15+
SET_FLAG(ptr, 1 << 0);
16+
SET_FLAG(ptr, 1 << 1);
17+
assert(ptr->flags == 3);
18+
CLEAR_FLAG(ptr, 1 << 0);
19+
assert(ptr->flags == 2);
20+
21+
unsigned char bits[4] = {0};
22+
MARK_USED(bits, 5);
23+
MARK_USED(bits, 13);
24+
assert(bits[0] == 32);
25+
assert(bits[1] == 32);
26+
assert(bits[2] == 0);
27+
28+
if (ptr->flags != 0) {
29+
CLEAR_FLAG(ptr, 1 << 1);
30+
}
31+
assert(ptr->flags == 0);
32+
return 0;
33+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
extern crate libcc2rs;
2+
use libcc2rs::*;
3+
use std::cell::RefCell;
4+
use std::collections::BTreeMap;
5+
use std::io::prelude::*;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::AsFd;
8+
use std::rc::{Rc, Weak};
9+
#[derive(Default)]
10+
pub struct Item {
11+
pub flags: Value<u8>,
12+
}
13+
impl Clone for Item {
14+
fn clone(&self) -> Self {
15+
let mut this = Self {
16+
flags: Rc::new(RefCell::new((*self.flags.borrow()))),
17+
};
18+
this
19+
}
20+
}
21+
impl ByteRepr for Item {
22+
fn byte_size() -> usize {
23+
1
24+
}
25+
fn to_bytes(&self, buf: &mut [u8]) {
26+
(*self.flags.borrow()).to_bytes(&mut buf[0..1]);
27+
}
28+
fn from_bytes(buf: &[u8]) -> Self {
29+
Self {
30+
flags: Rc::new(RefCell::new(<u8>::from_bytes(&buf[0..1]))),
31+
}
32+
}
33+
}
34+
pub fn main() {
35+
std::process::exit(main_0());
36+
}
37+
fn main_0() -> i32 {
38+
let item: Value<Item> = Rc::new(RefCell::new(Item {
39+
flags: Rc::new(RefCell::new(0_u8)),
40+
}));
41+
let ptr: Value<Ptr<Item>> = Rc::new(RefCell::new((item.as_pointer())));
42+
({
43+
let rhs_0 =
44+
(((*(*(*ptr.borrow()).upgrade().deref()).flags.borrow()) as i32) | (1 << 0)) as u8;
45+
(*(*(*ptr.borrow()).upgrade().deref()).flags.borrow_mut()) = rhs_0
46+
});
47+
({
48+
let rhs_0 =
49+
(((*(*(*ptr.borrow()).upgrade().deref()).flags.borrow()) as i32) | (1 << 1)) as u8;
50+
(*(*(*ptr.borrow()).upgrade().deref()).flags.borrow_mut()) = rhs_0
51+
});
52+
assert!((((*(*(*ptr.borrow()).upgrade().deref()).flags.borrow()) as i32) == 3));
53+
({
54+
let rhs_0 = (((*(*(*ptr.borrow()).upgrade().deref()).flags.borrow()) as i32)
55+
& ((!(1 << 0) as u8) as i32)) as u8;
56+
(*(*(*ptr.borrow()).upgrade().deref()).flags.borrow_mut()) = rhs_0
57+
});
58+
assert!((((*(*(*ptr.borrow()).upgrade().deref()).flags.borrow()) as i32) == 2));
59+
let bits: Value<Box<[u8]>> = Rc::new(RefCell::new(Box::new([
60+
0_u8,
61+
<u8>::default(),
62+
<u8>::default(),
63+
<u8>::default(),
64+
])));
65+
({
66+
let rhs_0 = (((*bits.borrow())[((5) / 8) as usize] as i32)
67+
| (((1 << ((5) & 7)) as u8) as i32)) as u8;
68+
(*bits.borrow_mut())[((5) / 8) as usize] = rhs_0
69+
});
70+
({
71+
let rhs_0 = (((*bits.borrow())[((13) / 8) as usize] as i32)
72+
| (((1 << ((13) & 7)) as u8) as i32)) as u8;
73+
(*bits.borrow_mut())[((13) / 8) as usize] = rhs_0
74+
});
75+
assert!((((*bits.borrow())[(0) as usize] as i32) == 32));
76+
assert!((((*bits.borrow())[(1) as usize] as i32) == 32));
77+
assert!((((*bits.borrow())[(2) as usize] as i32) == 0));
78+
if (((*(*(*ptr.borrow()).upgrade().deref()).flags.borrow()) as i32) != 0) {
79+
({
80+
let rhs_0 = (((*(*(*ptr.borrow()).upgrade().deref()).flags.borrow()) as i32)
81+
& ((!(1 << 1) as u8) as i32)) as u8;
82+
(*(*(*ptr.borrow()).upgrade().deref()).flags.borrow_mut()) = rhs_0
83+
});
84+
}
85+
assert!((((*(*(*ptr.borrow()).upgrade().deref()).flags.borrow()) as i32) == 0));
86+
return 0;
87+
}

tests/unit/out/refcount/immutable_unsigned_arithmetic.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ pub fn main() {
1212
fn main_0() -> i32 {
1313
let a: Value<u32> = Rc::new(RefCell::new(0_u32));
1414
let p: Value<Ptr<u32>> = Rc::new(RefCell::new((a.as_pointer())));
15-
let rhs_0 = ((*p.borrow()).read()).wrapping_add(((*p.borrow()).read()));
16-
(*p.borrow()).write(rhs_0);
15+
{
16+
let rhs_0 = ((*p.borrow()).read()).wrapping_add(((*p.borrow()).read()));
17+
(*p.borrow()).write(rhs_0)
18+
};
1719
return (((*p.borrow()).read()) as i32);
1820
}

tests/unit/out/refcount/size_t_ssize_t.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,19 @@ fn main_0() -> i32 {
4646
== (((20 + 10) + 5) as usize).wrapping_add((::std::mem::size_of::<i64>() as usize)))
4747
);
4848
let acc: Value<usize> = Rc::new(RefCell::new(100_usize));
49-
let rhs_0 =
50-
(((*acc.borrow()) as u64).wrapping_add((::std::mem::size_of::<f64>() as u64))) as usize;
51-
(*acc.borrow_mut()) = rhs_0;
52-
let rhs_0 = (*acc.borrow()).wrapping_mul(2_usize);
53-
(*acc.borrow_mut()) = rhs_0;
54-
let rhs_0 = (((*acc.borrow()) as u64).wrapping_sub((*ul.borrow()))) as usize;
55-
(*acc.borrow_mut()) = rhs_0;
49+
{
50+
let rhs_0 =
51+
(((*acc.borrow()) as u64).wrapping_add((::std::mem::size_of::<f64>() as u64))) as usize;
52+
(*acc.borrow_mut()) = rhs_0
53+
};
54+
{
55+
let rhs_0 = (*acc.borrow()).wrapping_mul(2_usize);
56+
(*acc.borrow_mut()) = rhs_0
57+
};
58+
{
59+
let rhs_0 = (((*acc.borrow()) as u64).wrapping_sub((*ul.borrow()))) as usize;
60+
(*acc.borrow_mut()) = rhs_0
61+
};
5662
assert!(
5763
((*acc.borrow())
5864
== ((((100_usize).wrapping_add((::std::mem::size_of::<f64>() as usize))) as usize)
@@ -136,9 +142,11 @@ fn main_0() -> i32 {
136142
let total: Value<usize> = Rc::new(RefCell::new(0_usize));
137143
let i: Value<usize> = Rc::new(RefCell::new(0_usize));
138144
'loop_: while ((*i.borrow()) < (*count.borrow())) {
139-
let rhs_0 =
140-
(*total.borrow()).wrapping_add(((*data.borrow())[(*i.borrow()) as usize] as usize));
141-
(*total.borrow_mut()) = rhs_0;
145+
{
146+
let rhs_0 =
147+
(*total.borrow()).wrapping_add(((*data.borrow())[(*i.borrow()) as usize] as usize));
148+
(*total.borrow_mut()) = rhs_0
149+
};
142150
(*i.borrow_mut()).postfix_inc();
143151
}
144152
assert!(((*total.borrow()) == 56_usize));
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
extern crate libc;
2+
use libc::*;
3+
extern crate libcc2rs;
4+
use libcc2rs::*;
5+
use std::collections::BTreeMap;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::{AsFd, FromRawFd, IntoRawFd};
8+
use std::rc::Rc;
9+
#[repr(C)]
10+
#[derive(Copy, Clone, Default)]
11+
pub struct Item {
12+
pub flags: u8,
13+
}
14+
pub fn main() {
15+
unsafe {
16+
std::process::exit(main_0() as i32);
17+
}
18+
}
19+
unsafe fn main_0() -> i32 {
20+
let mut item: Item = Item { flags: 0_u8 };
21+
let mut ptr: *mut Item = (&mut item as *mut Item);
22+
((*(ptr)).flags = (((*(ptr)).flags as i32) | ((1) << (0))) as u8);
23+
((*(ptr)).flags = (((*(ptr)).flags as i32) | ((1) << (1))) as u8);
24+
assert!((((*ptr).flags as i32) == (3)));
25+
((*(ptr)).flags = (((*(ptr)).flags as i32) & ((!((1) << (0)) as u8) as i32)) as u8);
26+
assert!((((*ptr).flags as i32) == (2)));
27+
let mut bits: [u8; 4] = [0_u8, 0_u8, 0_u8, 0_u8];
28+
((bits)[((5) / (8)) as usize] =
29+
(((bits)[((5) / (8)) as usize] as i32) | ((((1) << ((5) & (7))) as u8) as i32)) as u8);
30+
((bits)[((13) / (8)) as usize] =
31+
(((bits)[((13) / (8)) as usize] as i32) | ((((1) << ((13) & (7))) as u8) as i32)) as u8);
32+
assert!(((bits[(0) as usize] as i32) == (32)));
33+
assert!(((bits[(1) as usize] as i32) == (32)));
34+
assert!(((bits[(2) as usize] as i32) == (0)));
35+
if (((*ptr).flags as i32) != (0)) {
36+
((*(ptr)).flags = (((*(ptr)).flags as i32) & ((!((1) << (1)) as u8) as i32)) as u8);
37+
}
38+
assert!((((*ptr).flags as i32) == (0)));
39+
return 0;
40+
}

0 commit comments

Comments
 (0)