diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index e46f428c..14af4c6f 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -3686,6 +3686,11 @@ std::string Converter::ConvertPlaceholder(clang::Expr *expr, clang::Expr *arg, return std::move(buf).str(); } + if (ph_ctx.declared_in_rule_as_rust_ptr && arg->getType()->isArrayType()) { + return std::format("({} as {})", ConvertFreshPointer(arg), + ph_ctx.param_type); + } + if (ph_ctx.needs_materialization()) { auto materialized = ph_ctx.materialize_ctx->GetOrMaterialize( static_cast(ph_ctx.materialize_idx), diff --git a/tests/unit/out/refcount/vector_iter_range_ctor.rs b/tests/unit/out/refcount/vector_iter_range_ctor.rs index dd69a3b2..3cc4ecea 100644 --- a/tests/unit/out/refcount/vector_iter_range_ctor.rs +++ b/tests/unit/out/refcount/vector_iter_range_ctor.rs @@ -71,5 +71,23 @@ fn main_0() -> i32 { && (((v3.as_pointer() as Ptr).offset(1_u64 as isize).read()) == 2)) && (((v3.as_pointer() as Ptr).offset(2_u64 as isize).read()) == 3) ); + let src1: Value> = Rc::new(RefCell::new(Box::new([1_u32, 2_u32, 3_u32]))); + let v4: Value> = Rc::new(RefCell::new({ + let mut __a0 = (src1.as_pointer() as Ptr).clone(); + let mut __out = Vec::with_capacity( + (src1.as_pointer() as Ptr).to_end().get_offset() - __a0.get_offset(), + ); + while __a0 != (src1.as_pointer() as Ptr).to_end() { + __out.push(__a0.read()); + __a0 += 1; + } + __out + })); + assert!(((*v4.borrow()).len() as u64 == 3_u64)); + assert!( + ((((v4.as_pointer() as Ptr).offset(0_u64 as isize).read()) == 1_u32) + && (((v4.as_pointer() as Ptr).offset(1_u64 as isize).read()) == 2_u32)) + && (((v4.as_pointer() as Ptr).offset(2_u64 as isize).read()) == 3_u32) + ); return 0; } diff --git a/tests/unit/out/unsafe/vector_iter_range_ctor.rs b/tests/unit/out/unsafe/vector_iter_range_ctor.rs index bd7b981b..b38238fb 100644 --- a/tests/unit/out/unsafe/vector_iter_range_ctor.rs +++ b/tests/unit/out/unsafe/vector_iter_range_ctor.rs @@ -49,5 +49,16 @@ unsafe fn main_0() -> i32 { (((v3[(0_u64) as usize]) == (1)) && ((v3[(1_u64) as usize]) == (2))) && ((v3[(2_u64) as usize]) == (3)) ); + let src1: [u32; 3] = [1_u32, 2_u32, 3_u32]; + let mut v4: Vec = core::slice::from_raw_parts( + src1.as_ptr(), + (src1.as_ptr().add(src1.len())).offset_from(src1.as_ptr()) as usize, + ) + .to_vec(); + assert!(((v4.len() as u64) == (3_u64))); + assert!( + (((v4[(0_u64) as usize]) == (1_u32)) && ((v4[(1_u64) as usize]) == (2_u32))) + && ((v4[(2_u64) as usize]) == (3_u32)) + ); return 0; } diff --git a/tests/unit/vector_iter_range_ctor.cpp b/tests/unit/vector_iter_range_ctor.cpp index 02848ca1..da6f8818 100644 --- a/tests/unit/vector_iter_range_ctor.cpp +++ b/tests/unit/vector_iter_range_ctor.cpp @@ -21,5 +21,10 @@ int main() { assert(v3.size() == 3); assert(v3[0] == 1 && v3[1] == 2 && v3[2] == 3); + const uint32_t src1[3] = {1, 2, 3}; + auto v4 = std::vector(src1, std::end(src1)); + assert(v4.size() == 3); + assert(v4[0] == 1 && v4[1] == 2 && v4[2] == 3); + return 0; }