https://gcc.gnu.org/g:d812c793ef14bcfbb5ab7aa6e8c3837f8e817beb
commit d812c793ef14bcfbb5ab7aa6e8c3837f8e817beb Author: Arthur Cohen <arthur.co...@embecosm.com> Date: Wed Dec 4 15:14:45 2024 +0100 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 49c0e6f4e49e..619efb00ac41 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 47c4e35a0a54..e9451d3a1028 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);