diff options
author | Philip Herron <herron.philip@googlemail.com> | 2023-05-09 14:47:37 +0100 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 18:37:15 +0100 |
commit | f91d7d39067de97adb5c67f052daa2dcd27f3cc6 (patch) | |
tree | fee8b9ea021bf839d1ff449a89e8b909e74d9af7 | |
parent | c9600aa54d7412f5bbff97be2046c8054e201c3c (diff) | |
download | gcc-f91d7d39067de97adb5c67f052daa2dcd27f3cc6.zip gcc-f91d7d39067de97adb5c67f052daa2dcd27f3cc6.tar.gz gcc-f91d7d39067de97adb5c67f052daa2dcd27f3cc6.tar.bz2 |
gccrs: add missing coercion site code generation for block tail
Fixes #2179
gcc/rust/ChangeLog:
* backend/rust-compile-base.cc (HIRCompileBase::compile_function_body):
add missing coercion_site codegen
gcc/testsuite/ChangeLog:
* rust/execute/torture/issue-2179.rs: New test.
Signed-off-by: Philip Herron <herron.philip@googlemail.com>
-rw-r--r-- | gcc/rust/backend/rust-compile-base.cc | 13 | ||||
-rw-r--r-- | gcc/testsuite/rust/execute/torture/issue-2179.rs | 29 |
2 files changed, 42 insertions, 0 deletions
diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc index 70147a3..1a9a3d2 100644 --- a/gcc/rust/backend/rust-compile-base.cc +++ b/gcc/rust/backend/rust-compile-base.cc @@ -489,6 +489,19 @@ HIRCompileBase::compile_function_body (tree fndecl, // we can only return this if non unit value return type if (!fn_return_ty->is_unit ()) { + HirId id = function_body.get_mappings ().get_hirid (); + Location lvalue_locus = function_body.get_locus (); + Location rvalue_locus = locus; + + TyTy::BaseType *expected = fn_return_ty; + TyTy::BaseType *actual = nullptr; + bool ok = ctx->get_tyctx ()->lookup_type ( + function_body.expr->get_mappings ().get_hirid (), &actual); + rust_assert (ok); + + return_value = coercion_site (id, return_value, actual, expected, + lvalue_locus, rvalue_locus); + tree return_stmt = ctx->get_backend ()->return_statement (fndecl, return_value, locus); diff --git a/gcc/testsuite/rust/execute/torture/issue-2179.rs b/gcc/testsuite/rust/execute/torture/issue-2179.rs new file mode 100644 index 0000000..53bacaa --- /dev/null +++ b/gcc/testsuite/rust/execute/torture/issue-2179.rs @@ -0,0 +1,29 @@ +// { dg-output "123\n" } +trait A { + fn get_int(&self) -> i32; +} + +impl A for i32 { + fn get_int(&self) -> i32 { + *self + } +} + +fn get_dyn_a(x: &i32) -> &dyn A { + x +} + +extern "C" { + fn printf(s: *const i8, ...) -> i32; +} + +fn main() -> i32 { + let x = 123; + let y = get_dyn_a(&x); + let value = y.get_int(); + let fmt_string = "%d\n\0" as *const str as *const i8; + unsafe { + printf(fmt_string, value); + } + return 0; +} |