https://gcc.gnu.org/g:046992d0531511b28d70a6afb373a1bd2f4cf4c3

commit r16-2902-g046992d0531511b28d70a6afb373a1bd2f4cf4c3
Author: Owen Avery <powerboat9.ga...@gmail.com>
Date:   Mon Jun 16 17:05:09 2025 -0400

    gccrs: nr2.0: Adjust resolution of external crates
    
    This ensures Session::load_extern_crate doesn't try to use the old name
    resolver when nr2.0 is enabled, while also ensuring that nr2.0 handles
    external crates.
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-default-resolver.cc
            (DefaultResolver::visit_extern_crate): New function.
            (DefaultResolver::visit): New visitor function for ExternCrate.
            * resolve/rust-default-resolver.h
            (DefaultResolver::visit_extern_crate): New function.
            (DefaultResolver::visit): New visitor function for ExternCrate.
            * resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::visit):
            Adjust ExternCrate visitor and rename to...
            (TopLevel::visit_extern_crate): ...here.
            * resolve/rust-toplevel-name-resolver-2.0.h (TopLevel::visit):
            Remove ExternCrate visitor override.
            (TopLevel::visit_extern_crate): New function.
            * rust-session-manager.cc (Session::load_extern_crate): Only run
            name resolution 1.0 if name resolution 2.0 is disabled.
    
    Signed-off-by: Owen Avery <powerboat9.ga...@gmail.com>

Diff:
---
 gcc/rust/resolve/rust-default-resolver.cc          | 41 ++++++++++++++
 gcc/rust/resolve/rust-default-resolver.h           |  3 +
 .../resolve/rust-toplevel-name-resolver-2.0.cc     | 66 ++++++++--------------
 gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h |  2 +-
 gcc/rust/rust-session-manager.cc                   |  9 ++-
 5 files changed, 74 insertions(+), 47 deletions(-)

diff --git a/gcc/rust/resolve/rust-default-resolver.cc 
b/gcc/rust/resolve/rust-default-resolver.cc
index cdd41e37b782..588caa4e6f0c 100644
--- a/gcc/rust/resolve/rust-default-resolver.cc
+++ b/gcc/rust/resolve/rust-default-resolver.cc
@@ -394,5 +394,46 @@ DefaultResolver::visit (AST::TypeParam &param)
   ctx.scoped (Rib::Kind::ForwardTypeParamBan, param.get_node_id (), expr_vis);
 }
 
+void
+DefaultResolver::visit_extern_crate (AST::ExternCrate &extern_crate,
+                                    AST::Crate &crate, CrateNum num)
+{
+  visit (crate);
+}
+
+void
+DefaultResolver::visit (AST::ExternCrate &crate)
+{
+  auto &mappings = Analysis::Mappings::get ();
+  auto num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ());
+
+  if (!num_opt)
+    {
+      rust_error_at (crate.get_locus (), "unknown crate %qs",
+                    crate.get_referenced_crate ().c_str ());
+      return;
+    }
+
+  CrateNum num = *num_opt;
+
+  AST::Crate &referenced_crate = mappings.get_ast_crate (num);
+
+  auto sub_visitor_1
+    = [&, this] () { visit_extern_crate (crate, referenced_crate, num); };
+
+  auto sub_visitor_2 = [&] () {
+    ctx.canonical_ctx.scope_crate (referenced_crate.get_node_id (),
+                                  crate.get_referenced_crate (),
+                                  std::move (sub_visitor_1));
+  };
+
+  if (crate.has_as_clause ())
+    ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
+               sub_visitor_2, crate.get_as_clause ());
+  else
+    ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
+               sub_visitor_2, crate.get_referenced_crate ());
+}
+
 } // namespace Resolver2_0
 } // namespace Rust
diff --git a/gcc/rust/resolve/rust-default-resolver.h 
b/gcc/rust/resolve/rust-default-resolver.h
index 99fd8e77a48d..3fa037911075 100644
--- a/gcc/rust/resolve/rust-default-resolver.h
+++ b/gcc/rust/resolve/rust-default-resolver.h
@@ -58,6 +58,9 @@ public:
 
   void visit (AST::TypeParam &) override;
 
+  virtual void visit_extern_crate (AST::ExternCrate &, AST::Crate &, CrateNum);
+  void visit (AST::ExternCrate &) override;
+
   // type dec nodes, which visit their fields or variants by default
   void visit (AST::StructStruct &) override;
   void visit (AST::TupleStruct &) override;
diff --git a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc 
b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
index 3e5ed534e4e6..8ec31c0351ff 100644
--- a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
@@ -173,19 +173,10 @@ insert_macros (std::vector<PROC_MACRO> &macros, 
NameResolutionContext &ctx)
 }
 
 void
