Skip to content

Commit 5907a12

Browse files
committed
fix #247: various spurious clones
1 parent c2ab522 commit 5907a12

11 files changed

Lines changed: 26 additions & 46 deletions

cpp2rust/converter/models/converter_refcount.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1326,6 +1326,7 @@ bool ConverterRefCount::VisitExplicitCastExpr(clang::ExplicitCastExpr *expr) {
13261326
StrCat(
13271327
std::format("{}.reinterpret_cast::<{}>()", ToString(expr->getSubExpr()),
13281328
GetUnsafeTypeAsString(expr->getType()->getPointeeType())));
1329+
computed_expr_type_ = ComputedExprType::FreshPointer;
13291330
return false;
13301331
case clang::Stmt::CStyleCastExprClass:
13311332
case clang::Stmt::CXXStaticCastExprClass:
@@ -1337,6 +1338,7 @@ bool ConverterRefCount::VisitExplicitCastExpr(clang::ExplicitCastExpr *expr) {
13371338
PushConversionKind push(*this, ConversionKind::Unboxed);
13381339
StrCat(std::format(".reinterpret_cast::<{}>()",
13391340
ConvertPointeeType(expr->getType())));
1341+
computed_expr_type_ = ComputedExprType::FreshPointer;
13401342
return false;
13411343
} else if (expr->getType()->isVoidPointerType() &&
13421344
expr->getSubExpr()->getType()->isPointerType()) {
@@ -1350,6 +1352,7 @@ bool ConverterRefCount::VisitExplicitCastExpr(clang::ExplicitCastExpr *expr) {
13501352
StrCat(std::format("{}.reinterpret_cast::<{}>()",
13511353
ToString(expr->getSubExpr()),
13521354
ConvertPointeeType(expr->getType())));
1355+
computed_expr_type_ = ComputedExprType::FreshPointer;
13531356
return false;
13541357
}
13551358
return Converter::VisitExplicitCastExpr(expr);
@@ -1556,10 +1559,11 @@ void ConverterRefCount::ConvertUnionMemberAccessor(clang::MemberExpr *expr) {
15561559
"{}.reinterpret_cast::<{}>()", str,
15571560
ToString(
15581561
member->getType()->getAsArrayTypeUnsafe()->getElementType())));
1562+
computed_expr_type_ = ComputedExprType::FreshPointer;
15591563
} else {
15601564
StrCat(str);
1565+
computed_expr_type_ = ComputedExprType::Pointer;
15611566
}
1562-
computed_expr_type_ = ComputedExprType::Pointer;
15631567
return;
15641568
}
15651569

