Skip to content

Commit a54bbfd

Browse files
authored
Add paren around cast'ed expression (#124)
This avoids compilation errors in the generated code.
1 parent c3dcc94 commit a54bbfd

22 files changed

Lines changed: 58 additions & 51 deletions

cpp2rust/converter/converter.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1856,22 +1856,29 @@ bool Converter::VisitImplicitCastExpr(clang::ImplicitCastExpr *expr) {
18561856
break;
18571857
}
18581858
case clang::CastKind::CK_NoOp: {
1859-
Convert(sub_expr);
1859+
const char *suffix = nullptr;
18601860
if (expr->getType()->isPointerType() &&
18611861
sub_expr->getType()->isPointerType() &&
18621862
!clang::isa<clang::CXXThisExpr>(expr->IgnoreImplicit())) {
18631863
switch (GetConstCastType(expr->getType()->getPointeeType(),
18641864
sub_expr->getType()->getPointeeType())) {
18651865
case ConstCastType::MutableToConst:
1866-
StrCat(".cast_const()");
1866+
suffix = ".cast_const()";
18671867
break;
18681868
case ConstCastType::ConstToMutable:
1869-
StrCat(".cast_mut()");
1869+
suffix = ".cast_mut()";
18701870
break;
18711871
default:
18721872
break;
18731873
}
18741874
}
1875+
{
1876+
PushParen paren(*this, suffix);
1877+
Convert(sub_expr);
1878+
}
1879+
if (suffix) {
1880+
StrCat(suffix);
1881+
}
18751882
break;
18761883
}
18771884
case clang::CastKind::CK_FunctionToPointerDecay:

