https://gcc.gnu.org/g:8b20ce82d7c7113d5ca8c6d198c8ed674f4b51d4
commit r17-3090-g8b20ce82d7c7113d5ca8c6d198c8ed674f4b51d4 Author: Lishin <[email protected]> Date: Fri Jun 19 18:14:41 2026 +0000 gccrs: Emit function-scope drops for unit tail expressions Add the missing drop calls before returning from unit tail expressions. gcc/rust/ChangeLog: * backend/rust-compile-base.cc (HIRCompileBase::compile_function_body): Emit current scope drops for unit tail expressions. gcc/testsuite/ChangeLog: * rust/execute/drop-function-scope-unit-tail.rs: New test. Signed-off-by: Lishin <[email protected]> Diff: --- gcc/rust/backend/rust-compile-base.cc | 2 + .../rust/execute/drop-function-scope-unit-tail.rs | 46 ++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc index e049e18a4604..4e618243b3b3 100644 --- a/gcc/rust/backend/rust-compile-base.cc +++ b/gcc/rust/backend/rust-compile-base.cc @@ -739,6 +739,8 @@ HIRCompileBase::compile_function_body (tree fndecl, // just add the stmt expression ctx->add_statement (return_value); + CompileDrop::emit_current_scope_drop_calls (ctx); + // now just return unit expression tree unit_expr = unit_expression (locus); tree return_stmt diff --git a/gcc/testsuite/rust/execute/drop-function-scope-unit-tail.rs b/gcc/testsuite/rust/execute/drop-function-scope-unit-tail.rs new file mode 100644 index 000000000000..ab5bf3fb3e19 --- /dev/null +++ b/gcc/testsuite/rust/execute/drop-function-scope-unit-tail.rs @@ -0,0 +1,46 @@ +// { dg-output "d\r*\nd\r*\n" } +// { dg-additional-options "-w" } +#![feature(no_core)] +#![feature(lang_items)] +#![no_core] + +extern "C" { + fn printf(s: *const i8, ...); +} + +#[lang = "sized"] +pub trait Sized {} + +#[lang = "drop"] +pub trait Drop { + fn drop(&mut self); +} + +struct Droppable; + +impl Drop for Droppable { + fn drop(&mut self) { + let msg = "d\n\0" as *const str as *const i8; + unsafe { + printf(msg); + } + } +} + +fn foo() {} + +fn unit_tail_call() { + let _x = Droppable; + foo() +} + +fn unit_tail_literal() { + let _x = Droppable; + () +} + +fn main() -> i32 { + unit_tail_call(); + unit_tail_literal(); + 0 +} \ No newline at end of file
