From: Arthur Cohen <arthur.co...@embecosm.com>

gcc/rust/ChangeLog:

        * resolve/rust-ast-resolve-item.cc (ResolveItem::visit): Adapt resolver
        to lang item paths.
        * resolve/rust-ast-resolve-type.h: Likewise.
---
 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 a330541b682..33b4fc9b979 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 ed055a1f04e..7c3831a2829 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);
-- 
2.45.2

Reply via email to