aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/resolve/rust-forever-stack.hxx
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2025-01-22 20:12:46 -0500
committerArthur Cohen <arthur.cohen@embecosm.com>2025-03-24 13:07:03 +0100
commitbbf31f8f5a6da20090ae2a5126854e0cf96b9253 (patch)
tree89e05ffad2b9f47b7f64bfc1762c4d25b8baa66b /gcc/rust/resolve/rust-forever-stack.hxx
parentd9a21c1875110711159cc435124493849343532a (diff)
downloadgcc-bbf31f8f5a6da20090ae2a5126854e0cf96b9253.zip
gcc-bbf31f8f5a6da20090ae2a5126854e0cf96b9253.tar.gz
gcc-bbf31f8f5a6da20090ae2a5126854e0cf96b9253.tar.bz2
gccrs: nr2.0: Resolve instances of TypePath more accurately
gcc/rust/ChangeLog: * util/rust-unwrap-segment.cc: New file. * util/rust-unwrap-segment.h: New file. * Make-lang.in: Add rust-unwrap-segment.o to the object list. * resolve/rust-forever-stack.hxx: Include rust-unwrap-segment.h. (ForeverStack::find_starting_point): Use unwrap_type_segment. (ForeverStack::resolve_segments): Likewise. (ForeverStack::resolve_path): Likewise. * resolve/rust-late-name-resolver-2.0.cc (Late::visit): Resolve type paths using NameResolutionContext::resolve_path. * resolve/rust-name-resolution-context.h (NameResolutionContext::resolve_path): Use unwrap_segment_node_id. gcc/testsuite/ChangeLog: * rust/compile/nr2/exclude: Remove entries. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
Diffstat (limited to 'gcc/rust/resolve/rust-forever-stack.hxx')
-rw-r--r--gcc/rust/resolve/rust-forever-stack.hxx20
1 files changed, 12 insertions, 8 deletions
diff --git a/gcc/rust/resolve/rust-forever-stack.hxx b/gcc/rust/resolve/rust-forever-stack.hxx
index f5f0b15..b51da51 100644
--- a/gcc/rust/resolve/rust-forever-stack.hxx
+++ b/gcc/rust/resolve/rust-forever-stack.hxx
@@ -21,6 +21,7 @@
#include "rust-diagnostics.h"
#include "rust-forever-stack.h"
#include "rust-rib.h"
+#include "rust-unwrap-segment.h"
#include "optional.h"
namespace Rust {
@@ -389,7 +390,8 @@ ForeverStack<N>::find_starting_point (
for (; !is_last (iterator, segments); iterator++)
{
- auto &seg = *iterator;
+ auto &outer_seg = *iterator;
+ auto &seg = unwrap_type_segment (outer_seg);
auto is_self_or_crate
= seg.is_crate_path_seg () || seg.is_lower_self_seg ();
@@ -407,14 +409,14 @@ ForeverStack<N>::find_starting_point (
NodeId current_crate
= *mappings.crate_num_to_nodeid (mappings.get_current_crate ());
- insert_segment_resolution (seg, current_crate);
+ insert_segment_resolution (outer_seg, current_crate);
iterator++;
break;
}
if (seg.is_lower_self_seg ())
{
// insert segment resolution and exit
- insert_segment_resolution (seg, starting_point.get ().id);
+ insert_segment_resolution (outer_seg, starting_point.get ().id);
iterator++;
break;
}
@@ -430,7 +432,7 @@ ForeverStack<N>::find_starting_point (
starting_point
= find_closest_module (starting_point.get ().parent.value ());
- insert_segment_resolution (seg, starting_point.get ().id);
+ insert_segment_resolution (outer_seg, starting_point.get ().id);
continue;
}
@@ -454,7 +456,8 @@ ForeverStack<N>::resolve_segments (
auto *current_node = &starting_point;
for (; !is_last (iterator, segments); iterator++)
{
- auto &seg = *iterator;
+ auto &outer_seg = *iterator;
+ auto &seg = unwrap_type_segment (outer_seg);
auto str = seg.as_string ();
rust_debug ("[ARTHUR]: resolving segment part: %s", str.c_str ());
@@ -490,7 +493,7 @@ ForeverStack<N>::resolve_segments (
}
current_node = &child.value ();
- insert_segment_resolution (seg, current_node->id);
+ insert_segment_resolution (outer_seg, current_node->id);
}
return *current_node;
@@ -508,7 +511,7 @@ ForeverStack<N>::resolve_path (
// if there's only one segment, we just use `get`
if (segments.size () == 1)
{
- auto res = get (segments.back ().as_string ());
+ auto res = get (unwrap_type_segment (segments.back ()).as_string ());
if (res && !res->is_ambiguous ())
insert_segment_resolution (segments.back (), res->get_node_id ());
return res;
@@ -528,7 +531,8 @@ ForeverStack<N>::resolve_path (
// leave resolution within impl blocks to type checker
if (final_node.rib.kind == Rib::Kind::TraitOrImpl)
return tl::nullopt;
- auto res = final_node.rib.get (segments.back ().as_string ());
+ auto res = final_node.rib.get (
+ unwrap_type_segment (segments.back ()).as_string ());
if (res && !res->is_ambiguous ())
insert_segment_resolution (segments.back (), res->get_node_id ());
return res;