Skip to content

Commit 46e6664

Browse files
committed
Translate decompositions
1 parent 5401177 commit 46e6664

18 files changed

Lines changed: 1200 additions & 0 deletions

‎cpp2rust/converter/converter.cpp‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3012,6 +3012,10 @@ std::string Converter::ConvertDeclRef(clang::Expr *expr,
30123012
}
30133013

30143014
bool Converter::VisitDeclRefExpr(clang::DeclRefExpr *expr) {
3015+
if (auto *binding = clang::dyn_cast<clang::BindingDecl>(expr->getDecl())) {
3016+
Convert(binding->getBinding());
3017+
return false;
3018+
}
30153019
ConvertDeclRefValue(expr, expr->getDecl());
30163020
return false;
30173021
}

‎cpp2rust/converter/converter_lib.cpp‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,13 @@ std::string GetNamedDeclAsString(const clang::NamedDecl *decl) {
781781
name = GetFunctionBaseName(fn);
782782
}
783783

784+
if (clang::isa<clang::DecompositionDecl>(decl)) {
785+
return std::format(
786+
"__decomp_{}",
787+
type_mapping.try_emplace(GetID(decl), type_mapping.size())
788+
.first->second);
789+
}
790+
784791
// Anonymous record or enum
785792
if (name.empty() && (clang::isa<clang::RecordDecl>(decl) ||
786793
clang::isa<clang::FieldDecl>(decl) ||
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
extern crate libcc2rs;
2+
use libcc2rs::*;
3+
use std::cell::RefCell;
4+
use std::collections::BTreeMap;
5+
use std::io::prelude::*;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::AsFd;
8+
use std::rc::{Rc, Weak};
9+
pub fn main() {
10+
__cpp2rust_init_globals();
11+
std::process::exit(main_0());
12+
}
13+
fn main_0() -> i32 {
14+
let arr: Value<Box<[i32]>> = Rc::new(RefCell::new(Box::new([1, 2, 3])));
15+
let __decomp_0: Value<Box<[i32]>> =
16+
Rc::new(RefCell::new(Box::new(std::array::from_fn::<_, 3, _>(
17+
|__i: usize| (*arr.borrow())[(__i) as usize],
18+
))));
19+
(*__decomp_0.borrow_mut())[(0) as usize] = 10;
20+
assert!(((*__decomp_0.borrow())[(0) as usize] == 10));
21+
assert!(((*__decomp_0.borrow())[(1) as usize] == 2));
22+
assert!(((*__decomp_0.borrow())[(2) as usize] == 3));
23+
assert!(((*arr.borrow())[(0) as usize] == 1));
24+
let __decomp_1: Ptr<i32> = (arr.as_pointer() as Ptr<i32>);
25+
(__decomp_1).offset((0) as isize).write(7);
26+
{
27+
let _ptr = (__decomp_1).offset((2) as isize);
28+
_ptr.write(_ptr.read() + ((__decomp_1).offset((1) as isize).read()))
29+
};
30+
assert!(((*arr.borrow())[(0) as usize] == 7));
31+
assert!(((*arr.borrow())[(2) as usize] == 5));
32+
return 0;
33+
}
34+
pub fn __cpp2rust_init_globals() {}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
extern crate libcc2rs;
2+
use libcc2rs::*;
3+
use std::cell::RefCell;
4+
use std::collections::BTreeMap;
5+
use std::io::prelude::*;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::AsFd;
8+
use std::rc::{Rc, Weak};
9+
thread_local!(
10+
pub static copies_0: Value<i32> = Rc::new(RefCell::new(0));
11+
);
12+
#[derive(VaArg, FnPtrArg, Default)]
13+
pub struct Counted {
14+
pub x: Value<i32>,
15+
pub y: Value<i32>,
16+
}
17+
impl Counted {
18+
pub fn new(x: i32, y: i32) -> Self {
19+
let x: Value<i32> = Rc::new(RefCell::new(x));
20+
let y: Value<i32> = Rc::new(RefCell::new(y));
21+
let __this: Value<Counted> = Rc::new(RefCell::new(Self {
22+
x: Rc::new(RefCell::new((*x.borrow()))),
23+
y: Rc::new(RefCell::new((*y.borrow()))),
24+
}));
25+
let this: Ptr<Counted> = __this.as_pointer();
26+
Rc::try_unwrap(__this).ok().unwrap().into_inner()
27+
}
28+
pub fn copy_from(other: Ptr<Counted>) -> Self {
29+
let __this: Value<Counted> = Rc::new(RefCell::new(Self {
30+
x: Rc::new(RefCell::new(((*(*other.upgrade().deref()).x.borrow()) * 2))),
31+
y: Rc::new(RefCell::new(((*(*other.upgrade().deref()).y.borrow()) * 2))),
32+
}));
33+
let this: Ptr<Counted> = __this.as_pointer();
34+
(*copies_0.with(Value::clone).borrow_mut()).prefix_inc();
35+
Rc::try_unwrap(__this).ok().unwrap().into_inner()
36+
}
37+
}
38+
impl Clone for Counted {
39+
fn clone(&self) -> Self {
40+
let __src: Value<Counted> = Rc::new(RefCell::new(Counted {
41+
x: self.x.clone(),
42+
y: self.y.clone(),
43+
}));
44+
Counted::copy_from(__src.as_pointer())
45+
}
46+
}
47+
impl ByteRepr for Counted {
48+
fn byte_size() -> usize {
49+
8
50+
}
51+
fn to_bytes(&self, buf: &mut [u8]) {
52+
(*self.x.borrow()).to_bytes(&mut buf[0..4]);
53+
(*self.y.borrow()).to_bytes(&mut buf[4..8]);
54+
}
55+
fn from_bytes(buf: &[u8]) -> Self {
56+
Self {
57+
x: Rc::new(RefCell::new(<i32>::from_bytes(&buf[0..4]))),
58+
y: Rc::new(RefCell::new(<i32>::from_bytes(&buf[4..8]))),
59+
}
60+
}
61+
}
62+
pub fn make_counted_1() -> Counted {
63+
return Counted::new({ 5 }, { 6 });
64+
}
65+
pub fn main() {
66+
__cpp2rust_init_globals();
67+
std::process::exit(main_0());
68+
}
69+
fn main_0() -> i32 {
70+
let s: Value<Counted> = Rc::new(RefCell::new(Counted::new({ 1 }, { 2 })));
71+
let __decomp_2: Value<Counted> = Rc::new(RefCell::new(Counted::copy_from({ s.as_pointer() })));
72+
assert!((copies_0.with(|rc| *rc.borrow()) == 1));
73+
assert!(((*(*__decomp_2.borrow()).x.borrow()) == 2));
74+
assert!(((*(*__decomp_2.borrow()).y.borrow()) == 4));
75+
let __decomp_3: Ptr<Counted> = s.as_pointer();
76+
assert!((copies_0.with(|rc| *rc.borrow()) == 1));
77+
assert!(((*(*__decomp_3.upgrade().deref()).x.borrow()) == 1));
78+
assert!(((*(*__decomp_3.upgrade().deref()).y.borrow()) == 2));
79+
let __decomp_4: Ptr<Counted> = s.as_pointer();
80+
assert!((copies_0.with(|rc| *rc.borrow()) == 1));
81+
assert!(((*(*__decomp_4.upgrade().deref()).x.borrow()) == 1));
82+
let __decomp_5: Value<Counted> = Rc::new(RefCell::new(({ make_counted_1() })));
83+
assert!((copies_0.with(|rc| *rc.borrow()) == 1));
84+
assert!(((*(*__decomp_5.borrow()).x.borrow()) == 5));
85+
assert!(((*(*__decomp_5.borrow()).y.borrow()) == 6));
86+
return 0;
87+
}
88+
pub fn __cpp2rust_init_globals() {
89+
let _ = copies_0.with(|_| ());
90+
}
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
extern crate libcc2rs;
2+
use libcc2rs::*;
3+
use std::cell::RefCell;
4+
use std::collections::BTreeMap;
5+
use std::io::prelude::*;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::AsFd;
8+
use std::rc::{Rc, Weak};
9+
thread_local!(
10+
pub static copies_0: Value<i32> = Rc::new(RefCell::new(0));
11+
);
12+
thread_local!(
13+
pub static moves_1: Value<i32> = Rc::new(RefCell::new(0));
14+
);
15+
#[derive(VaArg, FnPtrArg, Default)]
16+
pub struct Elem {
17+
pub v: Value<i32>,
18+
}
19+
impl Elem {
20+
pub fn new(v: i32) -> Self {
21+
let v: Value<i32> = Rc::new(RefCell::new(v));
22+
let __this: Value<Elem> = Rc::new(RefCell::new(Self {
23+
v: Rc::new(RefCell::new((*v.borrow()))),
24+
}));
25+
let this: Ptr<Elem> = __this.as_pointer();
26+
Rc::try_unwrap(__this).ok().unwrap().into_inner()
27+
}
28+
pub fn copy_from(other: Ptr<Elem>) -> Self {
29+
let __this: Value<Elem> = Rc::new(RefCell::new(Self {
30+
v: Rc::new(RefCell::new(
31+
((*(*other.upgrade().deref()).v.borrow()) + 100),
32+
)),
33+
}));
34+
let this: Ptr<Elem> = __this.as_pointer();
35+
(*copies_0.with(Value::clone).borrow_mut()).prefix_inc();
36+
Rc::try_unwrap(__this).ok().unwrap().into_inner()
37+
}
38+
pub fn move_from(other: Ptr<Elem>) -> Self {
39+
let __this: Value<Elem> = Rc::new(RefCell::new(Self {
40+
v: Rc::new(RefCell::new(
41+
((*(*other.upgrade().deref()).v.borrow()) + 1000),
42+
)),
43+
}));
44+
let this: Ptr<Elem> = __this.as_pointer();
45+
(*(*other.upgrade().deref()).v.borrow_mut()) = -1_i32;
46+
(*moves_1.with(Value::clone).borrow_mut()).prefix_inc();
47+
Rc::try_unwrap(__this).ok().unwrap().into_inner()
48+
}
49+
}
50+
impl Clone for Elem {
51+
fn clone(&self) -> Self {
52+
let __src: Value<Elem> = Rc::new(RefCell::new(Elem { v: self.v.clone() }));
53+
Elem::copy_from(__src.as_pointer())
54+
}
55+
}
56+
impl ByteRepr for Elem {
57+
fn byte_size() -> usize {
58+
4
59+
}
60+
fn to_bytes(&self, buf: &mut [u8]) {
61+
(*self.v.borrow()).to_bytes(&mut buf[0..4]);
62+
}
63+
fn from_bytes(buf: &[u8]) -> Self {
64+
Self {
65+
v: Rc::new(RefCell::new(<i32>::from_bytes(&buf[0..4]))),
66+
}
67+
}
68+
}
69+
#[derive(VaArg, FnPtrArg, Default)]
70+
pub struct Two {
71+
pub a: Value<Elem>,
72+
pub b: Value<Elem>,
73+
}
74+
impl Clone for Two {
75+
fn clone(&self) -> Self {
76+
let __this: Value<Two> = Rc::new(RefCell::new(Self {
77+
a: Rc::new(RefCell::new(Elem::copy_from({ self.a.as_pointer() }))),
78+
b: Rc::new(RefCell::new(Elem::copy_from({ self.b.as_pointer() }))),
79+
}));
80+
let this: Ptr<Two> = __this.as_pointer();
81+
Rc::try_unwrap(__this).ok().unwrap().into_inner()
82+
}
83+
}
84+
impl ByteRepr for Two {
85+
fn byte_size() -> usize {
86+
8
87+
}
88+
fn to_bytes(&self, buf: &mut [u8]) {
89+
(*self.a.borrow()).to_bytes(&mut buf[0..4]);
90+
(*self.b.borrow()).to_bytes(&mut buf[4..8]);
91+
}
92+
fn from_bytes(buf: &[u8]) -> Self {
93+
Self {
94+
a: Rc::new(RefCell::new(<Elem>::from_bytes(&buf[0..4]))),
95+
b: Rc::new(RefCell::new(<Elem>::from_bytes(&buf[4..8]))),
96+
}
97+
}
98+
}
99+
pub fn make_two_2() -> Two {
100+
return Two {
101+
a: Rc::new(RefCell::new(Elem::new({ 1 }))),
102+
b: Rc::new(RefCell::new(Elem::new({ 2 }))),
103+
};
104+
}
105+
pub fn main() {
106+
__cpp2rust_init_globals();
107+
std::process::exit(main_0());
108+
}
109+
fn main_0() -> i32 {
110+
let t: Value<Two> = Rc::new(RefCell::new(Two {
111+
a: Rc::new(RefCell::new(Elem::new({ 1 }))),
112+
b: Rc::new(RefCell::new(Elem::new({ 2 }))),
113+
}));
114+
let base_copies: Value<i32> = Rc::new(RefCell::new(copies_0.with(|rc| *rc.borrow())));
115+
let base_moves: Value<i32> = Rc::new(RefCell::new(moves_1.with(|rc| *rc.borrow())));
116+
let __decomp_3: Value<Two> = Rc::new(RefCell::new((*t.borrow()).clone()));
117+
assert!((copies_0.with(|rc| *rc.borrow()) == ((*base_copies.borrow()) + 2)));
118+
assert!((moves_1.with(|rc| *rc.borrow()) == (*base_moves.borrow())));
119+
assert!(((*(*(*__decomp_3.borrow()).a.borrow()).v.borrow()) == 101));
120+
assert!(((*(*(*__decomp_3.borrow()).b.borrow()).v.borrow()) == 102));
121+
let __decomp_4: Ptr<Two> = t.as_pointer();
122+
assert!((copies_0.with(|rc| *rc.borrow()) == ((*base_copies.borrow()) + 2)));
123+
assert!(((*(*(*__decomp_4.upgrade().deref()).a.borrow()).v.borrow()) == 1));
124+
(*(*(*__decomp_4.upgrade().deref()).a.borrow()).v.borrow_mut()) = 50;
125+
assert!(((*(*(*t.borrow()).a.borrow()).v.borrow()) == 50));
126+
let __decomp_5: Value<Two> = Rc::new(RefCell::new((*t.borrow()).clone()));
127+
assert!((moves_1.with(|rc| *rc.borrow()) == ((*base_moves.borrow()) + 2)));
128+
assert!(((*(*(*__decomp_5.borrow()).a.borrow()).v.borrow()) == 1050));
129+
assert!(((*(*(*__decomp_5.borrow()).b.borrow()).v.borrow()) == 1002));
130+
assert!(((*(*(*t.borrow()).a.borrow()).v.borrow()) == -1_i32));
131+
let before_copies: Value<i32> = Rc::new(RefCell::new(copies_0.with(|rc| *rc.borrow())));
132+
let before_moves: Value<i32> = Rc::new(RefCell::new(moves_1.with(|rc| *rc.borrow())));
133+
let __decomp_6: Value<Two> = Rc::new(RefCell::new(({ make_two_2() })));
134+
assert!((copies_0.with(|rc| *rc.borrow()) == (*before_copies.borrow())));
135+
assert!((moves_1.with(|rc| *rc.borrow()) == (*before_moves.borrow())));
136+
assert!(((*(*(*__decomp_6.borrow()).a.borrow()).v.borrow()) == 1));
137+
let p: Value<(Value<Elem>, Value<Elem>)> = Rc::new(RefCell::new((
138+
Rc::new(RefCell::new(
139+
Elem::new({ 7 }).try_into().expect("failed conversion"),
140+
)),
141+
Rc::new(RefCell::new(
142+
Elem::new({ 8 }).try_into().expect("failed conversion"),
143+
)),
144+
)));
145+
(*before_copies.borrow_mut()) = copies_0.with(|rc| *rc.borrow());
146+
let __decomp_7: Value<(Value<Elem>, Value<Elem>)> = Rc::new(RefCell::new((
147+
Rc::new(RefCell::new((*p.borrow()).0.borrow().clone())),
148+
Rc::new(RefCell::new((*p.borrow()).1.borrow().clone())),
149+
)));
150+
assert!((copies_0.with(|rc| *rc.borrow()) == ((*before_copies.borrow()) + 2)));
151+
assert!(
152+
((*(*x.upgrade().deref()).v.borrow()) == ((*(*(*p.borrow()).0.borrow()).v.borrow()) + 100))
153+
);
154+
assert!(
155+
((*(*y.upgrade().deref()).v.borrow()) == ((*(*(*p.borrow()).1.borrow()).v.borrow()) + 100))
156+
);
157+
return 0;
158+
}
159+
pub fn __cpp2rust_init_globals() {
160+
let _ = copies_0.with(|_| ());
161+
let _ = moves_1.with(|_| ());
162+
}

0 commit comments

Comments
 (0)