tests/unit/out/refcount/fn_ptr_vtable.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,7 @@ pub fn main() {
7373
}
7474
fn main_0() -> i32 {
7575
let vt: Value<Vtable> = Rc::new(RefCell::new(Vtable {
76-
create: Rc::new(RefCell::new(
77-
(FnPtr::<fn(i32) -> AnyPtr>::new(int_create_1)).clone(),
78-
)),
76+
create: Rc::new(RefCell::new(FnPtr::<fn(i32) -> AnyPtr>::new(int_create_1))),
7977
get: Rc::new(RefCell::new(FnPtr::<fn(AnyPtr) -> i32>::new(int_get_2))),
8078
destroy: Rc::new(RefCell::new(FnPtr::<fn(AnyPtr)>::new(int_destroy_3))),
8179
}));

tests/unit/out/refcount/pointer_eq.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,9 @@ fn main_0() -> i32 {
3939
});
4040
let val: Value<i32> = Rc::new(RefCell::new(42));
4141
let orig: Value<Ptr<i32>> = Rc::new(RefCell::new((val.as_pointer())));
42-
let as_bytes: Value<Ptr<u8>> = Rc::new(RefCell::new(
43-
((*orig.borrow()).reinterpret_cast::<u8>()).clone(),
44-
));
45-
let back: Value<Ptr<i32>> = Rc::new(RefCell::new(
46-
((*as_bytes.borrow()).reinterpret_cast::<i32>()).clone(),
47-
));
42+
let as_bytes: Value<Ptr<u8>> = Rc::new(RefCell::new((*orig.borrow()).reinterpret_cast::<u8>()));
43+
let back: Value<Ptr<i32>> =
44+
Rc::new(RefCell::new((*as_bytes.borrow()).reinterpret_cast::<i32>()));
4845
assert!({
4946
let _lhs = (*orig.borrow()).clone();
5047
_lhs == (*back.borrow()).clone()
@@ -53,7 +50,7 @@ fn main_0() -> i32 {
5350
(arr.as_pointer() as Ptr<i32>).reinterpret_cast::<u8>(),
5451
));
5552
let arr_back: Value<Ptr<i32>> = Rc::new(RefCell::new(
56-
((*arr_bytes.borrow()).reinterpret_cast::<i32>()).clone(),
53+
(*arr_bytes.borrow()).reinterpret_cast::<i32>(),
5754
));
5855
assert!({
5956
let _lhs = (*arr_back.borrow()).clone();

tests/unit/out/refcount/ptr_cast_init.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,19 +64,15 @@ pub fn main() {
6464
fn main_0() -> i32 {
6565
let text: Value<Box<[u8]>> = Rc::new(RefCell::new(Box::from(*b"hi\0")));
6666
let cp: Value<Ptr<u8>> = Rc::new(RefCell::new((text.as_pointer() as Ptr<u8>)));
67-
let u: Value<Ptr<u8>> = Rc::new(RefCell::new(
68-
((*cp.borrow()).reinterpret_cast::<u8>()).clone(),
69-
));
67+
let u: Value<Ptr<u8>> = Rc::new(RefCell::new((*cp.borrow()).reinterpret_cast::<u8>()));
7068
assert!(((((((*u.borrow()).offset((0) as isize).read()) as i32) == ('h' as i32)) as i32) != 0));
7169
assert!(((((((*u.borrow()).offset((1) as isize).read()) as i32) == ('i' as i32)) as i32) != 0));
7270
let h: Value<header> = Rc::new(RefCell::new(header {
7371
tag: Rc::new(RefCell::new(7)),
7472
size: Rc::new(RefCell::new(32)),
7573
}));
7674
let hp: Value<Ptr<header>> = Rc::new(RefCell::new((h.as_pointer())));
77-
let v: Value<Ptr<view>> = Rc::new(RefCell::new(
78-
((*hp.borrow()).reinterpret_cast::<view>()).clone(),
79-
));
75+
let v: Value<Ptr<view>> = Rc::new(RefCell::new((*hp.borrow()).reinterpret_cast::<view>()));
8076
assert!(((((*(*(*v.borrow()).upgrade().deref()).tag.borrow()) == 7) as i32) != 0));
8177
return 0;
8278
}

tests/unit/out/refcount/ptr_to_incomplete_struct.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ fn main_0() -> i32 {
1313
let fp: Value<Ptr<::std::fs::File>> = Rc::new(RefCell::new((libcc2rs::cout()).clone()));
1414
let p: Value<AnyPtr> = Rc::new(RefCell::new((*fp.borrow()).clone().to_any()));
1515
let fp2: Value<Ptr<::std::fs::File>> = Rc::new(RefCell::new(
16-
((*p.borrow()).reinterpret_cast::<::std::fs::File>()).clone(),
16+
(*p.borrow()).reinterpret_cast::<::std::fs::File>(),
1717
));
1818
assert!(
1919
((({

tests/unit/out/refcount/reinterpret_cast_chain.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,8 @@ fn main_0() -> i32 {
1515
Rc::new(RefCell::new((val.as_pointer()).reinterpret_cast::<u32>()));
1616
assert!((((*dwords.borrow()).offset((0) as isize).read()) == 67305985_u32));
1717
assert!((((*dwords.borrow()).offset((1) as isize).read()) == 134678021_u32));
18-
let words: Value<Ptr<u16>> = Rc::new(RefCell::new(
19-
((*dwords.borrow()).reinterpret_cast::<u16>()).clone(),
20-
));
18+
let words: Value<Ptr<u16>> =
19+
Rc::new(RefCell::new((*dwords.borrow()).reinterpret_cast::<u16>()));
2120
assert!(((((*words.borrow()).offset((0) as isize).read()) as i32) == 513));
2221
assert!(((((*words.borrow()).offset((1) as isize).read()) as i32) == 1027));
2322
assert!(((((*words.borrow()).offset((2) as isize).read()) as i32) == 1541));

tests/unit/out/refcount/reinterpret_cast_identity.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,17 @@ pub fn main() {
1212
fn main_0() -> i32 {
1313
let val: Value<u32> = Rc::new(RefCell::new(42_u32));
1414
let original: Value<Ptr<u32>> = Rc::new(RefCell::new((val.as_pointer())));
15-
let as_u16: Value<Ptr<u16>> = Rc::new(RefCell::new(
16-
((*original.borrow()).reinterpret_cast::<u16>()).clone(),
17-
));
18-
let back: Value<Ptr<u32>> = Rc::new(RefCell::new(
19-
((*as_u16.borrow()).reinterpret_cast::<u32>()).clone(),
20-
));
15+
let as_u16: Value<Ptr<u16>> =
16+
Rc::new(RefCell::new((*original.borrow()).reinterpret_cast::<u16>()));
17+
let back: Value<Ptr<u32>> = Rc::new(RefCell::new((*as_u16.borrow()).reinterpret_cast::<u32>()));
2118
assert!({
2219
let _lhs = (*back.borrow()).clone();
2320
_lhs == (*original.borrow()).clone()
2421
});
2522
assert!((((*back.borrow()).read()) == 42_u32));
26-
let as_u8: Value<Ptr<u8>> = Rc::new(RefCell::new(
27-
((*original.borrow()).reinterpret_cast::<u8>()).clone(),
28-
));
29-
let back2: Value<Ptr<u32>> = Rc::new(RefCell::new(
30-
((*as_u8.borrow()).reinterpret_cast::<u32>()).clone(),
31-
));
23+
let as_u8: Value<Ptr<u8>> =
24+
Rc::new(RefCell::new((*original.borrow()).reinterpret_cast::<u8>()));
25+
let back2: Value<Ptr<u32>> = Rc::new(RefCell::new((*as_u8.borrow()).reinterpret_cast::<u32>()));
3226
assert!({
3327
let _lhs = (*back2.borrow()).clone();
3428
_lhs == (*original.borrow()).clone()

tests/unit/out/refcount/reinterpret_cast_large_array.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@ fn main_0() -> i32 {
2424
(*arr.borrow())
2525
.offset(((*N.borrow()) - 1) as isize)
2626
.write(3148519816_u32);
27-
let words: Value<Ptr<u16>> = Rc::new(RefCell::new(
28-
((*arr.borrow()).reinterpret_cast::<u16>()).clone(),
29-
));
27+
let words: Value<Ptr<u16>> = Rc::new(RefCell::new((*arr.borrow()).reinterpret_cast::<u16>()));
3028
assert!(
3129
((((*words.borrow())
3230
.offset((((*N.borrow()) * 2) - 1) as isize)

tests/unit/out/refcount/reinterpret_cast_new.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ pub fn main() {
1111
}
1212
fn main_0() -> i32 {
1313
let p: Value<Ptr<u32>> = Rc::new(RefCell::new(Ptr::alloc(67305985_u32)));
14-
let bytes: Value<Ptr<u8>> = Rc::new(RefCell::new(
15-
((*p.borrow()).reinterpret_cast::<u8>()).clone(),
16-
));
14+
let bytes: Value<Ptr<u8>> = Rc::new(RefCell::new((*p.borrow()).reinterpret_cast::<u8>()));
1715
assert!(((((*bytes.borrow()).offset((0) as isize).read()) as i32) == 1));
1816
assert!(((((*bytes.borrow()).offset((1) as isize).read()) as i32) == 2));
1917
assert!(((((*bytes.borrow()).offset((2) as isize).read()) as i32) == 3));

tests/unit/out/refcount/reinterpret_cast_new_array.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ fn main_0() -> i32 {
1717
)));
1818
(*arr.borrow()).offset((0) as isize).write(67305985_u32);
1919
(*arr.borrow()).offset((1) as isize).write(134678021_u32);
20-
let bytes: Value<Ptr<u8>> = Rc::new(RefCell::new(
21-
((*arr.borrow()).reinterpret_cast::<u8>()).clone(),
22-
));
20+
let bytes: Value<Ptr<u8>> = Rc::new(RefCell::new((*arr.borrow()).reinterpret_cast::<u8>()));
2321
assert!(((((*bytes.borrow()).offset((0) as isize).read()) as i32) == 1));
2422
assert!(((((*bytes.borrow()).offset((4) as isize).read()) as i32) == 5));
2523
assert!(((((*bytes.borrow()).offset((7) as isize).read()) as i32) == 8));

0 commit comments

Comments
 (0)