Skip to content

Commit e42c15f

Browse files
committed
Use copy_from/move_from to translate copy/move ctor
1 parent 8a4535e commit e42c15f

43 files changed

Lines changed: 238 additions & 294 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎cpp2rust/converter/converter.cpp‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,8 +1138,32 @@ std::string Converter::GetSelfMaybeWithMut(const clang::CXXMethodDecl *decl) {
11381138
return MethodNeedsMutableReceiver(decl) ? "&mut self" : "&self";
11391139
}
11401140

1141+
static bool CanUseShortCopyOrMoveCtorName(clang::CXXConstructorDecl *decl,
1142+
const std::string &name) {
1143+
const auto *record = decl->getParent();
1144+
bool is_unique_ctor =
1145+
std::count_if(record->ctor_begin(), record->ctor_end(),
1146+
[decl](const clang::CXXConstructorDecl *ctor) {
1147+
return !ctor->isDeleted() &&
1148+
(decl->isCopyConstructor()
1149+
? ctor->isCopyConstructor()
1150+
: ctor->isMoveConstructor());
1151+
}) == 1;
1152+
bool is_unique_name =
1153+
std::none_of(record->method_begin(), record->method_end(),
1154+
[&name](const clang::CXXMethodDecl *method) {
1155+
return method->getDeclName().isIdentifier() &&
1156+
method->getName() == name;
1157+
});
1158+
return is_unique_ctor && is_unique_name;
1159+
}
1160+
11411161
std::string Converter::GetCtorName(clang::CXXConstructorDecl *decl) {
11421162
if (decl->isCopyOrMoveConstructor()) {
1163+
std::string name = decl->isCopyConstructor() ? "copy_from" : "move_from";
1164+
if (CanUseShortCopyOrMoveCtorName(decl, name)) {
1165+
return name;
1166+
}
11431167
return GetOverloadedFunctionName(decl);
11441168
}
11451169
return GetRecordName(decl->getParent()) +

‎tests/multi-file/defaulted_move_cross_tu/out/refcount/defaulted_move_cross_tu.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ impl S {
2424
let this: Ptr<S> = __this.as_pointer();
2525
Rc::try_unwrap(__this).ok().unwrap().into_inner()
2626
}
27-
pub fn S_pmutS_rv(_a0: Ptr<S>) -> Self {
27+
pub fn move_from(_a0: Ptr<S>) -> Self {
2828
let __this: Value<S> = Rc::new(RefCell::new(Self {
2929
v: Rc::new(RefCell::new(std::mem::take(
3030
&mut (*(*_a0.upgrade().deref()).v.borrow_mut()),
@@ -84,7 +84,7 @@ fn main_0() -> i32 {
8484
pub fn shuffle_1(x: i32) -> i32 {
8585
let x: Value<i32> = Rc::new(RefCell::new(x));
8686
let a: Value<S> = Rc::new(RefCell::new(S::S({ (*x.borrow()) })));
87-
let b: Value<S> = Rc::new(RefCell::new(S::S_pmutS_rv({ a.as_pointer() })));
87+
let b: Value<S> = Rc::new(RefCell::new(S::move_from({ a.as_pointer() })));
8888
assert!((*(*a.borrow()).v.borrow()).is_empty());
8989
let c: Value<S> = Rc::new(RefCell::new(S::S({ 1 })));
9090
({ SImpl::operator_assign_pmutS_rv(&c.as_pointer(), b.as_pointer()) });

‎tests/multi-file/defaulted_move_cross_tu/out/unsafe/defaulted_move_cross_tu.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ impl S {
2020
};
2121
this
2222
}
23-
pub unsafe fn S_pmutS_rv(_a0: *mut S) -> Self {
23+
pub unsafe fn move_from(_a0: *mut S) -> Self {
2424
let mut this = Self {
2525
v: std::mem::take(&mut (*_a0).v),
2626
n: std::array::from_fn::<_, 2, _>(|__i: usize| (*_a0).n[(__i)]),
@@ -67,7 +67,7 @@ unsafe fn main_0() -> i32 {
6767
}
6868
pub unsafe fn shuffle_1(mut x: i32) -> i32 {
6969
let mut a: S = S::S({ x });
70-
let mut b: S = S::S_pmutS_rv({ &mut a });
70+
let mut b: S = S::move_from({ &mut a });
7171
assert!(a.v.is_empty());
7272
let mut c: S = S::S({ 1 });
7373
(unsafe { S::operator_assign_pmutS_rv(&mut c, &mut b) });

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ impl Partial {
2525
let this: Ptr<Partial> = __this.as_pointer();
2626
Rc::try_unwrap(__this).ok().unwrap().into_inner()
2727
}
28-
pub fn Partial_pconstPartial(o: Ptr<Partial>) -> Self {
28+
pub fn copy_from(o: Ptr<Partial>) -> Self {
2929
let __this: Value<Partial> = Rc::new(RefCell::new(Self {
3030
v: Rc::new(RefCell::new((*(*o.upgrade().deref()).v.borrow()))),
3131
keep: Rc::new(RefCell::new((*(*o.upgrade().deref()).keep.borrow()))),
@@ -40,7 +40,7 @@ impl Clone for Partial {
4040
v: self.v.clone(),
4141
keep: self.keep.clone(),
4242
}));
43-
Partial::Partial_pconstPartial(__src.as_pointer())
43+
Partial::copy_from(__src.as_pointer())
4444
}
4545
}
4646
impl ByteRepr for Partial {
@@ -146,14 +146,10 @@ pub struct Holder {
146146
impl Clone for Holder {
147147
fn clone(&self) -> Self {
148148
let __this: Value<Holder> = Rc::new(RefCell::new(Self {
149-
p: Rc::new(RefCell::new(Partial::Partial_pconstPartial({
150-
self.p.as_pointer()
151-
}))),
149+
p: Rc::new(RefCell::new(Partial::copy_from({ self.p.as_pointer() }))),
152150
arr: Rc::new(RefCell::new(Box::new(std::array::from_fn::<_, 2, _>(
153151
|__i: usize| {
154-
Partial::Partial_pconstPartial({
155-
(self.arr.as_pointer() as Ptr<Partial>).offset(__i)
156-
})
152+
Partial::copy_from({ (self.arr.as_pointer() as Ptr<Partial>).offset(__i) })
157153
},
158154
)))),
159155
}));

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

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ impl Counted {
2222
let this: Ptr<Counted> = __this.as_pointer();
2323
Rc::try_unwrap(__this).ok().unwrap().into_inner()
2424
}
25-
pub fn Counted_pconstCounted(o: Ptr<Counted>) -> Self {
25+
pub fn copy_from(o: Ptr<Counted>) -> Self {
2626
let __this: Value<Counted> = Rc::new(RefCell::new(Self {
2727
v: Rc::new(RefCell::new((*(*o.upgrade().deref()).v.borrow()))),
2828
}));
@@ -34,7 +34,7 @@ impl Counted {
3434
impl Clone for Counted {
3535
fn clone(&self) -> Self {
3636
let __src: Value<Counted> = Rc::new(RefCell::new(Counted { v: self.v.clone() }));
37-
Counted::Counted_pconstCounted(__src.as_pointer())
37+
Counted::copy_from(__src.as_pointer())
3838
}
3939
}
4040
impl ByteRepr for Counted {
@@ -116,7 +116,7 @@ impl Ignored {
116116
let this: Ptr<Ignored> = __this.as_pointer();
117117
Rc::try_unwrap(__this).ok().unwrap().into_inner()
118118
}
119-
pub fn Ignored_pconstIgnored(_a0: Ptr<Ignored>) -> Self {
119+
pub fn copy_from(_a0: Ptr<Ignored>) -> Self {
120120
let __this: Value<Ignored> = Rc::new(RefCell::new(Self {
121121
v: Rc::new(RefCell::new(-1_i32)),
122122
}));
@@ -128,7 +128,7 @@ impl Ignored {
128128
impl Clone for Ignored {
129129
fn clone(&self) -> Self {
130130
let __src: Value<Ignored> = Rc::new(RefCell::new(Ignored { v: self.v.clone() }));
131-
Ignored::Ignored_pconstIgnored(__src.as_pointer())
131+
Ignored::copy_from(__src.as_pointer())
132132
}
133133
}
134134
impl ByteRepr for Ignored {
@@ -152,14 +152,10 @@ pub struct Holder {
152152
impl Clone for Holder {
153153
fn clone(&self) -> Self {
154154
let __this: Value<Holder> = Rc::new(RefCell::new(Self {
155-
c: Rc::new(RefCell::new(Counted::Counted_pconstCounted({
156-
self.c.as_pointer()
157-
}))),
155+
c: Rc::new(RefCell::new(Counted::copy_from({ self.c.as_pointer() }))),
158156
arr: Rc::new(RefCell::new(Box::new(std::array::from_fn::<_, 2, _>(
159157
|__i: usize| {
160-
Counted::Counted_pconstCounted({
161-
(self.arr.as_pointer() as Ptr<Counted>).offset(__i)
162-
})
158+
Counted::copy_from({ (self.arr.as_pointer() as Ptr<Counted>).offset(__i) })
163159
},
164160
)))),
165161
}));
@@ -201,29 +197,23 @@ pub fn by_value_1(c: Counted) -> i32 {
201197
pub fn make_2(v: i32) -> Counted {
202198
let v: Value<i32> = Rc::new(RefCell::new(v));
203199
let c: Value<Counted> = Rc::new(RefCell::new(Counted::Counted({ (*v.borrow()) })));
204-
return Counted::Counted_pconstCounted({ c.as_pointer() });
200+
return Counted::copy_from({ c.as_pointer() });
205201
}
206202
pub fn main() {
207203
__cpp2rust_init_globals();
208204
std::process::exit(main_0());
209205
}
210206
fn main_0() -> i32 {
211207
let a: Value<Counted> = Rc::new(RefCell::new(Counted::Counted({ 1 })));
212-
let b: Value<Counted> = Rc::new(RefCell::new(Counted::Counted_pconstCounted({
213-
a.as_pointer()
214-
})));
215-
let c: Value<Counted> = Rc::new(RefCell::new(Counted::Counted_pconstCounted({
216-
a.as_pointer()
217-
})));
218-
let d: Value<Counted> = Rc::new(RefCell::new(Counted::Counted_pconstCounted({
219-
a.as_pointer()
220-
})));
208+
let b: Value<Counted> = Rc::new(RefCell::new(Counted::copy_from({ a.as_pointer() })));
209+
let c: Value<Counted> = Rc::new(RefCell::new(Counted::copy_from({ a.as_pointer() })));
210+
let d: Value<Counted> = Rc::new(RefCell::new(Counted::copy_from({ a.as_pointer() })));
221211
assert!((copies_0.with(|rc| *rc.borrow()) == 3));
222212
assert!(
223213
(((*(*b.borrow()).v.borrow()) == 1) && ((*(*c.borrow()).v.borrow()) == 1))
224214
&& ((*(*d.borrow()).v.borrow()) == 1)
225215
);
226-
assert!((({ by_value_1(Counted::Counted_pconstCounted({ a.as_pointer() },),) }) == 1));
216+
assert!((({ by_value_1(Counted::copy_from({ a.as_pointer() },),) }) == 1));
227217
assert!((copies_0.with(|rc| *rc.borrow()) == 4));
228218
let e: Value<Counted> = Rc::new(RefCell::new(({ make_2(5) })));
229219
assert!(((*(*e.borrow()).v.borrow()) == 5));
@@ -232,9 +222,7 @@ fn main_0() -> i32 {
232222
assert!(((*(*f.borrow()).v.borrow()) == 6));
233223
assert!((copies_0.with(|rc| *rc.borrow()) == 5));
234224
let g: Value<Counted> = Rc::new(RefCell::new(Counted::Counted({ 7 })));
235-
let h: Value<Counted> = Rc::new(RefCell::new(Counted::Counted_pconstCounted({
236-
g.as_pointer()
237-
})));
225+
let h: Value<Counted> = Rc::new(RefCell::new(Counted::copy_from({ g.as_pointer() })));
238226
assert!(((*(*h.borrow()).v.borrow()) == 7));
239227
assert!((copies_0.with(|rc| *rc.borrow()) == 6));
240228
let hold: Value<Holder> = Rc::new(RefCell::new(Holder {
@@ -267,9 +255,7 @@ fn main_0() -> i32 {
267255
);
268256
assert!((copies_0.with(|rc| *rc.borrow()) == 10));
269257
let i1: Value<Ignored> = Rc::new(RefCell::new(Ignored::Ignored({ 1 })));
270-
let i2: Value<Ignored> = Rc::new(RefCell::new(Ignored::Ignored_pconstIgnored({
271-
i1.as_pointer()
272-
})));
258+
let i2: Value<Ignored> = Rc::new(RefCell::new(Ignored::copy_from({ i1.as_pointer() })));
273259
assert!(((*(*i1.borrow()).v.borrow()) == 1) && ((*(*i2.borrow()).v.borrow()) == -1_i32));
274260
assert!((copies_0.with(|rc| *rc.borrow()) == 11));
275261
let n: Value<NonConst> = Rc::new(RefCell::new(NonConst::NonConst()));

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

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ impl DefaultCopyUserMove {
153153
let this: Ptr<DefaultCopyUserMove> = __this.as_pointer();
154154
Rc::try_unwrap(__this).ok().unwrap().into_inner()
155155
}
156-
pub fn DefaultCopyUserMove_pmutDefaultCopyUserMove_rv(o: Ptr<DefaultCopyUserMove>) -> Self {
156+
pub fn move_from(o: Ptr<DefaultCopyUserMove>) -> Self {
157157
let __this: Value<DefaultCopyUserMove> = Rc::new(RefCell::new(Self {
158158
v: Rc::new(RefCell::new((*(*o.upgrade().deref()).v.borrow()))),
159159
}));
@@ -197,14 +197,14 @@ impl UserCopyDefaultMove {
197197
let this: Ptr<UserCopyDefaultMove> = __this.as_pointer();
198198
Rc::try_unwrap(__this).ok().unwrap().into_inner()
199199
}
200-
pub fn UserCopyDefaultMove_pconstUserCopyDefaultMove(o: Ptr<UserCopyDefaultMove>) -> Self {
200+
pub fn copy_from(o: Ptr<UserCopyDefaultMove>) -> Self {
201201
let __this: Value<UserCopyDefaultMove> = Rc::new(RefCell::new(Self {
202202
v: Rc::new(RefCell::new(((*(*o.upgrade().deref()).v.borrow()) + 100))),
203203
}));
204204
let this: Ptr<UserCopyDefaultMove> = __this.as_pointer();
205205
Rc::try_unwrap(__this).ok().unwrap().into_inner()
206206
}
207-
pub fn UserCopyDefaultMove_pmutUserCopyDefaultMove_rv(_a0: Ptr<UserCopyDefaultMove>) -> Self {
207+
pub fn move_from(_a0: Ptr<UserCopyDefaultMove>) -> Self {
208208
let __this: Value<UserCopyDefaultMove> = Rc::new(RefCell::new(Self {
209209
v: Rc::new(RefCell::new((*(*_a0.upgrade().deref()).v.borrow()))),
210210
}));
@@ -216,7 +216,7 @@ impl Clone for UserCopyDefaultMove {
216216
fn clone(&self) -> Self {
217217
let __src: Value<UserCopyDefaultMove> =
218218
Rc::new(RefCell::new(UserCopyDefaultMove { v: self.v.clone() }));
219-
UserCopyDefaultMove::UserCopyDefaultMove_pconstUserCopyDefaultMove(__src.as_pointer())
219+
UserCopyDefaultMove::copy_from(__src.as_pointer())
220220
}
221221
}
222222
impl ByteRepr for UserCopyDefaultMove {
@@ -261,7 +261,7 @@ impl Buffer {
261261
);
262262
Rc::try_unwrap(__this).ok().unwrap().into_inner()
263263
}
264-
pub fn Buffer_pmutBuffer_rv(_a0: Ptr<Buffer>) -> Self {
264+
pub fn move_from(_a0: Ptr<Buffer>) -> Self {
265265
let __this: Value<Buffer> = Rc::new(RefCell::new(Self {
266266
data: Rc::new(RefCell::new(std::mem::take(
267267
&mut (*(*_a0.upgrade().deref()).data.borrow_mut()),
@@ -319,7 +319,7 @@ pub struct Owner {
319319
pub p: Value<Option<Value<i32>>>,
320320
}
321321
impl Owner {
322-
pub fn Owner_pmutOwner_rv(_a0: Ptr<Owner>) -> Self {
322+
pub fn move_from(_a0: Ptr<Owner>) -> Self {
323323
let __this: Value<Owner> = Rc::new(RefCell::new(Self {
324324
data: Rc::new(RefCell::new(std::mem::take(
325325
&mut (*(*_a0.upgrade().deref()).data.borrow_mut()),
@@ -386,7 +386,7 @@ impl Holder {
386386
let this: Ptr<Holder> = __this.as_pointer();
387387
Rc::try_unwrap(__this).ok().unwrap().into_inner()
388388
}
389-
pub fn Holder_pmutHolder_rv(_a0: Ptr<Holder>) -> Self {
389+
pub fn move_from(_a0: Ptr<Holder>) -> Self {
390390
let __this: Value<Holder> = Rc::new(RefCell::new(Self {
391391
inner: Rc::new(RefCell::new(
392392
(*(*_a0.upgrade().deref()).inner.borrow()).clone(),
@@ -525,9 +525,9 @@ fn main_0() -> i32 {
525525
7
526526
})));
527527
let m1: Value<DefaultCopyUserMove> = Rc::new(RefCell::new((*m.borrow()).clone()));
528-
let m2: Value<DefaultCopyUserMove> = Rc::new(RefCell::new(
529-
DefaultCopyUserMove::DefaultCopyUserMove_pmutDefaultCopyUserMove_rv({ m.as_pointer() }),
530-
));
528+
let m2: Value<DefaultCopyUserMove> = Rc::new(RefCell::new(DefaultCopyUserMove::move_from({
529+
m.as_pointer()
530+
})));
531531
assert!(
532532
(((*(*m1.borrow()).v.borrow()) == 7) && ((*(*m2.borrow()).v.borrow()) == 7))
533533
&& ((*(*m.borrow()).v.borrow()) == 0)
@@ -555,12 +555,12 @@ fn main_0() -> i32 {
555555
Rc::new(RefCell::new(UserCopyDefaultMove::UserCopyDefaultMove({
556556
8
557557
})));
558-
let u1: Value<UserCopyDefaultMove> = Rc::new(RefCell::new(
559-
UserCopyDefaultMove::UserCopyDefaultMove_pconstUserCopyDefaultMove({ u.as_pointer() }),
560-
));
561-
let u2: Value<UserCopyDefaultMove> = Rc::new(RefCell::new(
562-
UserCopyDefaultMove::UserCopyDefaultMove_pmutUserCopyDefaultMove_rv({ u.as_pointer() }),
563-
));
558+
let u1: Value<UserCopyDefaultMove> = Rc::new(RefCell::new(UserCopyDefaultMove::copy_from({
559+
u.as_pointer()
560+
})));
561+
let u2: Value<UserCopyDefaultMove> = Rc::new(RefCell::new(UserCopyDefaultMove::move_from({
562+
u.as_pointer()
563+
})));
564564
assert!(
565565
(((*(*u1.borrow()).v.borrow()) == 108) && ((*(*u2.borrow()).v.borrow()) == 8))
566566
&& ((*(*u.borrow()).v.borrow()) == 8)
@@ -587,9 +587,7 @@ fn main_0() -> i32 {
587587
});
588588
assert!(((*(*u3.borrow()).v.borrow()) == 108) && ((*(*u4.borrow()).v.borrow()) == 8));
589589
let p: Value<Buffer> = Rc::new(RefCell::new(Buffer::Buffer({ 3 })));
590-
let q: Value<Buffer> = Rc::new(RefCell::new(Buffer::Buffer_pmutBuffer_rv({
591-
p.as_pointer()
592-
})));
590+
let q: Value<Buffer> = Rc::new(RefCell::new(Buffer::move_from({ p.as_pointer() })));
593591
assert!(
594592
((((*(*q.borrow()).n.borrow()) == 3) && ((*(*q.borrow()).data.borrow()).len() == 3_usize))
595593
&& ((((*q.borrow()).data.as_pointer() as Ptr<i32>)
@@ -619,10 +617,9 @@ fn main_0() -> i32 {
619617
&& ((*(*q.borrow()).rows.borrow()).is_empty())
620618
);
621619
let bufs: Value<Vec<Buffer>> = Rc::new(RefCell::new(Vec::new()));
622-
(*bufs.borrow_mut()).push(Buffer::Buffer_pmutBuffer_rv({ r.as_pointer() }));
620+
(*bufs.borrow_mut()).push(Buffer::move_from({ r.as_pointer() }));
623621
{
624-
let __arg =
625-
Buffer::Buffer_pmutBuffer_rv({ (bufs.as_pointer() as Ptr<Buffer>).offset(0_usize) });
622+
let __arg = Buffer::move_from({ (bufs.as_pointer() as Ptr<Buffer>).offset(0_usize) });
626623
bufs.as_pointer()
627624
.with_mut(|__v: &mut Vec<Buffer>| __v.push(__arg))
628625
};
@@ -659,7 +656,7 @@ fn main_0() -> i32 {
659656
let _p: Ptr<_> = Ptr::alloc(7);
660657
(*(*o1.borrow()).p.borrow_mut()) = _p.to_owned_opt()
661658
};
662-
let o2: Value<Owner> = Rc::new(RefCell::new(Owner::Owner_pmutOwner_rv({ o1.as_pointer() })));
659+
let o2: Value<Owner> = Rc::new(RefCell::new(Owner::move_from({ o1.as_pointer() })));
663660
assert!(
664661
((((*(*o2.borrow()).n.borrow()) == 5)
665662
&& ((*(*o2.borrow()).data.borrow()).len() == 1_usize))
@@ -691,9 +688,7 @@ fn main_0() -> i32 {
691688
let _p: Ptr<_> = Ptr::alloc(9);
692689
(*(*h1.borrow()).p.borrow_mut()) = _p.to_owned_opt()
693690
};
694-
let h2: Value<Holder> = Rc::new(RefCell::new(Holder::Holder_pmutHolder_rv({
695-
h1.as_pointer()
696-
})));
691+
let h2: Value<Holder> = Rc::new(RefCell::new(Holder::move_from({ h1.as_pointer() })));
697692
let _dtor_h2 = ScopedDestructor::new(&h2, |__p| __p.destructor());
698693
assert!(
699694
((((*(*(*h2.borrow()).inner.borrow()).x.borrow()) == 4)

0 commit comments

Comments
 (0)