From 595abeeddaa4421dd59fe04012efe2b5d2d5e13c Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Sun, 17 May 2026 12:39:47 +0100 Subject: [PATCH] Fix bad propagation of AddrOf --- cpp2rust/converter/converter.cpp | 1 + tests/unit/out/refcount/vector_addr_of_back.rs | 5 +++++ tests/unit/out/unsafe/vector_addr_of_back.rs | 3 +++ tests/unit/vector_addr_of_back.cpp | 5 +++++ 4 files changed, 14 insertions(+) diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index e46f428c..2ee2a481 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -3709,6 +3709,7 @@ std::string Converter::ConvertPlaceholder(clang::Expr *expr, clang::Expr *arg, ph_ctx.is_index_base ? std::optional(ph_ctx.access == TranslationRule::Access::kWrite) : std::nullopt); + PushExprKind push(*this, ExprKind::RValue); ConvertDeref(arg); return std::move(buf).str(); } diff --git a/tests/unit/out/refcount/vector_addr_of_back.rs b/tests/unit/out/refcount/vector_addr_of_back.rs index 0c180c54..04f17dca 100644 --- a/tests/unit/out/refcount/vector_addr_of_back.rs +++ b/tests/unit/out/refcount/vector_addr_of_back.rs @@ -19,5 +19,10 @@ fn main_0() -> i32 { ((*outer.borrow())[(*outer.borrow()).len() - 1].as_pointer()), )); assert!(((*(*sink.borrow()).upgrade().deref()).len() as u64 == 0_u64)); + let p: Value>>>> = Rc::new(RefCell::new((outer.as_pointer()))); + (*sink.borrow_mut()) = ((*(*p.borrow()).upgrade().deref()) + [(*(*p.borrow()).upgrade().deref()).len() - 1] + .as_pointer()); + assert!(((*(*sink.borrow()).upgrade().deref()).len() as u64 == 0_u64)); return 0; } diff --git a/tests/unit/out/unsafe/vector_addr_of_back.rs b/tests/unit/out/unsafe/vector_addr_of_back.rs index 4939d073..3b3f287b 100644 --- a/tests/unit/out/unsafe/vector_addr_of_back.rs +++ b/tests/unit/out/unsafe/vector_addr_of_back.rs @@ -17,5 +17,8 @@ unsafe fn main_0() -> i32 { outer.push(inner.clone()); let mut sink: *mut Vec = ((outer).last_mut().unwrap()); assert!((((*sink.cast_const()).len() as u64) == (0_u64))); + let mut p: *mut Vec> = (&mut outer as *mut Vec>); + sink = ((*p).last_mut().unwrap()); + assert!((((*sink.cast_const()).len() as u64) == (0_u64))); return 0; } diff --git a/tests/unit/vector_addr_of_back.cpp b/tests/unit/vector_addr_of_back.cpp index 9212fe75..07bf5bbe 100644 --- a/tests/unit/vector_addr_of_back.cpp +++ b/tests/unit/vector_addr_of_back.cpp @@ -7,5 +7,10 @@ int main() { outer.push_back(inner); auto *sink = &outer.back(); assert(sink->size() == 0); + + auto *p = &outer; + sink = &p->back(); + assert(sink->size() == 0); + return 0; }