Skip to content

Commit fe65155

Browse files
committed
Fix decomposition in loop
1 parent b06e806 commit fe65155

3 files changed

Lines changed: 37 additions & 11 deletions

File tree

‎cpp2rust/converter/converter.cpp‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1506,7 +1506,11 @@ bool Converter::VisitCXXForRangeStmt(clang::CXXForRangeStmt *stmt) {
15061506
auto *begin =
15071507
clang::cast<clang::VarDecl>(stmt->getBeginStmt()->getSingleDecl());
15081508
auto *end = clang::cast<clang::VarDecl>(stmt->getEndStmt()->getSingleDecl());
1509-
begin->setDeclName(stmt->getLoopVariable()->getDeclName());
1509+
begin->setDeclName(
1510+
clang::isa<clang::DecompositionDecl>(stmt->getLoopVariable())
1511+
? clang::DeclarationName(
1512+
&ctx_.Idents.get(GetNamedDeclAsString(stmt->getLoopVariable())))
1513+
: stmt->getLoopVariable()->getDeclName());
15101514
StrCat("'loop_:");
15111515
StrCat(keyword::kFor, GetNamedDeclAsString(begin), keyword::kIn,
15121516
"IterRange::new(", ConvertFreshRValue(begin->getInit()), token::kComma,
@@ -2952,6 +2956,10 @@ bool Converter::IsReferenceType(const clang::Expr *expr) const {
29522956
GetReturnTypeOfFunction(call)->isReferenceType();
29532957
}
29542958
if (const auto *decl_ref = clang::dyn_cast<clang::DeclRefExpr>(e)) {
2959+
if (auto *var = clang::dyn_cast<clang::VarDecl>(decl_ref->getDecl());
2960+
var && IsAliasOfInit(ctx_, var)) {
2961+
return IsReferenceType(var->getInit());
2962+
}
29552963
return GetDeclRefType(curr_function_, decl_ref, decl_ref->getDecl())
29562964
->isReferenceType();
29572965
}

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,23 +33,35 @@ fn main_0() -> i32 {
3333
second: 6,
3434
},
3535
])));
36-
'loop_: for mut __decomp_0 in arr.as_pointer() as Ptr<Pair> {
36+
'loop_: for __decomp_0 in IterRange::new(
37+
(arr.as_pointer() as Ptr<Pair>),
38+
(arr.as_pointer() as Ptr<Pair>).offset((3_i64) as isize),
39+
) {
40+
let __decomp_0: Ptr<Pair> = (__decomp_0).clone();
3741
{
3842
let __rhs = __decomp_0.with(|__s| __s.second);
3943
field!(__decomp_0, first).with_mut(|__v| *__v = *__v + __rhs)
4044
};
4145
}
4246
assert!(({ (*arr.borrow())[(0) as usize].first } == 3));
4347
assert!(({ (*arr.borrow())[(2) as usize].first } == 11));
44-
'loop_: for mut __decomp_1 in arr.as_pointer() as Ptr<Pair> {
45-
let __decomp_1: Value<Pair> = Rc::new(RefCell::new(__decomp_1.upgrade().deref().clone()));
48+
'loop_: for __decomp_1 in IterRange::new(
49+
(arr.as_pointer() as Ptr<Pair>),
50+
(arr.as_pointer() as Ptr<Pair>).offset((3_i64) as isize),
51+
) {
52+
let __decomp_1: Value<Pair> =
53+
Rc::new(RefCell::new((*__decomp_1.upgrade().deref()).clone()));
4654
(*__decomp_1.borrow_mut()).first = 0;
4755
(*__decomp_1.borrow_mut()).second = 0;
4856
}
4957
assert!(({ (*arr.borrow())[(1) as usize].first } == 7));
5058
assert!(({ (*arr.borrow())[(1) as usize].second } == 4));
5159
let mut sum: i32 = 0;
52-
'loop_: for mut __decomp_2 in arr.as_pointer() as Ptr<Pair> {
60+
'loop_: for __decomp_2 in IterRange::new(
61+
(arr.as_pointer() as Ptr<Pair>),
62+
(arr.as_pointer() as Ptr<Pair>).offset((3_i64) as isize),
63+
) {
64+
let __decomp_2: Ptr<Pair> = (__decomp_2).clone();
5365
sum += (__decomp_2.with(|__s| __s.first) * __decomp_2.with(|__s| __s.second));
5466
}
5567
assert!((sum == (((3 * 2) + (7 * 4)) + (11 * 6))));

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,28 @@ unsafe fn main_0() -> i32 {
3333
second: 6,
3434
},
3535
];
36-
'loop_: for __decomp_0 in 0..(arr.len()) {
37-
let mut __decomp_0 = arr.as_mut_ptr().add(__decomp_0);
36+
'loop_: for __decomp_0 in
37+
IterRange::new(arr.as_mut_ptr(), arr.as_mut_ptr().offset((3_i64) as isize))
38+
{
39+
let __decomp_0: *mut Pair = &mut (*__decomp_0);
3840
(*__decomp_0).first += (*__decomp_0).second;
3941
}
4042
assert!(((arr[(0) as usize].first) == (3)));
4143
assert!(((arr[(2) as usize].first) == (11)));
42-
'loop_: for __decomp_1 in 0..(arr.len()) {
43-
let mut __decomp_1 = arr[__decomp_1].clone();
44+
'loop_: for __decomp_1 in
45+
IterRange::new(arr.as_mut_ptr(), arr.as_mut_ptr().offset((3_i64) as isize))
46+
{
47+
let mut __decomp_1: Pair = (*__decomp_1);
4448
__decomp_1.first = 0;
4549
__decomp_1.second = 0;
4650
}
4751
assert!(((arr[(1) as usize].first) == (7)));
4852
assert!(((arr[(1) as usize].second) == (4)));
4953
let mut sum: i32 = 0;
50-
'loop_: for __decomp_2 in 0..(arr.len()) {
51-
let mut __decomp_2 = arr.as_ptr().add(__decomp_2);
54+
'loop_: for __decomp_2 in
55+
IterRange::new(arr.as_mut_ptr(), arr.as_mut_ptr().offset((3_i64) as isize))
56+
{
57+
let __decomp_2: *const Pair = &(*__decomp_2);
5258
sum += (((*__decomp_2).first) * ((*__decomp_2).second));
5359
}
5460
assert!(((sum) == ((((3) * (2)) + ((7) * (4))) + ((11) * (6)))));

0 commit comments

Comments
 (0)