https://gcc.gnu.org/g:3db9835f404e1a908e5c4ff86d277f3654c5c11b

commit r17-2241-g3db9835f404e1a908e5c4ff86d277f3654c5c11b
Author: Yap Zhi Heng <[email protected]>
Date:   Thu Jun 18 23:02:19 2026 +0800

    gccrs: Fix field access on DST fat pointers
    
    gcc/rust/ChangeLog:
    
            * backend/rust-compile-expr.cc (CompileExpr::visit 
(FieldAccessExpr)):
            Handle DST fat pointers by reinterpreting the fat pointer as its 
field type.
    
    Signed-Off-By: Yap Zhi Heng <[email protected]>

Diff:
---
 gcc/rust/backend/rust-compile-expr.cc | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/gcc/rust/backend/rust-compile-expr.cc 
b/gcc/rust/backend/rust-compile-expr.cc
index 45765e72d688..7fabc25a5f8b 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -717,8 +717,23 @@ CompileExpr::visit (HIR::FieldAccessExpr &expr)
                                       nullptr, &field_index);
       rust_assert (ok);
 
-      tree indirect = indirect_expression (receiver_ref, expr.get_locus ());
-      receiver_ref = indirect;
+      // TODO this check is only used for CStr, test again when we support
+      // compilation of #[repr(transparent)] structs
+      if (RS_DST_FLAG_P (TREE_TYPE (receiver_ref)))
+       {
+         const TyTy::StructFieldType *field
+           = variant->get_field_at_index (field_index);
+         tree field_type
+           = TyTyResolveCompile::compile (ctx, field->get_field_type ());
+         translated = fold_build1_loc (expr.get_locus (), VIEW_CONVERT_EXPR,
+                                       field_type, receiver_ref);
+         return;
+       }
+      else
+       {
+         tree indirect = indirect_expression (receiver_ref, expr.get_locus ());
+         receiver_ref = indirect;
+       }
     }
 
   translated = Backend::struct_field_expression (receiver_ref, field_index,

Reply via email to