diff --git a/c2rust-transpile/src/translator/literals.rs b/c2rust-transpile/src/translator/literals.rs index 3924aaa657..a04dee2e0f 100644 --- a/c2rust-transpile/src/translator/literals.rs +++ b/c2rust-transpile/src/translator/literals.rs @@ -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) } diff --git a/tests/enums/src/enum_compound.c b/tests/enums/src/enum_compound.c new file mode 100644 index 0000000000..370c282c50 --- /dev/null +++ b/tests/enums/src/enum_compound.c @@ -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 }; +} diff --git a/tests/enums/src/test_enums.rs b/tests/enums/src/test_enums.rs index 2410ab12f0..b95fe8b95f 100644 --- a/tests/enums/src/test_enums.rs +++ b/tests/enums/src/test_enums.rs @@ -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}; @@ -21,6 +22,8 @@ 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; @@ -28,6 +31,7 @@ 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); @@ -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); +}