From ac35a0a09a8b1ef2482847208a5e89e0521e92b5 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 7 Jul 2026 18:42:56 +0100 Subject: [PATCH] Fix default for 2D array --- .../converter/models/converter_refcount.cpp | 4 +- tests/unit/array_2d_default.c | 20 ++++++ tests/unit/out/refcount/array_2d_default.rs | 66 +++++++++++++++++++ tests/unit/out/unsafe/array_2d_default.rs | 36 ++++++++++ 4 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 tests/unit/array_2d_default.c create mode 100644 tests/unit/out/refcount/array_2d_default.rs create mode 100644 tests/unit/out/unsafe/array_2d_default.rs diff --git a/cpp2rust/converter/models/converter_refcount.cpp b/cpp2rust/converter/models/converter_refcount.cpp index aa0a46aa..d350af32 100644 --- a/cpp2rust/converter/models/converter_refcount.cpp +++ b/cpp2rust/converter/models/converter_refcount.cpp @@ -1875,7 +1875,9 @@ ConverterRefCount::GetArrayDefaultAsString(clang::QualType qual_type) { const auto &size = array_type->getSize(); auto size_as_string = GetNumAsString(size); auto element_type = array_type->getElementType(); - PushConversionKind push(*this, ConversionKind::Unboxed); + PushConversionKind push(*this, element_type->isArrayType() + ? ConversionKind::FullRefCount + : ConversionKind::Unboxed); auto element_type_as_string = ToString(element_type); auto default_as_string = GetDefaultAsString(element_type); return std::format("(0..{}).map(|_| {}).collect::>()", diff --git a/tests/unit/array_2d_default.c b/tests/unit/array_2d_default.c new file mode 100644 index 00000000..dbcc0732 --- /dev/null +++ b/tests/unit/array_2d_default.c @@ -0,0 +1,20 @@ +#include + +static void fill_row(char *row, char c) { + row[0] = c; + row[1] = '\0'; +} + +int main(void) { + char grid[3][6]; + for (int i = 0; i < 3; i++) { + fill_row(grid[i], (char)('a' + i)); + } + assert(grid[0][0] == 'a'); + assert(grid[1][0] == 'b'); + assert(grid[2][0] == 'c'); + assert(grid[1][1] == '\0'); + grid[2][5] = 'z'; + assert(grid[2][5] == 'z'); + return 0; +} diff --git a/tests/unit/out/refcount/array_2d_default.rs b/tests/unit/out/refcount/array_2d_default.rs new file mode 100644 index 00000000..2e77999a --- /dev/null +++ b/tests/unit/out/refcount/array_2d_default.rs @@ -0,0 +1,66 @@ +extern crate libcc2rs; +use libcc2rs::*; +use std::cell::RefCell; +use std::collections::BTreeMap; +use std::io::prelude::*; +use std::io::{Read, Seek, Write}; +use std::os::fd::AsFd; +use std::rc::{Rc, Weak}; +pub fn fill_row_0(row: Ptr, c: u8) { + let row: Value> = Rc::new(RefCell::new(row)); + let c: Value = Rc::new(RefCell::new(c)); + let __rhs = (*c.borrow()); + (*row.borrow()).offset((0) as isize).write(__rhs); + (*row.borrow()) + .offset((1) as isize) + .write((('\0' as i32) as u8)); +} +pub fn main() { + std::process::exit(main_0()); +} +fn main_0() -> i32 { + let grid: Value>]>> = Rc::new(RefCell::new( + (0..3) + .map(|_| { + Rc::new(RefCell::new( + (0..6).map(|_| ::default()).collect::>(), + )) + }) + .collect::>]>>(), + )); + let i: Value = Rc::new(RefCell::new(0)); + 'loop_: while ((((*i.borrow()) < 3) as i32) != 0) { + ({ + let _row: Ptr = (((grid.as_pointer() as Ptr>>) + .offset((*i.borrow())) + .read() + .as_pointer()) as Ptr); + let _c: u8 = ((('a' as i32) + (*i.borrow())) as u8); + fill_row_0(_row, _c) + }); + (*i.borrow_mut()).postfix_inc(); + } + assert!( + (((((*grid.borrow())[(0) as usize].borrow()[(0) as usize] as i32) == ('a' as i32)) as i32) + != 0) + ); + assert!( + (((((*grid.borrow())[(1) as usize].borrow()[(0) as usize] as i32) == ('b' as i32)) as i32) + != 0) + ); + assert!( + (((((*grid.borrow())[(2) as usize].borrow()[(0) as usize] as i32) == ('c' as i32)) as i32) + != 0) + ); + assert!( + (((((*grid.borrow())[(1) as usize].borrow()[(1) as usize] as i32) == ('\0' as i32)) + as i32) + != 0) + ); + (*grid.borrow())[(2) as usize].borrow_mut()[(5) as usize] = (('z' as i32) as u8); + assert!( + (((((*grid.borrow())[(2) as usize].borrow()[(5) as usize] as i32) == ('z' as i32)) as i32) + != 0) + ); + return 0; +} diff --git a/tests/unit/out/unsafe/array_2d_default.rs b/tests/unit/out/unsafe/array_2d_default.rs new file mode 100644 index 00000000..f242a86e --- /dev/null +++ b/tests/unit/out/unsafe/array_2d_default.rs @@ -0,0 +1,36 @@ +extern crate libc; +use libc::*; +extern crate libcc2rs; +use libcc2rs::*; +use std::collections::BTreeMap; +use std::io::{Read, Seek, Write}; +use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; +use std::rc::Rc; +pub unsafe fn fill_row_0(mut row: *mut libc::c_char, mut c: libc::c_char) { + (*row.offset((0) as isize)) = c; + (*row.offset((1) as isize)) = (('\0' as i32) as libc::c_char); +} +pub fn main() { + unsafe { + std::process::exit(main_0() as i32); + } +} +unsafe fn main_0() -> i32 { + let mut grid: [[libc::c_char; 6]; 3] = [[(0 as libc::c_char); 6]; 3]; + let mut i: i32 = 0; + 'loop_: while ((((i) < (3)) as i32) != 0) { + (unsafe { + let _row: *mut libc::c_char = grid[(i) as usize].as_mut_ptr(); + let _c: libc::c_char = ((('a' as i32) + (i)) as libc::c_char); + fill_row_0(_row, _c) + }); + i.postfix_inc(); + } + assert!(((((grid[(0) as usize][(0) as usize] as i32) == ('a' as i32)) as i32) != 0)); + assert!(((((grid[(1) as usize][(0) as usize] as i32) == ('b' as i32)) as i32) != 0)); + assert!(((((grid[(2) as usize][(0) as usize] as i32) == ('c' as i32)) as i32) != 0)); + assert!(((((grid[(1) as usize][(1) as usize] as i32) == ('\0' as i32)) as i32) != 0)); + grid[(2) as usize][(5) as usize] = (('z' as i32) as libc::c_char); + assert!(((((grid[(2) as usize][(5) as usize] as i32) == ('z' as i32)) as i32) != 0)); + return 0; +}