]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: nr2.0: Adjust lookup of associated items
authorOwen Avery <powerboat9.gamer@gmail.com>
Fri, 9 May 2025 18:37:55 +0000 (14:37 -0400)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 5 Aug 2025 14:36:49 +0000 (16:36 +0200)
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.gamer@gmail.com>
gcc/rust/resolve/rust-default-resolver.cc
gcc/rust/resolve/rust-forever-stack.hxx
gcc/testsuite/rust/compile/nr2/exclude

index 01906cf0a32dab57cf3eb0417a05464c3f79a9a7..5f5dd09ca6f1cc4a50d60fe9d3e84f0f97cb3899 100644 (file)
@@ -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?*/);
 }
 
index 8721386a2402723b864ac72ef8143a9df9c6f1d7..582e53b1602220b307aaccc7852a97be2c417a34 100644 (file)
@@ -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)
            {
index 31d7a26be4e3d4e71c58a9334581eb1a746603b8..58a20146091f1a05a2018c8179e3319dcc21fa80 100644 (file)
@@ -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