Skip to content

Commit 64e9d13

Browse files
committed
Fix #114: Rust 2024 compatibility
1 parent a12bd34 commit 64e9d13

36 files changed

Lines changed: 246 additions & 198 deletions

‎cpp2rust/converter/converter.cpp‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,18 @@
2222
#include "converter/lex.h"
2323
#include "converter/mapper.h"
2424

25+
// `static mut` globals cannot have a `&`/`&mut` reference formed directly to
26+
// them in Rust 2024 edition. Wrapping the variable in a `&raw mut` pointer
27+
// followed by a deref sidesteps the restriction.
28+
// Doesn't apply when a rule replaced the expression with custom Rust code.
29+
static std::string WrapMutableStaticPlace(const clang::Decl *decl, std::string str) {
30+
if (IsGlobalVar(decl) && !decl->getType()->isReferenceType() &&
31+
str == GetNamedDeclAsString(decl)) {
32+
return std::format("(*&raw mut {})", str);
33+
}
34+
return str;
35+
}
36+
2537
namespace cpp2rust {
2638
std::unordered_map<std::string, std::string> Converter::inner_structs_;
2739
std::unordered_set<std::string> Converter::decl_ids_;
@@ -272,7 +284,8 @@ Converter::MaterializeTemp(const std::string &binding_name,
272284

273285
auto binding =
274286
std::format("{} mut {} : {} = {};", decl, binding_name, type_str, value);
275-
auto ref = std::format("& mut {}", binding_name);
287+
auto ref = in_const_initializer_ ? std::format("&raw mut {}", binding_name)
288+
: std::format("& mut {}", binding_name);
276289
return {binding, ref};
277290
}
278291

@@ -2870,6 +2883,8 @@ bool Converter::VisitDeclRefExpr(clang::DeclRefExpr *expr) {
28702883
auto str = ConvertDeclRefExpr(expr);
28712884
auto decl = expr->getDecl();
28722885

2886+
str = WrapMutableStaticPlace(decl, std::move(str));
2887+
28732888
if (decl->getType()->getAs<clang::ReferenceType>() && !isAddrOf() &&
28742889
!map_iter_decls_.contains(clang::dyn_cast<clang::VarDecl>(decl))) {
28752890
EmitDeref(std::move(str), decl->getType().getNonReferenceType());

‎tests/lit/lit/formats/Cpp2RustTest.py‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,6 @@ def build_rust(self):
247247
"strip=symbols",
248248
"-C",
249249
"panic=abort",
250-
"-W", ## TODO: remove this once we fix the errors in the generated code
251-
"static_mut_refs",
252250
"--out-dir",
253251
str(self.tmp_dir),
254252
"-L",

‎tests/multi-file/static_name_collision/out/unsafe/static_name_collision.rs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ use std::rc::Rc;
99
pub static mut same_name_different_type_0: i32 = unsafe { 1 };
1010
pub static mut same_name_same_type_1: i32 = unsafe { 5 };
1111
pub unsafe fn a_foo_2() -> i32 {
12-
return same_name_different_type_0;
12+
return (*&raw mut same_name_different_type_0);
1313
}
1414
pub unsafe fn a_bar_3() -> i32 {
15-
return same_name_same_type_1;
15+
return (*&raw mut same_name_same_type_1);
1616
}
1717
pub fn main() {
1818
unsafe {
@@ -29,8 +29,8 @@ unsafe fn main_0() -> i32 {
2929
pub static mut same_name_different_type_6: f32 = unsafe { 1.0E+0 };
3030
pub static mut same_name_same_type_7: i32 = unsafe { 6 };
3131
pub unsafe fn b_foo_4() -> f32 {
32-
return same_name_different_type_6;
32+
return (*&raw mut same_name_different_type_6);
3333
}
3434
pub unsafe fn b_bar_5() -> i32 {
35-
return same_name_same_type_7;
35+
return (*&raw mut same_name_same_type_7);
3636
}

‎tests/unit/out/unsafe/addr_of_global.rs‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ pub static mut beta_1: Inner = unsafe { Inner { value: 2 } };
2121
pub static mut shared_2: Inner = unsafe { Inner { value: 42 } };
2222
pub static mut items_3: [*mut Inner; 2] = unsafe {
2323
[
24-
(&raw mut alpha_0 as *mut Inner),
25-
(&raw mut beta_1 as *mut Inner),
24+
(&raw mut (*&raw mut alpha_0) as *mut Inner),
25+
(&raw mut (*&raw mut beta_1) as *mut Inner),
2626
]
2727
};
2828
pub static mut obj_4: Outer = unsafe {
2929
Outer {
30-
p: (&raw mut shared_2 as *mut Inner),
30+
p: (&raw mut (*&raw mut shared_2) as *mut Inner),
3131
}
3232
};
3333
pub fn main() {
@@ -36,16 +36,16 @@ pub fn main() {
3636
}
3737
}
3838
unsafe fn main_0() -> i32 {
39-
assert!((((*items_3[(0) as usize]).value) == (1)));
40-
assert!((((*items_3[(1) as usize]).value) == (2)));
41-
assert!((((*obj_4.p).value) == (42)));
39+
assert!((((*(*&raw mut items_3)[(0) as usize]).value) == (1)));
40+
assert!((((*(*&raw mut items_3)[(1) as usize]).value) == (2)));
41+
assert!((((*(*&raw mut obj_4).p).value) == (42)));
4242
static mut cache_5: [*mut Inner; 2] = unsafe {
4343
[
44-
(&raw mut alpha_0 as *mut Inner),
45-
(&raw mut beta_1 as *mut Inner),
44+
(&raw mut (*&raw mut alpha_0) as *mut Inner),
45+
(&raw mut (*&raw mut beta_1) as *mut Inner),
4646
]
4747
};;
48-
assert!((((*cache_5[(0) as usize]).value) == (1)));
49-
assert!((((*cache_5[(1) as usize]).value) == (2)));
48+
assert!((((*(*&raw mut cache_5)[(0) as usize]).value) == (1)));
49+
assert!((((*(*&raw mut cache_5)[(1) as usize]).value) == (2)));
5050
return 0;
5151
}

‎tests/unit/out/unsafe/array_const_init.rs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ pub fn main() {
3535
}
3636
}
3737
unsafe fn main_0() -> i32 {
38-
assert!(((((s_0.head) == (5)) as i32) != 0));
38+
assert!((((((*&raw mut s_0).head) == (5)) as i32) != 0));
3939
let mut i: i32 = 0;
4040
'loop_: while ((((i) < (3)) as i32) != 0) {
41-
assert!(((((s_0.tail[(i) as usize]) == (0)) as i32) != 0));
41+
assert!((((((*&raw mut s_0).tail[(i) as usize]) == (0)) as i32) != 0));
4242
i.postfix_inc();
4343
}
4444
let mut i: i32 = 0;
4545
'loop_: while ((((i) < (4)) as i32) != 0) {
46-
assert!(((((s_0.buf[(i) as usize] as i32) == (0)) as i32) != 0));
46+
assert!((((((*&raw mut s_0).buf[(i) as usize] as i32) == (0)) as i32) != 0));
4747
i.postfix_inc();
4848
}
4949
return 0;

‎tests/unit/out/unsafe/bool_condition_logical.rs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub const Code_CODE_ERR: Code = 1;
1212
pub const Code_CODE_FATAL: Code = 2;
1313
pub static mut side_effect_0: i32 = unsafe { 0 };
1414
pub unsafe fn observe_1(mut v: i32) -> i32 {
15-
side_effect_0.prefix_inc();
15+
(*&raw mut side_effect_0).prefix_inc();
1616
return v;
1717
}
1818
pub unsafe fn returns_one_2() -> i32 {
@@ -49,15 +49,15 @@ unsafe fn main_0() -> i32 {
4949
if (((n != 0) && (u != 0)) && (!(p).is_null())) && ((code as i32) == (Code_CODE_OK as i32)) {
5050
assert!(true);
5151
}
52-
side_effect_0 = 0;
52+
(*&raw mut side_effect_0) = 0;
5353
if (zero != 0) && ((unsafe { observe_1(1) }) != 0) {
5454
assert!(false);
5555
}
56-
assert!(((side_effect_0) == (0)));
56+
assert!(((*&raw mut side_effect_0) == (0)));
5757
if (n != 0) || ((unsafe { observe_1(1) }) != 0) {
5858
assert!(true);
5959
}
60-
assert!(((side_effect_0) == (0)));
60+
assert!(((*&raw mut side_effect_0) == (0)));
6161
let mut x: i32 = 5;
6262
let mut y: i32 = 3;
6363
let mut flags: u32 = 2_u32;

‎tests/unit/out/unsafe/bool_condition_logical_c.rs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub const Code_CODE_ERR: Code = 1;
1212
pub const Code_CODE_FATAL: Code = 2;
1313
pub static mut side_effect_0: i32 = unsafe { 0 };
1414
pub unsafe fn observe_1(mut v: i32) -> i32 {
15-
side_effect_0.prefix_inc();
15+
(*&raw mut side_effect_0).prefix_inc();
1616
return v;
1717
}
1818
pub unsafe fn returns_one_2() -> i32 {
@@ -52,15 +52,15 @@ unsafe fn main_0() -> i32 {
5252
{
5353
assert!((1 != 0));
5454
}
55-
side_effect_0 = 0;
55+
(*&raw mut side_effect_0) = 0;
5656
if ((((zero != 0) && ((unsafe { observe_1(1) }) != 0)) as i32) != 0) {
5757
assert!((0 != 0));
5858
}
59-
assert!(((((side_effect_0) == (0)) as i32) != 0));
59+
assert!(((((*&raw mut side_effect_0) == (0)) as i32) != 0));
6060
if ((((n != 0) || ((unsafe { observe_1(1) }) != 0)) as i32) != 0) {
6161
assert!((1 != 0));
6262
}
63-
assert!(((((side_effect_0) == (0)) as i32) != 0));
63+
assert!(((((*&raw mut side_effect_0) == (0)) as i32) != 0));
6464
let mut x: i32 = 5;
6565
let mut y: i32 = 3;
6666
let mut flags: u32 = 2_u32;

‎tests/unit/out/unsafe/constructor.rs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ impl S {
2222
pub unsafe fn S(mut init: i32) -> Self {
2323
let mut this = Self { v: init };
2424
(unsafe { S::mut_method(&mut this) });
25-
total_0 += (unsafe { S::const_method(&mut this) });
25+
(*&raw mut total_0) += (unsafe { S::const_method(&mut this) });
2626
this
2727
}
2828
pub unsafe fn destructor(&mut self) {
2929
(unsafe { S::mut_method(self) });
30-
total_0 += (unsafe { S::const_method(self) });
30+
(*&raw mut total_0) += (unsafe { S::const_method(self) });
3131
}
3232
}
3333
pub fn main() {
@@ -40,8 +40,8 @@ unsafe fn main_0() -> i32 {
4040
let mut s: S = S::S({ 3 });
4141
let _dtor_s = ScopedDestructorUnsafe::new(&raw mut s, S::destructor);
4242
assert!(((s.v) == (4)));
43-
assert!(((total_0) == (8)));
43+
assert!(((*&raw mut total_0) == (8)));
4444
}
45-
assert!(((total_0) == (18)));
45+
assert!(((*&raw mut total_0) == (18)));
4646
return 0;
4747
}

‎tests/unit/out/unsafe/copy_assign.rs‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl Partial {
3030
return &mut (*(self as *mut Partial)) as *mut Partial;
3131
}
3232
self.v = (*o).v;
33-
assigns_0.prefix_inc();
33+
(*&raw mut assigns_0).prefix_inc();
3434
return &mut (*(self as *mut Partial)) as *mut Partial;
3535
}
3636
}
@@ -114,7 +114,7 @@ unsafe fn main_0() -> i32 {
114114
let mut c: Partial = Partial::Partial({ 3 }, { 300 });
115115
(unsafe { Partial::operator_assign(&mut a, &b as *const Partial) });
116116
assert!(((a.v) == (2)) && ((a.keep) == (100)));
117-
assert!(((assigns_0) == (1)));
117+
assert!(((*&raw mut assigns_0) == (1)));
118118
(unsafe {
119119
Partial::operator_assign(
120120
&mut c,
@@ -123,18 +123,18 @@ unsafe fn main_0() -> i32 {
123123
)
124124
});
125125
assert!(((c.v) == (2)) && ((c.keep) == (300)));
126-
assert!(((assigns_0) == (3)));
126+
assert!(((*&raw mut assigns_0) == (3)));
127127
(unsafe {
128128
let _o: *const Partial = &a as *const Partial;
129129
Partial::operator_assign(&mut a, _o)
130130
});
131-
assert!(((assigns_0) == (3)));
131+
assert!(((*&raw mut assigns_0) == (3)));
132132
(unsafe {
133133
let mut _o: Partial = Partial::Partial({ 9 }, { 900 });
134134
Partial::operator_assign(&mut a, &mut _o)
135135
});
136136
assert!(((a.v) == (9)) && ((a.keep) == (100)));
137-
assert!(((assigns_0) == (4)));
137+
assert!(((*&raw mut assigns_0) == (4)));
138138
let ra: *mut Partial = &mut a as *mut Partial;
139139
(unsafe {
140140
let _o: *const Partial = &c as *const Partial;
@@ -147,7 +147,7 @@ unsafe fn main_0() -> i32 {
147147
Partial::operator_assign(&mut (*pa), _o)
148148
});
149149
assert!(((a.v) == (2)));
150-
assert!(((assigns_0) == (6)));
150+
assert!(((*&raw mut assigns_0) == (6)));
151151
let mut h: Holder = Holder {
152152
p: Partial::Partial({ 4 }, { 40 }),
153153
arr: [
@@ -159,7 +159,7 @@ unsafe fn main_0() -> i32 {
159159
(unsafe { Partial::operator_assign(&mut h.arr[(1) as usize], &c as *const Partial) });
160160
assert!(((h.p.v) == (2)) && ((h.p.keep) == (40)));
161161
assert!(((h.arr[(1) as usize].v) == (2)) && ((h.arr[(1) as usize].keep) == (60)));
162-
assert!(((assigns_0) == (8)));
162+
assert!(((*&raw mut assigns_0) == (8)));
163163
let mut n: NonConstAssign = NonConstAssign::NonConstAssign();
164164
let mut n1: NonConstAssign = NonConstAssign::NonConstAssign();
165165
let mut n2: NonConstAssign = NonConstAssign::NonConstAssign();

‎tests/unit/out/unsafe/copy_ctor.rs‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ impl Counted {
1919
}
2020
pub unsafe fn Counted_pconstCounted(o: *const Counted) -> Self {
2121
let mut this = Self { v: (*o).v };
22-
copies_0.prefix_inc();
22+
(*&raw mut copies_0).prefix_inc();
2323
this
2424
}
2525
}
@@ -92,23 +92,23 @@ unsafe fn main_0() -> i32 {
9292
let mut b: Counted = Counted::Counted_pconstCounted({ &a as *const Counted });
9393
let mut c: Counted = Counted::Counted_pconstCounted({ &a as *const Counted });
9494
let mut d: Counted = Counted::Counted_pconstCounted({ &a as *const Counted });
95-
assert!(((copies_0) == (3)));
95+
assert!(((*&raw mut copies_0) == (3)));
9696
assert!((((b.v) == (1)) && ((c.v) == (1))) && ((d.v) == (1)));
9797
assert!(
9898
((unsafe { by_value_1(Counted::Counted_pconstCounted({ &a as *const Counted },),) })
9999
== (1))
100100
);
101-
assert!(((copies_0) == (4)));
101+
assert!(((*&raw mut copies_0) == (4)));
102102
let mut e: Counted = (unsafe { make_2(5) });
103103
assert!(((e.v) == (5)));
104-
assert!(((copies_0) == (5)));
104+
assert!(((*&raw mut copies_0) == (5)));
105105
let mut f: Counted = Counted::Counted({ 6 });
106106
assert!(((f.v) == (6)));
107-
assert!(((copies_0) == (5)));
107+
assert!(((*&raw mut copies_0) == (5)));
108108
let g: Counted = Counted::Counted({ 7 });
109109
let mut h: Counted = Counted::Counted_pconstCounted({ &g as *const Counted });
110110
assert!(((h.v) == (7)));
111-
assert!(((copies_0) == (6)));
111+
assert!(((*&raw mut copies_0) == (6)));
112112
let mut hold: Holder = Holder {
113113
c: Counted::Counted({ 8 }),
114114
arr: [Counted::Counted({ 9 }), Counted::Counted({ 10 })],
@@ -118,14 +118,14 @@ unsafe fn main_0() -> i32 {
118118
(((hold2.c.v) == (8)) && ((hold2.arr[(0) as usize].v) == (9)))
119119
&& ((hold2.arr[(1) as usize].v) == (10))
120120
);
121-
assert!(((copies_0) == (9)));
121+
assert!(((*&raw mut copies_0) == (9)));
122122
let mut vec_: Vec<Counted> = Vec::new();
123123
{
124124
let a0_clone = a.clone();
125125
vec_.push(a0_clone)
126126
};
127127
assert!(((vec_[(0_usize)].v) == (1)));
128-
assert!(((copies_0) == (10)));
128+
assert!(((*&raw mut copies_0) == (10)));
129129
let mut n: NonConst = NonConst::NonConst();
130130
let mut n1: NonConst = NonConst::NonConst_pmutNonConst({ &mut n as *mut NonConst });
131131
let cn: NonConst = NonConst::NonConst();

0 commit comments

Comments
 (0)