Skip to content

Commit 595abee

Browse files
committed
Fix bad propagation of AddrOf
1 parent a6d3427 commit 595abee

4 files changed

Lines changed: 14 additions & 0 deletions

File tree

cpp2rust/converter/converter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3709,6 +3709,7 @@ std::string Converter::ConvertPlaceholder(clang::Expr *expr, clang::Expr *arg,
37093709
ph_ctx.is_index_base
37103710
? std::optional(ph_ctx.access == TranslationRule::Access::kWrite)
37113711
: std::nullopt);
3712+
PushExprKind push(*this, ExprKind::RValue);
37123713
ConvertDeref(arg);
37133714
return std::move(buf).str();
37143715
}

tests/unit/out/refcount/vector_addr_of_back.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,10 @@ fn main_0() -> i32 {
1919
((*outer.borrow())[(*outer.borrow()).len() - 1].as_pointer()),
2020
));
2121
assert!(((*(*sink.borrow()).upgrade().deref()).len() as u64 == 0_u64));
22+
let p: Value<Ptr<Vec<Value<Vec<i32>>>>> = Rc::new(RefCell::new((outer.as_pointer())));
23+
(*sink.borrow_mut()) = ((*(*p.borrow()).upgrade().deref())
24+
[(*(*p.borrow()).upgrade().deref()).len() - 1]
25+
.as_pointer());
26+
assert!(((*(*sink.borrow()).upgrade().deref()).len() as u64 == 0_u64));
2227
return 0;
2328
}

tests/unit/out/unsafe/vector_addr_of_back.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,8 @@ unsafe fn main_0() -> i32 {
1717
outer.push(inner.clone());
1818
let mut sink: *mut Vec<i32> = ((outer).last_mut().unwrap());
1919
assert!((((*sink.cast_const()).len() as u64) == (0_u64)));
20+
let mut p: *mut Vec<Vec<i32>> = (&mut outer as *mut Vec<Vec<i32>>);
21+
sink = ((*p).last_mut().unwrap());
22+
assert!((((*sink.cast_const()).len() as u64) == (0_u64)));
2023
return 0;
2124
}

tests/unit/vector_addr_of_back.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,10 @@ int main() {
77
outer.push_back(inner);
88
auto *sink = &outer.back();
99
assert(sink->size() == 0);
10+
11+
auto *p = &outer;
12+
sink = &p->back();
13+
assert(sink->size() == 0);
14+
1015
return 0;
1116
}

0 commit comments

Comments
 (0)