Skip to content

Commit 8b3e414

Browse files
committed
transpile: Don't use named reference for binary conditionals
1 parent cb6991f commit 8b3e414

3 files changed

Lines changed: 35 additions & 26 deletions

File tree

c2rust-transpile/src/translator/mod.rs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3379,9 +3379,10 @@ impl<'c> Translation<'c> {
33793379
}
33803380

33813381
BinaryConditional(ty, lhs, rhs) => {
3382+
let rhs = self.convert_expr(ctx, rhs, None)?;
3383+
33823384
if ctx.is_unused() {
33833385
let mut lhs = self.convert_condition(ctx, false, lhs)?;
3384-
let rhs = self.convert_expr(ctx, rhs, None)?;
33853386
lhs.merge_unsafe(rhs.is_unsafe());
33863387

33873388
lhs.and_then(|val| {
@@ -3397,19 +3398,27 @@ impl<'c> Translation<'c> {
33973398
))
33983399
})
33993400
} else {
3400-
self.name_reference_write_read(ctx, lhs)?.result_map(
3401-
|NamedReference {
3402-
rvalue: lhs_val, ..
3403-
}| {
3404-
let cond = self.match_bool(ctx, true, ty.ctype, lhs_val.clone())?;
3405-
let ite = mk().ifte_expr(
3406-
cond,
3407-
mk().block(vec![mk().expr_stmt(lhs_val)]),
3408-
Some(self.convert_expr(ctx, rhs, None)?.to_expr()),
3409-
);
3410-
Ok(ite)
3411-
},
3412-
)
3401+
let mut lhs = self.convert_expr(ctx.used(), lhs, None)?;
3402+
lhs.merge_unsafe(rhs.is_unsafe());
3403+
let fresh_name = self.renamer.borrow_mut().fresh();
3404+
3405+
lhs.and_then(|lhs| {
3406+
let fresh_stmt = mk().local_stmt(Box::new(mk().local(
3407+
mk().ident_pat(&fresh_name),
3408+
None,
3409+
Some(lhs),
3410+
)));
3411+
3412+
let cond =
3413+
self.match_bool(ctx, true, ty.ctype, mk().ident_expr(&fresh_name))?;
3414+
let ite = mk().ifte_expr(
3415+
cond,
3416+
mk().block(vec![mk().expr_stmt(mk().ident_expr(&fresh_name))]),
3417+
Some(rhs.to_expr()),
3418+
);
3419+
3420+
Ok(WithStmts::new(vec![fresh_stmt], ite))
3421+
})
34133422
}
34143423
}
34153424

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -132,17 +132,17 @@ pub unsafe extern "C" fn binary_conditional_operator(
132132
sz: ::core::ffi::c_uint,
133133
buf: *mut ::core::ffi::c_int,
134134
) {
135-
let ref mut c2rust_fresh1 = id(0 as ::core::ffi::c_int);
135+
let c2rust_fresh1 = id(0 as ::core::ffi::c_int);
136136
*(buf as *mut ::core::ffi::c_int).offset(0 as ::core::ffi::c_int as isize) =
137-
if *c2rust_fresh1 != 0 {
138-
*c2rust_fresh1
137+
if c2rust_fresh1 != 0 {
138+
c2rust_fresh1
139139
} else {
140140
id(1 as ::core::ffi::c_int)
141141
};
142-
let ref mut c2rust_fresh2 = id(2 as ::core::ffi::c_int);
142+
let c2rust_fresh2 = id(2 as ::core::ffi::c_int);
143143
*(buf as *mut ::core::ffi::c_int).offset(1 as ::core::ffi::c_int as isize) =
144-
if *c2rust_fresh2 != 0 {
145-
*c2rust_fresh2
144+
if c2rust_fresh2 != 0 {
145+
c2rust_fresh2
146146
} else {
147147
id(3 as ::core::ffi::c_int)
148148
};

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -132,17 +132,17 @@ pub unsafe extern "C" fn binary_conditional_operator(
132132
sz: ::core::ffi::c_uint,
133133
buf: *mut ::core::ffi::c_int,
134134
) {
135-
let ref mut c2rust_fresh1 = id(0 as ::core::ffi::c_int);
135+
let c2rust_fresh1 = id(0 as ::core::ffi::c_int);
136136
*(buf as *mut ::core::ffi::c_int).offset(0 as ::core::ffi::c_int as isize) =
137-
if *c2rust_fresh1 != 0 {
138-
*c2rust_fresh1
137+
if c2rust_fresh1 != 0 {
138+
c2rust_fresh1
139139
} else {
140140
id(1 as ::core::ffi::c_int)
141141
};
142-
let ref mut c2rust_fresh2 = id(2 as ::core::ffi::c_int);
142+
let c2rust_fresh2 = id(2 as ::core::ffi::c_int);
143143
*(buf as *mut ::core::ffi::c_int).offset(1 as ::core::ffi::c_int as isize) =
144-
if *c2rust_fresh2 != 0 {
145-
*c2rust_fresh2
144+
if c2rust_fresh2 != 0 {
145+
c2rust_fresh2
146146
} else {
147147
id(3 as ::core::ffi::c_int)
148148
};

0 commit comments

Comments
 (0)