Skip to content

Commit 24784d2

Browse files
committed
Convert implicit values of decomposition
1 parent 46e6664 commit 24784d2

5 files changed

Lines changed: 29 additions & 4 deletions

File tree

‎cpp2rust/converter/converter.cpp‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,15 @@ bool Converter::VisitVarDecl(clang::VarDecl *decl) {
602602
}
603603
EmitScopedDestructor(decl);
604604

605+
if (auto *decomp = clang::dyn_cast<clang::DecompositionDecl>(decl)) {
606+
for (auto *binding : decomp->bindings()) {
607+
if (auto *holding = binding->getHoldingVar()) {
608+
StrCat(token::kSemiColon);
609+
VisitVarDecl(holding);
610+
}
611+
}
612+
}
613+
605614
return false;
606615
}
607616

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ fn main_0() -> i32 {
147147
Rc::new(RefCell::new((*p.borrow()).0.borrow().clone())),
148148
Rc::new(RefCell::new((*p.borrow()).1.borrow().clone())),
149149
)));
150+
let x: Ptr<Elem> = ({ get_8((__decomp_7.as_pointer()).clone()) });
151+
let y: Ptr<Elem> = ({ get_9((__decomp_7.as_pointer()).clone()) });
150152
assert!((copies_0.with(|rc| *rc.borrow()) == ((*before_copies.borrow()) + 2)));
151153
assert!(
152154
((*(*x.upgrade().deref()).v.borrow()) == ((*(*(*p.borrow()).0.borrow()).v.borrow()) + 100))

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,27 @@ pub fn main() {
2424
fn main_0() -> i32 {
2525
let __decomp_1: Value<(Value<i32>, Value<bool>)> =
2626
Rc::new(RefCell::new(({ make_std_pair_0(5) })));
27+
let value: Ptr<i32> = ({ get_2((__decomp_1.as_pointer()).clone()) });
28+
let positive: Ptr<bool> = ({ get_3((__decomp_1.as_pointer()).clone()) });
2729
assert!(((value.read()) == 5));
2830
assert!(((positive.read()) as bool));
2931
let p: Value<(Value<i32>, Value<i32>)> = Rc::new(RefCell::new((
3032
Rc::new(RefCell::new(1.try_into().expect("failed conversion"))),
3133
Rc::new(RefCell::new(2.try_into().expect("failed conversion"))),
3234
)));
33-
let __decomp_2: Value<(Value<i32>, Value<i32>)> = Rc::new(RefCell::new((
35+
let __decomp_4: Value<(Value<i32>, Value<i32>)> = Rc::new(RefCell::new((
3436
Rc::new(RefCell::new((*p.borrow()).0.borrow().clone())),
3537
Rc::new(RefCell::new((*p.borrow()).1.borrow().clone())),
3638
)));
39+
let a: Ptr<i32> = ({ get_5((__decomp_4.as_pointer()).clone()) });
40+
let b: Ptr<i32> = ({ get_6((__decomp_4.as_pointer()).clone()) });
3741
a.write(10);
3842
assert!(((a.read()) == 10));
3943
assert!(((b.read()) == 2));
4044
assert!(((*(*p.borrow()).0.borrow()) == 1));
41-
let __decomp_3: Ptr<(Value<i32>, Value<i32>)> = p.as_pointer();
45+
let __decomp_7: Ptr<(Value<i32>, Value<i32>)> = p.as_pointer();
46+
let x: Ptr<i32> = ({ get_8((__decomp_7).clone()) });
47+
let y: Ptr<i32> = ({ get_9((__decomp_7).clone()) });
4248
x.write(3);
4349
{
4450
let _ptr = y.clone();

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ unsafe fn main_0() -> i32 {
8888
let mut p: (Elem, Elem) = (Elem::new({ 7 }).into(), Elem::new({ 8 }).into());
8989
before_copies = (*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0));
9090
let mut __decomp_7: (Elem, Elem) = p.clone();
91+
let x: *mut Elem = (unsafe { get_8(&mut __decomp_7) });
92+
let y: *mut Elem = (unsafe { get_9(&mut __decomp_7) });
9193
assert!(
9294
((*std::cell::LazyCell::force_mut(&mut *&raw mut copies_0)) == ((before_copies) + (2)))
9395
);

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,21 @@ pub fn main() {
1717
}
1818
unsafe fn main_0() -> i32 {
1919
let mut __decomp_1: (i32, bool) = (unsafe { make_std_pair_0(5) });
20+
let value: *mut i32 = (unsafe { get_2(&mut __decomp_1) });
21+
let positive: *mut bool = (unsafe { get_3(&mut __decomp_1) });
2022
assert!(((*value) == (5)));
2123
assert!(((*positive) as bool));
2224
let mut p: (i32, i32) = (1.into(), 2.into());
23-
let mut __decomp_2: (i32, i32) = p.clone();
25+
let mut __decomp_4: (i32, i32) = p.clone();
26+
let a: *mut i32 = (unsafe { get_5(&mut __decomp_4) });
27+
let b: *mut i32 = (unsafe { get_6(&mut __decomp_4) });
2428
(*a) = 10;
2529
assert!(((*a) == (10)));
2630
assert!(((*b) == (2)));
2731
assert!(((p.0) == (1)));
28-
let __decomp_3: *mut (i32, i32) = &mut p;
32+
let __decomp_7: *mut (i32, i32) = &mut p;
33+
let x: *mut i32 = (unsafe { get_8(__decomp_7) });
34+
let y: *mut i32 = (unsafe { get_9(__decomp_7) });
2935
(*x) = 3;
3036
(*y) += 4;
3137
assert!(((p.0) == (3)));

0 commit comments

Comments
 (0)