c2rust produces invalid Rust code when translating compound literals involving pointers and expressions (e.g., condition--). The generated Rust code incorrectly declares a temporary variable as immutable (let) while attempting to create a mutable reference (&mut) to it, leading to a Rust compiler error.
Source C code
int main() {
int condition = 1;
int *single_value = &(int){condition--};
return 0;
}
Expected Behavior
c2rust should generate valid Rust code that handles the mutability requirements of the compound literal, resulting in successful compilation.
Translated Rust code
#![allow(dead_code, mutable_transmutes, non_camel_case_types, non_snake_case, non_upper_case_globals, unused_assignments, unused_mut)]
use ::transpiled_code::*;
unsafe fn main_0() -> libc::c_int {
let mut condition: libc::c_int = 1 as libc::c_int;
let fresh0 = condition;
condition = condition - 1;
let mut single_value: *mut libc::c_int = &mut fresh0 as *mut libc::c_int;
return 0 as libc::c_int;
}
pub fn main() {
unsafe { ::std::process::exit(main_0() as i32) }
}
Cargo build failure
The translated Rust code incorrectly declares a temporary variable (fresh0) as immutable and attempts to create a mutable reference to it, causing the following Rust compile-time error.
error[E0596]: cannot borrow `fresh0` as mutable, as it is not declared as mutable
--> src/runner.rs:7:46
|
7 | let mut single_value: *mut libc::c_int = &mut fresh0 as *mut libc::c_int;
| ^^^^^^^^^^^ cannot borrow as mutable
Observation
I think &(int){condition--} involves modifying condition, but the temporary value created by the compound literal (fresh0) does not need to be mutable, as it is never modified in the original C code. Instead, c2rust should declare fresh0 as immutable and adjust the pointer type accordingly to align with C semantics.
let mut condition: libc::c_int = 1 as libc::c_int;
let fresh0 = condition; // fresh0 is immutable
condition = condition - 1; // condition is decremented
let single_value: *const libc::c_int = &fresh0; // Use a const pointer
Description
c2rust
produces invalid Rust code when translating compound literals involving pointers and expressions (e.g.,condition--
). The generated Rust code incorrectly declares a temporary variable as immutable (let
) while attempting to create a mutable reference (&mut
) to it, leading to a Rust compiler error.Source C code
Expected Behavior
c2rust
should generate valid Rust code that handles the mutability requirements of the compound literal, resulting in successful compilation.Translated Rust code
Cargo build failure
The translated Rust code incorrectly declares a temporary variable
(fresh0)
as immutable and attempts to create a mutable reference to it, causing the following Rust compile-time error.Observation
I think
&(int){condition--}
involves modifyingcondition
, but the temporary value created by the compound literal (fresh0
) does not need to be mutable, as it is never modified in the original C code. Instead,c2rust
should declarefresh0
as immutable and adjust the pointer type accordingly to align with C semantics.