Skip to content

Commit

Permalink
transpile: fix previously ignored enum usage in compound literals (
Browse files Browse the repository at this point in the history
…#1185)

* Fixes #1168.
   
### Modification:
- Suggested changes mentioned in #1168 were added in the
`c2rust-transpile/src/translator/literals.rs` file
- Added a relevant C program in `tests/enums/src/enum_compound.c` file
- Modified `tests/enums/src/test_enums.rs` file to check the correct
outputs

### Testing

The added test case specifically checks for the correct assignment of
enum values in buffer initialization using compound literals. This test
has been integrated into the existing test suite and passed
successfully, confirming the fix.
  • Loading branch information
Yeaseen authored Dec 6, 2024
1 parent 6df47da commit 43fb2f8
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 0 deletions.
4 changes: 4 additions & 0 deletions c2rust-transpile/src/translator/literals.rs
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,10 @@ impl<'c> Translation<'c> {
let id = ids.first().unwrap();
self.convert_expr(ctx.used(), *id)
}
CTypeKind::Enum(_) => {
let id = ids.first().unwrap();
self.convert_expr(ctx.used(), *id)
}
CTypeKind::Vector(CQualTypeId { ctype, .. }, len) => {
self.vector_list_initializer(ctx, ids, ctype, len)
}
Expand Down
13 changes: 13 additions & 0 deletions tests/enums/src/enum_compound.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@

typedef enum {
B = 2
} a;

void entry6(const unsigned buffer_size, int buffer[]) {
if (buffer_size < 1) {
return;
}

// Using a compound literal with enum to assign the value
buffer[0] = (a) { B };
}
18 changes: 18 additions & 0 deletions tests/enums/src/test_enums.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use crate::non_canonical_enum_def::{
hrtimer_restart, rust_abc, HRTIMER_NORESTART, HRTIMER_RESTART,
};
use crate::top_enum::{rust_entry4, E as otherE};
use crate::enum_compound::rust_entry6;

use libc::{c_int, c_uint};

Expand All @@ -21,13 +22,16 @@ extern "C" {
fn entry4(_: c_uint, _: *mut c_int);

fn entry5(_: c_uint, _: *mut c_int);

fn entry6(_: c_uint, _: *mut c_int);
}

const BUFFER_SIZE: usize = 10;
const BUFFER_SIZE2: usize = 7;
const BUFFER_SIZE3: usize = 4;
const BUFFER_SIZE4: usize = 1;
const BUFFER_SIZE5: usize = 6;
const BUFFER_SIZE6: usize = 1;

pub fn test_variants() {
assert_eq!(A as u32, 0);
Expand Down Expand Up @@ -103,3 +107,17 @@ pub fn test_buffer5() {
assert_eq!(buffer, rust_buffer);
assert_eq!(buffer, expected_buffer);
}

pub fn test_buffer6() {
let mut buffer = [0; BUFFER_SIZE6];
let mut rust_buffer = [0; BUFFER_SIZE6];
let expected_buffer = [2];

unsafe {
entry6(BUFFER_SIZE6 as u32, buffer.as_mut_ptr());
rust_entry6(BUFFER_SIZE6 as u32, rust_buffer.as_mut_ptr());
}

assert_eq!(buffer, rust_buffer);
assert_eq!(buffer, expected_buffer);
}

0 comments on commit 43fb2f8

Please sign in to comment.