tests/unit/out/unsafe/bool_condition_logical_c.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ unsafe fn main_0() -> i32 {
128128
if (((((((n) != (0)) as i32) != 0) || (((bits) & (256_i64)) != 0)) as i32) != 0) {
129129
assert!((1 != 0));
130130
}
131-
let mut cp: *const u8 = b"hi\0".as_ptr().cast_mut().cast_const();
131+
let mut cp: *const u8 = (b"hi\0".as_ptr().cast_mut()).cast_const();
132132
let mut cnp: *const u8 = std::ptr::null();
133133
if (((((((x) > (y)) as i32) != 0) && (!(cp).is_null())) as i32) != 0) {
134134
assert!((1 != 0));

tests/unit/out/unsafe/enum_int_interop_c.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,17 +72,17 @@ pub static mut global_tag: Tag = unsafe { Tag::TAG_TWO };
7272
pub static mut entries: [Entry; 3] = unsafe {
7373
[
7474
Entry {
75-
name: b"first\0".as_ptr().cast_mut().cast_const(),
75+
name: (b"first\0".as_ptr().cast_mut()).cast_const(),
7676
color: Color::RED,
7777
opt: Option::OPT_NONE,
7878
},
7979
Entry {
80-
name: b"second\0".as_ptr().cast_mut().cast_const(),
80+
name: (b"second\0".as_ptr().cast_mut()).cast_const(),
8181
color: Color::GREEN,
8282
opt: Option::OPT_A,
8383
},
8484
Entry {
85-
name: b"third\0".as_ptr().cast_mut().cast_const(),
85+
name: (b"third\0".as_ptr().cast_mut()).cast_const(),
8686
color: Color::BLUE,
8787
opt: Option::OPT_C,
8888
},

tests/unit/out/unsafe/expr_as_bool_c.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ unsafe fn main_0() -> i32 {
6666
assert!(((((eq) == (1)) as i32) != 0));
6767
assert!(((((lt) == (0)) as i32) != 0));
6868
assert!(((((neq) == (0)) as i32) != 0));
69-
let mut p1: *const u8 = b"hi\0".as_ptr().cast_mut().cast_const();
69+
let mut p1: *const u8 = (b"hi\0".as_ptr().cast_mut()).cast_const();
7070
let mut p2: *const u8 = std::ptr::null();
7171
let mut either: i32 = (((!(p1).is_null()) || (!(p2).is_null())) as i32);
7272
let mut both: i32 = (((!(p1).is_null()) && (!(p2).is_null())) as i32);

tests/unit/out/unsafe/huffman.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ pub unsafe fn CollectCodes_4(
240240
CollectCodes_4(_root, _arr, _top, _out, _next)
241241
});
242242
}
243-
if (unsafe { (*root.cast_const()).IsLeaf() }) {
243+
if (unsafe { (*(root).cast_const()).IsLeaf() }) {
244244
(unsafe {
245245
let _arr: *mut Option<Box<[i32]>> = arr;
246246
let _top: i32 = top;

tests/unit/out/unsafe/pointer_usize_arith.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ unsafe fn main_0() -> i32 {
6363
assert!((((*bq) as i32) == (4)));
6464
let mut bdiff: i64 = ((bq as usize - bp as usize) / ::std::mem::size_of::<u8>()) as i64;
6565
assert!(((bdiff) == (4_i64)));
66-
let mut cp: *const i32 = arr.as_mut_ptr().cast_const();
66+
let mut cp: *const i32 = (arr.as_mut_ptr()).cast_const();
6767
let mut cq: *const i32 = cp.offset((2) as isize);
6868
assert!(((*cq) == (12)));
6969
let mut cdiff: i64 = ((cq as usize - cp as usize) / ::std::mem::size_of::<i32>()) as i64;

tests/unit/out/unsafe/polymorphism.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ pub fn main() {
3838
unsafe fn main_0() -> i32 {
3939
let mut dog: Dog = <Dog>::default();
4040
let mut animal: *mut dyn Animal = (&mut dog as *mut Dog);
41-
let mut eat1: bool = (unsafe { (*animal.cast_const()).bark() });
41+
let mut eat1: bool = (unsafe { (*(animal).cast_const()).bark() });
4242
let mut cat: Cat = <Cat>::default();
4343
animal = (&mut cat as *mut Cat);
44-
let mut eat2: bool = (unsafe { (*animal.cast_const()).bark() });
44+
let mut eat2: bool = (unsafe { (*(animal).cast_const()).bark() });
4545
return (((eat1) && (!eat2)) as i32);
4646
}

tests/unit/out/unsafe/strchr_c.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ pub fn main() {
1212
}
1313
}
1414
unsafe fn main_0() -> i32 {
15-
let mut s: *const u8 = b"hello world\0".as_ptr().cast_mut().cast_const();
16-
let mut r: *mut u8 = libc::strchr(s as *const i8, ('w' as i32)) as *mut u8;
15+
let mut s: *const u8 = (b"hello world\0".as_ptr().cast_mut()).cast_const();
16+
let mut r: *const u8 = (libc::strchr(s as *const i8, ('w' as i32)) as *mut u8).cast_const();
1717
assert!((((!((r).is_null())) as i32) != 0));
1818
assert!((((((*r) as i32) == ('w' as i32)) as i32) != 0));
1919
assert!(((((libc::strchr(s as *const i8, ('z' as i32)) as *mut u8).is_null()) as i32) != 0));

tests/unit/out/unsafe/string.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ unsafe fn main_0() -> i32 {
3030
.to_vec()
3131
}
3232
);
33-
let mut p1: *const u8 = s1.as_mut_ptr().cast_const();
33+
let mut p1: *const u8 = (s1.as_mut_ptr()).cast_const();
3434
assert!((((*p1.offset((0) as isize)) as i32) == (('h' as u8) as i32)));
3535
assert!((((*p1.offset((1) as isize)) as i32) == (('e' as u8) as i32)));
3636
assert!((((*p1.offset((2) as isize)) as i32) == (('l' as u8) as i32)));
@@ -41,7 +41,7 @@ unsafe fn main_0() -> i32 {
4141
.cloned()
4242
.chain(std::iter::once(0))
4343
.collect();
44-
let mut p2: *const u8 = s2.as_mut_ptr().cast_const();
44+
let mut p2: *const u8 = (s2.as_mut_ptr()).cast_const();
4545
let mut i: u32 = 0_u32;
4646
'loop_: while ((i as u64) < ((s2.len() - 1) as u64)) {
4747
assert!(
@@ -72,7 +72,7 @@ unsafe fn main_0() -> i32 {
7272
};
7373
assert!((((s3.len() - 1) as u64) == (5_u64)));
7474
assert!((((s3.len() - 1) as u64) == ((s3.len() - 1) as u64)));
75-
let mut p3: *const u8 = s3.as_mut_ptr().cast_const();
75+
let mut p3: *const u8 = (s3.as_mut_ptr()).cast_const();
7676
let mut i: u32 = 0_u32;
7777
'loop_: while ((i as u64) < ((s3.len() - 1) as u64)) {
7878
assert!((((*p3.offset((i) as isize)) as i32) == (s3[(i as u64) as usize] as i32)));
@@ -99,7 +99,7 @@ unsafe fn main_0() -> i32 {
9999
};
100100
assert!((((s4.len() - 1) as u64) == (3_u64)));
101101
assert!((((s4.len() - 1) as u64) == ((s4.len() - 1) as u64)));
102-
let mut p4: *const u8 = s4.as_mut_ptr().cast_const();
102+
let mut p4: *const u8 = (s4.as_mut_ptr()).cast_const();
103103
let mut i: u32 = 0_u32;
104104
'loop_: while ((i as u64) < ((s4.len() - 1) as u64)) {
105105
assert!((((*p4.offset((i) as isize)) as i32) == (s4[(i as u64) as usize] as i32)));
@@ -118,7 +118,7 @@ unsafe fn main_0() -> i32 {
118118
};
119119
assert!((((s5.len() - 1) as u64) == (12_u64)));
120120
assert!((((s5.len() - 1) as u64) == ((s5.len() - 1) as u64)));
121-
let mut p5: *const u8 = s5.as_mut_ptr().cast_const();
121+
let mut p5: *const u8 = (s5.as_mut_ptr()).cast_const();
122122
let mut i: u32 = 0_u32;
123123
'loop_: while ((i as u64) < ((s5.len() - 1) as u64)) {
124124
assert!((((*p5.offset((i) as isize)) as i32) == (s5[(i as u64) as usize] as i32)));
@@ -134,7 +134,7 @@ unsafe fn main_0() -> i32 {
134134
('o' as u8),
135135
];
136136
let mut string: Vec<u8> =
137-
std::slice::from_raw_parts(arr.as_mut_ptr().cast_const(), 3_u64 as usize)
137+
std::slice::from_raw_parts((arr.as_mut_ptr()).cast_const(), 3_u64 as usize)
138138
.to_vec()
139139
.iter()
140140
.copied()

tests/unit/out/unsafe/string_literals_c.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ unsafe fn main_0() -> i32 {
2020
b"c\0".as_ptr().cast_mut(),
2121
];
2222
let mut immutable_strings: [*const u8; 3] = [
23-
b"a\0".as_ptr().cast_mut().cast_const(),
24-
b"b\0".as_ptr().cast_mut().cast_const(),
25-
b"c\0".as_ptr().cast_mut().cast_const(),
23+
(b"a\0".as_ptr().cast_mut()).cast_const(),
24+
(b"b\0".as_ptr().cast_mut()).cast_const(),
25+
(b"c\0".as_ptr().cast_mut()).cast_const(),
2626
];
2727
let mut mutable_string: *mut u8 = b"hello\0".as_ptr().cast_mut();
28-
let mut immutable_string: *const u8 = b"hello\0".as_ptr().cast_mut().cast_const();
28+
let mut immutable_string: *const u8 = (b"hello\0".as_ptr().cast_mut()).cast_const();
2929
let mut mutable_string_arr: [u8; 9] = *b"papanasi\0";
3030
let immutable_string_arr: [u8; 9] = *b"papanasi\0";
3131
let mut mutable_empty: *mut u8 = b"\0".as_ptr().cast_mut();
32-
let mut immutable_empty: *const u8 = b"\0".as_ptr().cast_mut().cast_const();
32+
let mut immutable_empty: *const u8 = (b"\0".as_ptr().cast_mut()).cast_const();
3333
let mut mutable_empty_arr: [u8; 1] = [0u8; 1];
3434
let immutable_empty_arr: [u8; 1] = [0u8; 1];
3535
(unsafe {
@@ -45,39 +45,39 @@ unsafe fn main_0() -> i32 {
4545
foo_mut_0(_str)
4646
});
4747
(unsafe {
48-
let _str: *const u8 = b"world\0".as_ptr().cast_mut().cast_const();
48+
let _str: *const u8 = (b"world\0".as_ptr().cast_mut()).cast_const();
4949
foo_const_1(_str)
5050
});
5151
(unsafe {
52-
let _str: *const u8 = mutable_string.cast_const();
52+
let _str: *const u8 = (mutable_string).cast_const();
5353
foo_const_1(_str)
5454
});
5555
(unsafe {
5656
let _str: *const u8 = immutable_string;
5757
foo_const_1(_str)
5858
});
5959
(unsafe {
60-
let _str: *const u8 = mutable_string_arr.as_mut_ptr().cast_const();
60+
let _str: *const u8 = (mutable_string_arr.as_mut_ptr()).cast_const();
6161
foo_const_1(_str)
6262
});
6363
(unsafe {
6464
let _str: *const u8 = immutable_string_arr.as_ptr();
6565
foo_const_1(_str)
6666
});
6767
(unsafe {
68-
let _str: *const u8 = b"\0".as_ptr().cast_mut().cast_const();
68+
let _str: *const u8 = (b"\0".as_ptr().cast_mut()).cast_const();
6969
foo_const_1(_str)
7070
});
7171
(unsafe {
72-
let _str: *const u8 = mutable_empty.cast_const();
72+
let _str: *const u8 = (mutable_empty).cast_const();
7373
foo_const_1(_str)
7474
});
7575
(unsafe {
7676
let _str: *const u8 = immutable_empty;
7777
foo_const_1(_str)
7878
});
7979
(unsafe {
80-
let _str: *const u8 = mutable_empty_arr.as_mut_ptr().cast_const();
80+
let _str: *const u8 = (mutable_empty_arr.as_mut_ptr()).cast_const();
8181
foo_const_1(_str)
8282
});
8383
(unsafe {

0 commit comments

Comments
 (0)