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 ¤t) { + // 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 = ¤t_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