Skip to content

Commit 5e80bd1

Browse files
committed
transpile: Use raw pointers for lvalues with side effects
1 parent a09f4d6 commit 5e80bd1

3 files changed

Lines changed: 20 additions & 19 deletions

File tree

c2rust-transpile/src/translator/named_references.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,12 @@ impl<'c> Translation<'c> {
124124

125125
let ptr_name = self.renamer.borrow_mut().fresh();
126126

127-
// let ref mut p = lhs;
127+
// let p = &raw mut lhs;
128+
self.use_feature("raw_ref_op");
128129
let compute_ref = mk().local_stmt(Box::new(mk().local(
129-
mk().mutbl().ident_ref_pat(&ptr_name),
130+
mk().ident_pat(&ptr_name),
130131
None,
131-
Some(reference),
132+
Some(mk().mutbl().raw_borrow_expr(reference)),
132133
)));
133134

134135
let write =

c2rust-transpile/tests/snapshots/snapshots__transpile@exprs.c.2021.snap

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,25 +76,25 @@ pub unsafe extern "C" fn inc_decl_with_rvalue_side_effect() {
7676
}
7777
#[no_mangle]
7878
pub unsafe extern "C" fn inc_decl_with_lvalue_side_effect() {
79-
let ref mut c2rust_fresh2 = *lvalue_side_effect();
79+
let c2rust_fresh2 = &raw mut *lvalue_side_effect();
8080
*c2rust_fresh2 += 1;
81-
let ref mut c2rust_fresh3 = *lvalue_side_effect();
81+
let c2rust_fresh3 = &raw mut *lvalue_side_effect();
8282
*c2rust_fresh3 -= 1;
83-
let ref mut c2rust_fresh4 = *lvalue_side_effect();
83+
let c2rust_fresh4 = &raw mut *lvalue_side_effect();
8484
*c2rust_fresh4 += 1;
85-
let ref mut c2rust_fresh5 = *lvalue_side_effect();
85+
let c2rust_fresh5 = &raw mut *lvalue_side_effect();
8686
*c2rust_fresh5 -= 1;
87-
let ref mut c2rust_fresh6 = *lvalue_side_effect();
87+
let c2rust_fresh6 = &raw mut *lvalue_side_effect();
8888
*c2rust_fresh6 += 1;
8989
let mut pre_inc: ::core::ffi::c_int = *c2rust_fresh6;
90-
let ref mut c2rust_fresh7 = *lvalue_side_effect();
90+
let c2rust_fresh7 = &raw mut *lvalue_side_effect();
9191
*c2rust_fresh7 -= 1;
9292
let mut pre_dec: ::core::ffi::c_int = *c2rust_fresh7;
93-
let ref mut c2rust_fresh8 = *lvalue_side_effect();
93+
let c2rust_fresh8 = &raw mut *lvalue_side_effect();
9494
let c2rust_fresh9 = *c2rust_fresh8;
9595
*c2rust_fresh8 = *c2rust_fresh8 + 1;
9696
let mut post_inc: ::core::ffi::c_int = c2rust_fresh9;
97-
let ref mut c2rust_fresh10 = *lvalue_side_effect();
97+
let c2rust_fresh10 = &raw mut *lvalue_side_effect();
9898
let c2rust_fresh11 = *c2rust_fresh10;
9999
*c2rust_fresh10 = *c2rust_fresh10 - 1;
100100
let mut post_dec: ::core::ffi::c_int = c2rust_fresh11;

c2rust-transpile/tests/snapshots/snapshots__transpile@exprs.c.2024.snap

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,25 +76,25 @@ pub unsafe extern "C" fn inc_decl_with_rvalue_side_effect() {
7676
}
7777
#[unsafe(no_mangle)]
7878
pub unsafe extern "C" fn inc_decl_with_lvalue_side_effect() {
79-
let ref mut c2rust_fresh2 = *lvalue_side_effect();
79+
let c2rust_fresh2 = &raw mut *lvalue_side_effect();
8080
*c2rust_fresh2 += 1;
81-
let ref mut c2rust_fresh3 = *lvalue_side_effect();
81+
let c2rust_fresh3 = &raw mut *lvalue_side_effect();
8282
*c2rust_fresh3 -= 1;
83-
let ref mut c2rust_fresh4 = *lvalue_side_effect();
83+
let c2rust_fresh4 = &raw mut *lvalue_side_effect();
8484
*c2rust_fresh4 += 1;
85-
let ref mut c2rust_fresh5 = *lvalue_side_effect();
85+
let c2rust_fresh5 = &raw mut *lvalue_side_effect();
8686
*c2rust_fresh5 -= 1;
87-
let ref mut c2rust_fresh6 = *lvalue_side_effect();
87+
let c2rust_fresh6 = &raw mut *lvalue_side_effect();
8888
*c2rust_fresh6 += 1;
8989
let mut pre_inc: ::core::ffi::c_int = *c2rust_fresh6;
90-
let ref mut c2rust_fresh7 = *lvalue_side_effect();
90+
let c2rust_fresh7 = &raw mut *lvalue_side_effect();
9191
*c2rust_fresh7 -= 1;
9292
let mut pre_dec: ::core::ffi::c_int = *c2rust_fresh7;
93-
let ref mut c2rust_fresh8 = *lvalue_side_effect();
93+
let c2rust_fresh8 = &raw mut *lvalue_side_effect();
9494
let c2rust_fresh9 = *c2rust_fresh8;
9595
*c2rust_fresh8 = *c2rust_fresh8 + 1;
9696
let mut post_inc: ::core::ffi::c_int = c2rust_fresh9;
97-
let ref mut c2rust_fresh10 = *lvalue_side_effect();
97+
let c2rust_fresh10 = &raw mut *lvalue_side_effect();
9898
let c2rust_fresh11 = *c2rust_fresh10;
9999
*c2rust_fresh10 = *c2rust_fresh10 - 1;
100100
let mut post_dec: ::core::ffi::c_int = c2rust_fresh11;

0 commit comments

Comments
 (0)