Skip to content

Commit 2414c36

Browse files
authored
Fix array to pointer decay in rules arguments (#110)
1 parent 50a017e commit 2414c36

4 files changed

Lines changed: 39 additions & 0 deletions

File tree

cpp2rust/converter/converter.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3686,6 +3686,11 @@ std::string Converter::ConvertPlaceholder(clang::Expr *expr, clang::Expr *arg,
36863686
return std::move(buf).str();
36873687
}
36883688

3689+
if (ph_ctx.declared_in_rule_as_rust_ptr && arg->getType()->isArrayType()) {
3690+
return std::format("({} as {})", ConvertFreshPointer(arg),
3691+
ph_ctx.param_type);
3692+
}
3693+
36893694
if (ph_ctx.needs_materialization()) {
36903695
auto materialized = ph_ctx.materialize_ctx->GetOrMaterialize(
36913696
static_cast<unsigned>(ph_ctx.materialize_idx),

tests/unit/out/refcount/vector_iter_range_ctor.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,5 +71,23 @@ fn main_0() -> i32 {
7171
&& (((v3.as_pointer() as Ptr<i32>).offset(1_u64 as isize).read()) == 2))
7272
&& (((v3.as_pointer() as Ptr<i32>).offset(2_u64 as isize).read()) == 3)
7373
);
74+
let src1: Value<Box<[u32]>> = Rc::new(RefCell::new(Box::new([1_u32, 2_u32, 3_u32])));
75+
let v4: Value<Vec<u32>> = Rc::new(RefCell::new({
76+
let mut __a0 = (src1.as_pointer() as Ptr<u32>).clone();
77+
let mut __out = Vec::with_capacity(
78+
(src1.as_pointer() as Ptr<u32>).to_end().get_offset() - __a0.get_offset(),
79+
);
80+
while __a0 != (src1.as_pointer() as Ptr<u32>).to_end() {
81+
__out.push(__a0.read());
82+
__a0 += 1;
83+
}
84+
__out
85+
}));
86+
assert!(((*v4.borrow()).len() as u64 == 3_u64));
87+
assert!(
88+
((((v4.as_pointer() as Ptr<u32>).offset(0_u64 as isize).read()) == 1_u32)
89+
&& (((v4.as_pointer() as Ptr<u32>).offset(1_u64 as isize).read()) == 2_u32))
90+
&& (((v4.as_pointer() as Ptr<u32>).offset(2_u64 as isize).read()) == 3_u32)
91+
);
7492
return 0;
7593
}

tests/unit/out/unsafe/vector_iter_range_ctor.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,16 @@ unsafe fn main_0() -> i32 {
4949
(((v3[(0_u64) as usize]) == (1)) && ((v3[(1_u64) as usize]) == (2)))
5050
&& ((v3[(2_u64) as usize]) == (3))
5151
);
52+
let src1: [u32; 3] = [1_u32, 2_u32, 3_u32];
53+
let mut v4: Vec<u32> = core::slice::from_raw_parts(
54+
src1.as_ptr(),
55+
(src1.as_ptr().add(src1.len())).offset_from(src1.as_ptr()) as usize,
56+
)
57+
.to_vec();
58+
assert!(((v4.len() as u64) == (3_u64)));
59+
assert!(
60+
(((v4[(0_u64) as usize]) == (1_u32)) && ((v4[(1_u64) as usize]) == (2_u32)))
61+
&& ((v4[(2_u64) as usize]) == (3_u32))
62+
);
5263
return 0;
5364
}

tests/unit/vector_iter_range_ctor.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,10 @@ int main() {
2121
assert(v3.size() == 3);
2222
assert(v3[0] == 1 && v3[1] == 2 && v3[2] == 3);
2323

24+
const uint32_t src1[3] = {1, 2, 3};
25+
auto v4 = std::vector<uint32_t>(src1, std::end(src1));
26+
assert(v4.size() == 3);
27+
assert(v4[0] == 1 && v4[1] == 2 && v4[2] == 3);
28+
2429
return 0;
2530
}

0 commit comments

Comments
 (0)