From: Philip Herron <herron.phi...@googlemail.com>

This has been a pet peeve of mine for a while because the gimple never
emitted the struct () name properly it was always empty which for record
types they always require a real locus or they dont get a proper name.

gcc/rust/ChangeLog:

        * backend/rust-compile-base.cc (HIRCompileBase::unit_expression): pass 
ctx
        * backend/rust-compile-base.h: cant be static
        * backend/rust-compile-intrinsic.cc (try_handler_inner): pass ctx
        * backend/rust-compile-type.cc
        (TyTyResolveCompile::get_unit_type): update to grab the first locus
        (TyTyResolveCompile::visit): pass ctx
        * backend/rust-compile-type.h: likewise

Signed-off-by: Philip Herron <herron.phi...@googlemail.com>
---
 gcc/rust/backend/rust-compile-base.cc      |  2 +-
 gcc/rust/backend/rust-compile-base.h       |  2 +-
 gcc/rust/backend/rust-compile-intrinsic.cc |  2 +-
 gcc/rust/backend/rust-compile-type.cc      | 17 +++++++++++++----
 gcc/rust/backend/rust-compile-type.h       |  2 +-
 5 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/gcc/rust/backend/rust-compile-base.cc 
b/gcc/rust/backend/rust-compile-base.cc
index b47711364e5..fdbca7f1558 100644
--- a/gcc/rust/backend/rust-compile-base.cc
+++ b/gcc/rust/backend/rust-compile-base.cc
@@ -1023,7 +1023,7 @@ HIRCompileBase::resolve_method_address (TyTy::FnType 
*fntype,
 tree
 HIRCompileBase::unit_expression (location_t locus)
 {
-  tree unit_type = TyTyResolveCompile::get_unit_type ();
+  tree unit_type = TyTyResolveCompile::get_unit_type (ctx);
   return Backend::constructor_expression (unit_type, false, {}, -1, locus);
 }
 
diff --git a/gcc/rust/backend/rust-compile-base.h 
b/gcc/rust/backend/rust-compile-base.h
index 109c8530321..4b4f8b09256 100644
--- a/gcc/rust/backend/rust-compile-base.h
+++ b/gcc/rust/backend/rust-compile-base.h
@@ -110,7 +110,7 @@ protected:
                         const Resolver::CanonicalPath &canonical_path,
                         TyTy::FnType *fntype);
 
-  static tree unit_expression (location_t locus);
+  tree unit_expression (location_t locus);
 
   void setup_fndecl (tree fndecl, bool is_main_entry_point, bool is_generic_fn,
                     HIR::Visibility &visibility,
diff --git a/gcc/rust/backend/rust-compile-intrinsic.cc 
b/gcc/rust/backend/rust-compile-intrinsic.cc
index fb0c66101fa..4888e23ed1e 100644
--- a/gcc/rust/backend/rust-compile-intrinsic.cc
+++ b/gcc/rust/backend/rust-compile-intrinsic.cc
@@ -1322,7 +1322,7 @@ try_handler_inner (Context *ctx, TyTy::FnType *fntype, 
bool is_new_api)
 
   if (is_new_api)
     {
-      auto ret_type = TyTyResolveCompile::get_unit_type ();
+      auto ret_type = TyTyResolveCompile::get_unit_type (ctx);
       auto ret_expr = Backend::constructor_expression (ret_type, false, {}, -1,
                                                       UNDEF_LOCATION);
       normal_return_stmt
diff --git a/gcc/rust/backend/rust-compile-type.cc 
b/gcc/rust/backend/rust-compile-type.cc
index 73548011cd0..813e11c47cf 100644
--- a/gcc/rust/backend/rust-compile-type.cc
+++ b/gcc/rust/backend/rust-compile-type.cc
@@ -81,13 +81,22 @@ TyTyResolveCompile::get_implicit_enumeral_node_type 
(TyTy::BaseType *repr)
 }
 
 tree
-TyTyResolveCompile::get_unit_type ()
+TyTyResolveCompile::get_unit_type (Context *ctx)
 {
   static tree unit_type;
   if (unit_type == nullptr)
     {
+      auto cn = ctx->get_mappings ().get_current_crate ();
+      auto &c = ctx->get_mappings ().get_ast_crate (cn);
+      location_t locus = BUILTINS_LOCATION;
+      if (c.items.size () > 0)
+       {
+         auto &item = c.items[0];
+         locus = item->get_locus ();
+       }
+
       auto unit_type_node = Backend::struct_type ({});
-      unit_type = Backend::named_type ("()", unit_type_node, 
BUILTINS_LOCATION);
+      unit_type = Backend::named_type ("()", unit_type_node, locus);
     }
   return unit_type;
 }
@@ -421,7 +430,7 @@ TyTyResolveCompile::visit (const TyTy::TupleType &type)
 {
   if (type.num_fields () == 0)
     {
-      translated = get_unit_type ();
+      translated = get_unit_type (ctx);
       return;
     }
 
@@ -724,7 +733,7 @@ TyTyResolveCompile::visit (const TyTy::StrType &type)
 void
 TyTyResolveCompile::visit (const TyTy::NeverType &)
 {
-  translated = get_unit_type ();
+  translated = get_unit_type (ctx);
 }
 
 void
diff --git a/gcc/rust/backend/rust-compile-type.h 
b/gcc/rust/backend/rust-compile-type.h
index bc611cfbc73..7ebc4a63192 100644
--- a/gcc/rust/backend/rust-compile-type.h
+++ b/gcc/rust/backend/rust-compile-type.h
@@ -30,7 +30,7 @@ public:
   static tree compile (Context *ctx, const TyTy::BaseType *ty,
                       bool trait_object_mode = false);
 
-  static tree get_unit_type ();
+  static tree get_unit_type (Context *ctx);
 
   void visit (const TyTy::InferType &) override;
   void visit (const TyTy::ADTType &) override;
-- 
2.49.0

Reply via email to