]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: add missing coercion site code generation for block tail
authorPhilip Herron <herron.philip@googlemail.com>
Tue, 9 May 2023 13:47:37 +0000 (14:47 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:37:15 +0000 (18:37 +0100)
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>
gcc/rust/backend/rust-compile-base.cc
gcc/testsuite/rust/execute/torture/issue-2179.rs [new file with mode: 0644]

index 70147a3462d34f3103a95c8514032887896863aa..1a9a3d296913eb9ea1937c4a8c302600ce74d8a2 100644 (file)
@@ -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 (file)
index 0000000..53bacaa
--- /dev/null
@@ -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;
+}