[gcc/devel/rust/master] tychk: resolve lang item type paths properly

Thomas Schwinge tschwinge@gcc.gnu.org
Wed Mar 26 14:05:09 GMT 2025


https://gcc.gnu.org/g:e7011f62930b662426ceb53a4cc40a64268163b4

commit e7011f62930b662426ceb53a4cc40a64268163b4
Author: Arthur Cohen <arthur.cohen@embecosm.com>
Date:   Thu Jan 2 10:37:00 2025 +0000

    tychk: resolve lang item type paths properly
    
    gcc/rust/ChangeLog:
    
            * typecheck/rust-hir-type-check-type.cc (TypeCheckType::resolve_root_path): Adapt
            code to handle lang item type paths.

Diff:
---
 gcc/rust/typecheck/rust-hir-type-check-type.cc | 26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc b/gcc/rust/typecheck/rust-hir-type-check-type.cc
index 7e623e045468..e367c1b70ed8 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc
@@ -379,6 +379,7 @@ TypeCheckType::resolve_root_path (HIR::TypePath &path, size_t *offset,
 {
   TyTy::BaseType *root_tyty = nullptr;
   *offset = 0;
+
   for (size_t i = 0; i < path.get_num_segments (); i++)
     {
       std::unique_ptr<HIR::TypePathSegment> &seg = path.get_segments ().at (i);
@@ -390,18 +391,25 @@ TypeCheckType::resolve_root_path (HIR::TypePath &path, size_t *offset,
       // then lookup the reference_node_id
       NodeId ref_node_id = UNKNOWN_NODEID;
 
-      // FIXME: HACK: ARTHUR: Remove this
-      if (flag_name_resolution_2_0)
+      if (seg->is_lang_item ())
+	ref_node_id = Analysis::Mappings::get ().get_lang_item_node (
+	  seg->get_lang_item ());
+      else
 	{
-	  auto nr_ctx
-	    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+	  // FIXME: HACK: ARTHUR: Remove this
+	  if (flag_name_resolution_2_0)
+	    {
+	      auto nr_ctx = Resolver2_0::ImmutableNameResolutionContext::get ()
+			      .resolver ();
 
-	  // assign the ref_node_id if we've found something
-	  nr_ctx.lookup (path.get_mappings ().get_nodeid ())
-	    .map ([&ref_node_id] (NodeId resolved) { ref_node_id = resolved; });
+	      // assign the ref_node_id if we've found something
+	      nr_ctx.lookup (path.get_mappings ().get_nodeid ())
+		.map (
+		  [&ref_node_id] (NodeId resolved) { ref_node_id = resolved; });
+	    }
+	  else if (!resolver->lookup_resolved_name (ast_node_id, &ref_node_id))
+	    resolver->lookup_resolved_type (ast_node_id, &ref_node_id);
 	}
-      else if (!resolver->lookup_resolved_name (ast_node_id, &ref_node_id))
-	resolver->lookup_resolved_type (ast_node_id, &ref_node_id);
 
       // ref_node_id is the NodeId that the segments refers to.
       if (ref_node_id == UNKNOWN_NODEID)


More information about the Gcc-cvs mailing list