diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index fde1092b..f1c291e0 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -474,7 +474,8 @@ bool Converter::ConvertVarDeclSkipInit(clang::VarDecl *decl) { auto *method_or_null = curr_function_ ? clang::dyn_cast(curr_function_) : nullptr; - if (!qual_type.isConstQualified() && !qual_type->isReferenceType() && + if ((hoisted_decls_.contains(decl) || !qual_type.isConstQualified()) && + !qual_type->isReferenceType() && ((method_or_null == nullptr) || !method_or_null->isVirtual()) && !IsGlobalVar(decl)) { StrCat(keyword_mut_); diff --git a/tests/unit/goto_cleanup.c b/tests/unit/goto_cleanup.c index ebb2891f..ca974f8b 100644 --- a/tests/unit/goto_cleanup.c +++ b/tests/unit/goto_cleanup.c @@ -7,8 +7,9 @@ static int early(int n) { goto out; } ret = 100; + const int intentionally_const_var = 22; out: - return ret; + return ret + intentionally_const_var - intentionally_const_var; } static int from_loop(int n) { diff --git a/tests/unit/out/refcount/goto_cleanup.rs b/tests/unit/out/refcount/goto_cleanup.rs index a29dbce5..b0fab882 100644 --- a/tests/unit/out/refcount/goto_cleanup.rs +++ b/tests/unit/out/refcount/goto_cleanup.rs @@ -9,6 +9,7 @@ use std::rc::{Rc, Weak}; pub fn early_0(n: i32) -> i32 { let n: Value = Rc::new(RefCell::new(n)); let ret: Value = >::default(); + let intentionally_const_var: Value = >::default(); goto_block!({ '__entry: { *ret.borrow_mut() = 0; @@ -17,9 +18,11 @@ pub fn early_0(n: i32) -> i32 { goto!('out); } (*ret.borrow_mut()) = 100; + *intentionally_const_var.borrow_mut() = 22; } 'out: { - return (*ret.borrow()); + return (((*ret.borrow()) + (*intentionally_const_var.borrow())) + - (*intentionally_const_var.borrow())); } }); panic!("ub: non-void function does not return a value") diff --git a/tests/unit/out/unsafe/goto_cleanup.rs b/tests/unit/out/unsafe/goto_cleanup.rs index cfca0762..b18f0218 100644 --- a/tests/unit/out/unsafe/goto_cleanup.rs +++ b/tests/unit/out/unsafe/goto_cleanup.rs @@ -8,6 +8,7 @@ use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; use std::rc::Rc; pub unsafe fn early_0(mut n: i32) -> i32 { let mut ret: i32 = 0_i32; + let mut intentionally_const_var: i32 = 0_i32; goto_block!({ '__entry: { ret = 0; @@ -16,9 +17,10 @@ pub unsafe fn early_0(mut n: i32) -> i32 { goto!('out); } ret = 100; + intentionally_const_var = 22; } 'out: { - return ret; + return (((ret) + (intentionally_const_var)) - (intentionally_const_var)); } }); panic!("ub: non-void function does not return a value")