[gcc r15-8567] gccrs: nr1.0: Resolve lang item paths properly.

Arthur Cohen cohenarthur@gcc.gnu.org
Fri Mar 21 11:39:07 GMT 2025


https://gcc.gnu.org/g:70c87e94e11d97dc63d6ffa4862bd4f97c5f25ba

commit r15-8567-g70c87e94e11d97dc63d6ffa4862bd4f97c5f25ba
Author: Arthur Cohen <arthur.cohen@embecosm.com>
Date:   Wed Dec 4 15:14:45 2024 +0100

    gccrs: nr1.0: Resolve lang item paths properly.
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-ast-resolve-item.cc (ResolveItem::visit): Adapt resolver
            to lang item paths.
            * resolve/rust-ast-resolve-type.h: Likewise.

Diff:
---
 gcc/rust/resolve/rust-ast-resolve-item.cc | 30 +++++++++++++++++++++++-------
 gcc/rust/resolve/rust-ast-resolve-type.h  | 11 +++++++++--
 2 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/gcc/rust/resolve/rust-ast-resolve-item.cc b/gcc/rust/resolve/rust-ast-resolve-item.cc
index a330541b6828..33b4fc9b9792 100644
--- a/gcc/rust/resolve/rust-ast-resolve-item.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-item.cc
@@ -678,16 +678,32 @@ ResolveItem::visit (AST::TraitImpl &impl_block)
       return;
     }
 
+  bool ok = true;
+
   // setup paths
   CanonicalPath canonical_trait_type = CanonicalPath::create_empty ();
-  bool ok = ResolveTypeToCanonicalPath::go (impl_block.get_trait_path_type (),
-					    canonical_trait_type);
-  if (!ok)
+  if (impl_block.get_trait_path ().get_path_kind ()
+      == AST::Path::Kind::LangItem)
     {
-      resolver->get_name_scope ().pop ();
-      resolver->get_type_scope ().pop ();
-      resolver->get_label_scope ().pop ();
-      return;
+      auto &lang_item
+	= static_cast<AST::LangItemPath &> (impl_block.get_trait_path ());
+
+      canonical_trait_type
+	= CanonicalPath::new_seg (lang_item.get_node_id (),
+				  LangItem::ToString (
+				    lang_item.get_lang_item_kind ()));
+    }
+  else
+    {
+      ok = ResolveTypeToCanonicalPath::go (impl_block.get_trait_path_type (),
+					   canonical_trait_type);
+      if (!ok)
+	{
+	  resolver->get_name_scope ().pop ();
+	  resolver->get_type_scope ().pop ();
+	  resolver->get_label_scope ().pop ();
+	  return;
+	}
     }
 
   rust_debug ("AST::TraitImpl resolve trait type: {%s}",
diff --git a/gcc/rust/resolve/rust-ast-resolve-type.h b/gcc/rust/resolve/rust-ast-resolve-type.h
index ed055a1f04ea..7c3831a28294 100644
--- a/gcc/rust/resolve/rust-ast-resolve-type.h
+++ b/gcc/rust/resolve/rust-ast-resolve-type.h
@@ -21,8 +21,10 @@
 
 #include "rust-ast-resolve-base.h"
 #include "rust-ast-resolve-expr.h"
+#include "rust-diagnostics.h"
 #include "rust-hir-map.h"
 #include "rust-path.h"
+#include "util/rust-hir-map.h"
 
 namespace Rust {
 namespace Resolver {
@@ -69,9 +71,14 @@ public:
       {
 	auto &type = static_cast<AST::LangItemPath &> (type_path);
 
-	Analysis::Mappings::get_lang_item (type);
+	rust_debug ("[ARTHUR]: lang item kind: %s",
+		    LangItem::ToString (type.get_lang_item_kind ()).c_str ());
 
-	type.get_node_id ();
+	auto lang_item = Analysis::Mappings::get ()
+			   .lookup_lang_item_node (type.get_lang_item_kind ())
+			   .value ();
+
+	return lang_item;
       }
 
     rust_assert (type_path.get_path_kind () == AST::Path::Kind::Type);


More information about the Gcc-cvs mailing list