Skip to content

Commit 3537bb6

Browse files
committed
Unbox initializer list in refcount
1 parent 119f77b commit 3537bb6

5 files changed

Lines changed: 30 additions & 0 deletions

File tree

‎cpp2rust/converter/models/converter_refcount.cpp‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1673,6 +1673,12 @@ bool ConverterRefCount::VisitInitListExpr(clang::InitListExpr *expr) {
16731673
return false;
16741674
}
16751675

1676+
bool ConverterRefCount::VisitCXXStdInitializerListExpr(
1677+
clang::CXXStdInitializerListExpr *expr) {
1678+
PushConversionKind push(*this, ConversionKind::Unboxed);
1679+
return Converter::VisitCXXStdInitializerListExpr(expr);
1680+
}
1681+
16761682
void ConverterRefCount::ConvertUnionMemberAccessor(clang::MemberExpr *expr) {
16771683
auto member = expr->getMemberDecl();
16781684
std::string str;

‎cpp2rust/converter/models/converter_refcount.h‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ class ConverterRefCount final : public Converter {
127127
void EmitStmtExprTail(clang::Expr *tail) override;
128128

129129
bool VisitInitListExpr(clang::InitListExpr *expr) override;
130+
131+
bool VisitCXXStdInitializerListExpr(
132+
clang::CXXStdInitializerListExpr *expr) override;
133+
130134
bool VisitArrayInitLoopExpr(clang::ArrayInitLoopExpr *expr) override;
131135

132136
bool VisitArraySubscriptExpr(clang::ArraySubscriptExpr *expr) override;

‎tests/unit/initializer_list.cpp‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,10 @@ size_t f(std::initializer_list<int> bytes) {
1212

1313
int main() {
1414
assert(f({1, 2, 3}) == 3);
15+
std::vector<int> v = {4, 5, 6};
16+
assert(v.size() == 3);
17+
assert(v[0] + v[1] + v[2] == 15);
18+
std::initializer_list<int> l = {7, 8};
19+
assert(l.size() == 2);
1520
return 0;
1621
}

‎tests/unit/out/refcount/initializer_list.rs‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,16 @@ pub fn main() {
1919
}
2020
fn main_0() -> i32 {
2121
assert!((({ f_0(vec![1, 2, 3,],) }) == 3_usize));
22+
let v: Value<Vec<i32>> = Rc::new(RefCell::new(vec![4, 5, 6]));
23+
assert!(((*v.borrow()).len() == 3_usize));
24+
assert!(
25+
(((((v.as_pointer() as Ptr<i32>).offset(0_usize).read())
26+
+ ((v.as_pointer() as Ptr<i32>).offset(1_usize).read()))
27+
+ ((v.as_pointer() as Ptr<i32>).offset(2_usize).read()))
28+
== 15)
29+
);
30+
let l: Value<Vec<i32>> = Rc::new(RefCell::new(vec![7, 8]));
31+
assert!(((*l.borrow()).len() == 2_usize));
2232
return 0;
2333
}
2434
pub fn __cpp2rust_init_globals() {}

‎tests/unit/out/unsafe/initializer_list.rs‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ pub fn main() {
2020
}
2121
unsafe fn main_0() -> i32 {
2222
assert!(((unsafe { f_0(vec![1, 2, 3,],) }) == (3_usize)));
23+
let mut v: Vec<i32> = vec![4, 5, 6];
24+
assert!(((v.len()) == (3_usize)));
25+
assert!(((((v[(0_usize)]) + (v[(1_usize)])) + (v[(2_usize)])) == (15)));
26+
let mut l: Vec<i32> = vec![7, 8];
27+
assert!(((l.len()) == (2_usize)));
2328
return 0;
2429
}
2530
pub unsafe fn __cpp2rust_init_globals() {}

0 commit comments

Comments
 (0)