Skip to content

Commit

Permalink
Fix CanonicalPath for inherent impl
Browse files Browse the repository at this point in the history
gcc/rust/ChangeLog:

	* util/rust-canonical-path.h: Add new segment kind for inherent impl.
	* resolve/rust-ast-resolve-item.cc (ResolveItem::visit): Use it.
	* resolve/rust-ast-resolve-toplevel.h: Use it.

Signed-off-by: Raiki Tamura <tamaron1203@gmail.com>
  • Loading branch information
tamaroning committed Sep 21, 2023
1 parent 612a48a commit a5e4652
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 3 deletions.
5 changes: 4 additions & 1 deletion gcc/rust/resolve/rust-ast-resolve-item.cc
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,7 @@ ResolveItem::visit (AST::InherentImpl &impl_block)

// FIXME this needs to be protected behind nominal type-checks see:
// rustc --explain E0118
// issue #2634
ResolveType::go (impl_block.get_type ().get ());

// Setup paths
Expand All @@ -576,7 +577,9 @@ ResolveItem::visit (AST::InherentImpl &impl_block)
self_cpath.get ().c_str ());

CanonicalPath impl_type = self_cpath;
CanonicalPath impl_prefix = prefix.append (impl_type);
CanonicalPath impl_type_seg
= CanonicalPath::inherent_impl_seg (impl_block.get_node_id (), impl_type);
CanonicalPath impl_prefix = prefix.append (impl_type_seg);

// see https://godbolt.org/z/a3vMbsT6W
CanonicalPath cpath = CanonicalPath::create_empty ();
Expand Down
8 changes: 6 additions & 2 deletions gcc/rust/resolve/rust-ast-resolve-toplevel.h
Original file line number Diff line number Diff line change
Expand Up @@ -344,10 +344,14 @@ class ResolveTopLevel : public ResolverBase
void visit (AST::InherentImpl &impl_block) override
{
std::string raw_impl_type_path = impl_block.get_type ()->as_string ();
CanonicalPath impl_type
CanonicalPath impl_type_seg
= CanonicalPath::new_seg (impl_block.get_type ()->get_node_id (),
raw_impl_type_path);
CanonicalPath impl_prefix = prefix.append (impl_type);

CanonicalPath impl_type = CanonicalPath::inherent_impl_seg (
impl_block.get_type ()->get_node_id (), impl_type_seg);
rust_debug ("<%s>", impl_type_seg.get ().c_str ());
CanonicalPath impl_prefix = prefix.append (impl_type_seg);

for (auto &impl_item : impl_block.get_impl_items ())
ResolveToplevelImplItem::go (impl_item.get (), impl_prefix);
Expand Down
6 changes: 6 additions & 0 deletions gcc/rust/util/rust-canonical-path.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,12 @@ class CanonicalPath
+ trait_seg.get () + ">");
}

static CanonicalPath inherent_impl_seg (NodeId id,
const CanonicalPath &impl_type_seg)
{
return CanonicalPath::new_seg (id, "<" + impl_type_seg.get () + ">");
}

std::string get () const
{
std::string buf;
Expand Down

0 comments on commit a5e4652

Please sign in to comment.