Skip to content

Commit db11825

Browse files
powerboat9CohenArthur
authored andcommitted
nr2.0: Handle "Self" properly in trait definitions
gcc/rust/ChangeLog: * ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Visit implicit Self parameters of traits. * resolve/rust-late-name-resolver-2.0.cc (Late::visit): Resolve implicit Self parameters of traits. * resolve/rust-late-name-resolver-2.0.h: (Late::visit): Add trait visitor. * resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::visit): Insert resolutions for Self type parameters as well. gcc/testsuite/ChangeLog: * rust/compile/nr2/exclude: Remove entries. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
1 parent 198d3ee commit db11825

File tree

5 files changed

+18
-7
lines changed

5 files changed

+18
-7
lines changed

gcc/rust/ast/rust-ast-visitor.cc

+2
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,8 @@ DefaultASTVisitor::visit (AST::Trait &trait)
997997

998998
visit_inner_attrs (trait);
999999

1000+
visit (trait.get_implicit_self ());
1001+
10001002
for (auto &generic : trait.get_generic_params ())
10011003
visit (generic);
10021004

gcc/rust/resolve/rust-late-name-resolver-2.0.cc

+13
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,19 @@ Late::visit (AST::TypePath &type)
288288
DefaultResolver::visit (type);
289289
}
290290

291+
void
292+
Late::visit (AST::Trait &trait)
293+
{
294+
// kind of weird how this is done
295+
// names are resolved to the node id of trait.get_implicit_self ()
296+
// which is then resolved to the node id of trait
297+
// we set up the latter mapping here
298+
ctx.map_usage (Usage (trait.get_implicit_self ().get_node_id ()),
299+
Definition (trait.get_node_id ()));
300+
301+
DefaultResolver::visit (trait);
302+
}
303+
291304
void
292305
Late::visit (AST::StructStruct &s)
293306
{

gcc/rust/resolve/rust-late-name-resolver-2.0.h

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class Late : public DefaultResolver
4848
void visit (AST::PathInExpression &) override;
4949
void visit (AST::LangItemPath &) override;
5050
void visit (AST::TypePath &) override;
51+
void visit (AST::Trait &) override;
5152
void visit (AST::StructExprStruct &) override;
5253
void visit (AST::StructExprStructBase &) override;
5354
void visit (AST::StructExprStructFields &) override;

gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc

+2-5
Original file line numberDiff line numberDiff line change
@@ -280,11 +280,8 @@ TopLevel::visit (AST::StructStruct &struct_item)
280280
void
281281
TopLevel::visit (AST::TypeParam &type_param)
282282
{
283-
// Hacky and weird, find a better solution
284-
// We should probably not even insert self in the first place ?
285-
if (type_param.get_type_representation ().as_string () != "Self")
286-
insert_or_error_out (type_param.get_type_representation (), type_param,
287-
Namespace::Types);
283+
insert_or_error_out (type_param.get_type_representation (), type_param,
284+
Namespace::Types);
288285
}
289286

290287
void

gcc/testsuite/rust/compile/nr2/exclude

-2
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ issue-2190-2.rs
7979
issue-2238.rs
8080
issue-2304.rs
8181
issue-2330.rs
82-
issue-2375.rs
8382
issue-2478.rs
8483
issue-2479.rs
8584
issue-2723-1.rs
@@ -182,7 +181,6 @@ issue-2987.rs
182181
issue-3045-1.rs
183182
issue-3045-2.rs
184183
issue-3046.rs
185-
unknown-associated-item.rs
186184
issue-3030.rs
187185
issue-3035.rs
188186
issue-3139-1.rs

0 commit comments

Comments
 (0)