https://gcc.gnu.org/g:48d28a58010d2e5115f76375078b867d59bf826b

commit r16-2873-g48d28a58010d2e5115f76375078b867d59bf826b
Author: Owen Avery <powerboat9.ga...@gmail.com>
Date:   Fri May 9 14:37:55 2025 -0400

    gccrs: nr2.0: Adjust lookup of associated items
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-default-resolver.cc (DefaultResolver::visit):
            Adjust scoping of trait definitions and their generic
            parameters.
            * resolve/rust-forever-stack.hxx (ForeverStack::get): Prevent
            lookups inside TraitOrImpl ribs.
            (ForeverStack::resolve_segments): Prevent lookups of the first
            segment inside TraitOrImpl ribs.
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/nr2/exclude: Remove entries.
    
    Signed-off-by: Owen Avery <powerboat9.ga...@gmail.com>

Diff:
---
 gcc/rust/resolve/rust-default-resolver.cc | 26 ++++++++++++++++++++++----
 gcc/rust/resolve/rust-forever-stack.hxx   | 12 ++++++++++++
 gcc/testsuite/rust/compile/nr2/exclude    |  2 --
 3 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/gcc/rust/resolve/rust-default-resolver.cc 
b/gcc/rust/resolve/rust-default-resolver.cc
index 01906cf0a32d..5f5dd09ca6f1 100644
--- a/gcc/rust/resolve/rust-default-resolver.cc
+++ b/gcc/rust/resolve/rust-default-resolver.cc
@@ -113,15 +113,33 @@ DefaultResolver::visit (AST::IfLetExpr &expr)
 void
 DefaultResolver::visit (AST::Trait &trait)
 {
-  auto inner_fn_1
-    = [this, &trait] () { AST::DefaultASTVisitor::visit (trait); };
+  visit_outer_attrs (trait);
+  visit (trait.get_visibility ());
+  visit_inner_attrs (trait);
+
+  auto inner_fn_1 = [this, &trait] () {
+    for (auto &item : trait.get_trait_items ())
+      visit (item);
+  };
 
   auto inner_fn_2 = [this, &trait, &inner_fn_1] () {
+    visit (trait.get_implicit_self ());
+    for (auto &generic : trait.get_generic_params ())
+      visit (generic);
+    if (trait.has_where_clause ())
+      visit (trait.get_where_clause ());
+    for (auto &bound : trait.get_type_param_bounds ())
+      visit (bound);
+
+    ctx.scoped (Rib::Kind::TraitOrImpl, trait.get_node_id (), inner_fn_1);
+  };
+
+  auto inner_fn_3 = [this, &trait, &inner_fn_2] () {
     ctx.canonical_ctx.scope (trait.get_node_id (), trait.get_identifier (),
-                            std::move (inner_fn_1));
+                            std::move (inner_fn_2));
   };
 
-  ctx.scoped (Rib::Kind::TraitOrImpl, trait.get_node_id (), inner_fn_2,
+  ctx.scoped (Rib::Kind::Generics, trait.get_node_id (), inner_fn_3,
              trait.get_identifier () /* FIXME: Is that valid?*/);
 }
 
diff --git a/gcc/rust/resolve/rust-forever-stack.hxx 
b/gcc/rust/resolve/rust-forever-stack.hxx
index 8721386a2402..582e53b16022 100644
--- a/gcc/rust/resolve/rust-forever-stack.hxx
+++ b/gcc/rust/resolve/rust-forever-stack.hxx
@@ -297,6 +297,10 @@ ForeverStack<N>::get (Node &start, const Identifier &name)
 
   // TODO: Can we improve the API? have `reverse_iter` return an optional?
   reverse_iter (start, [&resolved_definition, &name] (Node &current) {
+    // we can't reference associated types/functions like this
+    if (current.rib.kind == Rib::Kind::TraitOrImpl)
+      return KeepGoing::Yes;
+
     auto candidate = current.rib.get (name.as_string ());
 
     return candidate.map_or (
@@ -549,6 +553,14 @@ ForeverStack<N>::resolve_segments (
       bool searched_prelude = false;
       while (true)
        {
+         if (is_start (iterator, segments)
+             && current_node->rib.kind == Rib::Kind::TraitOrImpl)
+           {
+             // we can't reference associated types/functions like this
+             current_node = &current_node->parent.value ();
+             continue;
+           }
+
          // may set the value of child
          for (auto &kv : current_node->children)
            {
diff --git a/gcc/testsuite/rust/compile/nr2/exclude 
b/gcc/testsuite/rust/compile/nr2/exclude
index 31d7a26be4e3..58a20146091f 100644
--- a/gcc/testsuite/rust/compile/nr2/exclude
+++ b/gcc/testsuite/rust/compile/nr2/exclude
@@ -1,7 +1,5 @@
 issue-3315-2.rs
 torture/alt_patterns1.rs
-torture/name_resolve1.rs
-issue-3652.rs
 issue-1487.rs
 issue-2015.rs
 issue-3454.rs

Reply via email to