-TopLevel::visit (AST::ExternCrate &crate)
+TopLevel::visit_extern_crate (AST::ExternCrate &extern_crate, AST::Crate 
&crate,
+                             CrateNum num)
 {
   auto &mappings = Analysis::Mappings::get ();
-  auto num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ());
-
-  if (!num_opt)
-    {
-      rust_error_at (crate.get_locus (), "unknown crate %qs",
-                    crate.get_referenced_crate ().c_str ());
-      return;
-    }
-
-  CrateNum num = *num_opt;
 
   auto attribute_macros = mappings.lookup_attribute_proc_macros (num);
 
@@ -193,40 +184,27 @@ TopLevel::visit (AST::ExternCrate &crate)
 
   auto derive_macros = mappings.lookup_derive_proc_macros (num);
 
-  auto sub_visitor_1 = [&] () {
-    // TODO: Find a way to keep this part clean without the double dispatch.
-    if (derive_macros.has_value ())
-      {
-       insert_macros (derive_macros.value (), ctx);
-       for (auto &macro : derive_macros.value ())
-         mappings.insert_derive_proc_macro_def (macro);
-      }
-    if (attribute_macros.has_value ())
-      {
-       insert_macros (attribute_macros.value (), ctx);
-       for (auto &macro : attribute_macros.value ())
-         mappings.insert_attribute_proc_macro_def (macro);
-      }
-    if (bang_macros.has_value ())
-      {
-       insert_macros (bang_macros.value (), ctx);
-       for (auto &macro : bang_macros.value ())
-         mappings.insert_bang_proc_macro_def (macro);
-      }
-  };
-
-  auto sub_visitor_2 = [&] () {
-    ctx.canonical_ctx.scope_crate (crate.get_node_id (),
-                                  crate.get_referenced_crate (),
-                                  std::move (sub_visitor_1));
-  };
+  // TODO: Find a way to keep this part clean without the double dispatch.
+  if (derive_macros.has_value ())
+    {
+      insert_macros (derive_macros.value (), ctx);
+      for (auto &macro : derive_macros.value ())
+       mappings.insert_derive_proc_macro_def (macro);
+    }
+  if (attribute_macros.has_value ())
+    {
+      insert_macros (attribute_macros.value (), ctx);
+      for (auto &macro : attribute_macros.value ())
+       mappings.insert_attribute_proc_macro_def (macro);
+    }
+  if (bang_macros.has_value ())
+    {
+      insert_macros (bang_macros.value (), ctx);
+      for (auto &macro : bang_macros.value ())
+       mappings.insert_bang_proc_macro_def (macro);
+    }
 
-  if (crate.has_as_clause ())
-    ctx.scoped (Rib::Kind::Module, crate.get_node_id (), sub_visitor_2,
-               crate.get_as_clause ());
-  else
-    ctx.scoped (Rib::Kind::Module, crate.get_node_id (), sub_visitor_2,
-               crate.get_referenced_crate ());
+  visit (crate);
 }
 
 static bool
diff --git a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h 
b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h
index 0dfd654861b3..8d3da92961ad 100644
--- a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h
+++ b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h
@@ -176,7 +176,7 @@ private:
   void visit (AST::Union &union_item) override;
   void visit (AST::ConstantItem &const_item) override;
   void visit (AST::TypeAlias &type_item) override;
-  void visit (AST::ExternCrate &crate) override;
+  void visit_extern_crate (AST::ExternCrate &, AST::Crate &, CrateNum) 
override;
   void visit (AST::TypeParam &type_param) override;
   void visit (AST::ConstGenericParam &const_param) override;
 
diff --git a/gcc/rust/rust-session-manager.cc b/gcc/rust/rust-session-manager.cc
index dbb3b47b8627..3252fcdcc6c0 100644
--- a/gcc/rust/rust-session-manager.cc
+++ b/gcc/rust/rust-session-manager.cc
@@ -1189,8 +1189,13 @@ Session::load_extern_crate (const std::string 
&crate_name, location_t locus)
   mappings.insert_bang_proc_macros (crate_num, bang_macros);
   mappings.insert_derive_proc_macros (crate_num, derive_macros);
 
-  // name resolve it
-  Resolver::NameResolution::Resolve (parsed_crate);
+  // if flag_name_resolution_2_0 is enabled
+  // then we perform resolution later
+  if (!flag_name_resolution_2_0)
+    {
+      // name resolve it
+      Resolver::NameResolution::Resolve (parsed_crate);
+    }
 
   // always restore the crate_num
   mappings.set_current_crate (saved_crate_num);

Reply via email to