Skip to content

Commit 4083cae

Browse files
powerboat9philberty
authored andcommitted
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 <[email protected]>
1 parent 61238e4 commit 4083cae

File tree

3 files changed

+34
-6
lines changed

3 files changed

+34
-6
lines changed

gcc/rust/resolve/rust-default-resolver.cc

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,33 @@ DefaultResolver::visit (AST::IfLetExpr &expr)
113113
void
114114
DefaultResolver::visit (AST::Trait &trait)
115115
{
116-
auto inner_fn_1
117-
= [this, &trait] () { AST::DefaultASTVisitor::visit (trait); };
116+
visit_outer_attrs (trait);
117+
visit (trait.get_visibility ());
118+
visit_inner_attrs (trait);
119+
120+
auto inner_fn_1 = [this, &trait] () {
121+
for (auto &item : trait.get_trait_items ())
122+
visit (item);
123+
};
118124

119125
auto inner_fn_2 = [this, &trait, &inner_fn_1] () {
126+
visit (trait.get_implicit_self ());
127+
for (auto &generic : trait.get_generic_params ())
128+
visit (generic);
129+
if (trait.has_where_clause ())
130+
visit (trait.get_where_clause ());
131+
for (auto &bound : trait.get_type_param_bounds ())
132+
visit (bound);
133+
134+
ctx.scoped (Rib::Kind::TraitOrImpl, trait.get_node_id (), inner_fn_1);
135+
};
136+
137+
auto inner_fn_3 = [this, &trait, &inner_fn_2] () {
120138
ctx.canonical_ctx.scope (trait.get_node_id (), trait.get_identifier (),
121-
std::move (inner_fn_1));
139+
std::move (inner_fn_2));
122140
};
123141

124-
ctx.scoped (Rib::Kind::TraitOrImpl, trait.get_node_id (), inner_fn_2,
142+
ctx.scoped (Rib::Kind::Generics, trait.get_node_id (), inner_fn_3,
125143
trait.get_identifier () /* FIXME: Is that valid?*/);
126144
}
127145

gcc/rust/resolve/rust-forever-stack.hxx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,10 @@ ForeverStack<N>::get (Node &start, const Identifier &name)
297297

298298
// TODO: Can we improve the API? have `reverse_iter` return an optional?
299299
reverse_iter (start, [&resolved_definition, &name] (Node &current) {
300+
// we can't reference associated types/functions like this
301+
if (current.rib.kind == Rib::Kind::TraitOrImpl)
302+
return KeepGoing::Yes;
303+
300304
auto candidate = current.rib.get (name.as_string ());
301305

302306
return candidate.map_or (
@@ -549,6 +553,14 @@ ForeverStack<N>::resolve_segments (
549553
bool searched_prelude = false;
550554
while (true)
551555
{
556+
if (is_start (iterator, segments)
557+
&& current_node->rib.kind == Rib::Kind::TraitOrImpl)
558+
{
559+
// we can't reference associated types/functions like this
560+
current_node = &current_node->parent.value ();
561+
continue;
562+
}
563+
552564
// may set the value of child
553565
for (auto &kv : current_node->children)
554566
{

gcc/testsuite/rust/compile/nr2/exclude

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
issue-3315-2.rs
22
torture/alt_patterns1.rs
3-
torture/name_resolve1.rs
4-
issue-3652.rs
53
issue-1487.rs
64
issue-2015.rs
75
issue-3454.rs

0 commit comments

Comments
 (0)