https://gcc.gnu.org/g:f75b10f848c973e2b3bbcd720b4c7dfbdafaf9a1

commit r16-2843-gf75b10f848c973e2b3bbcd720b4c7dfbdafaf9a1
Author: Owen Avery <powerboat9.ga...@gmail.com>
Date:   Sat Mar 29 19:50:28 2025 -0400

    gccrs: nr2.0: Improve handling of single segment paths
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-forever-stack.hxx (ForeverStack::resolve_path):
            Handle single segment paths "crate", "self", and "super".
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/nr2/exclude: Remove entries.
    
    Signed-off-by: Owen Avery <powerboat9.ga...@gmail.com>

Diff:
---
 gcc/rust/resolve/rust-forever-stack.hxx | 50 +++++++++++++++++++++++++++------
 gcc/testsuite/rust/compile/nr2/exclude  |  2 --
 2 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/gcc/rust/resolve/rust-forever-stack.hxx 
b/gcc/rust/resolve/rust-forever-stack.hxx
index df3df1059fcb..8721386a2402 100644
--- a/gcc/rust/resolve/rust-forever-stack.hxx
+++ b/gcc/rust/resolve/rust-forever-stack.hxx
@@ -656,27 +656,61 @@ ForeverStack<N>::resolve_path (
   // if there's only one segment, we just use `get`
   if (segments.size () == 1)
     {
-      auto &seg = segments.front ();
-      if (auto lang_item = unwrap_segment_get_lang_item (seg))
+      auto &outer_seg = segments.front ();
+      if (auto lang_item = unwrap_segment_get_lang_item (outer_seg))
        {
          NodeId seg_id = Analysis::Mappings::get ().get_lang_item_node (
            lang_item.value ());
 
-         insert_segment_resolution (seg, seg_id);
+         insert_segment_resolution (outer_seg, seg_id);
          // TODO: does NonShadowable matter?
          return Rib::Definition::NonShadowable (seg_id);
        }
 
+      auto &seg = unwrap_type_segment (outer_seg);
+
       tl::optional<Rib::Definition> res
-       = get (starting_point.get (),
-              unwrap_type_segment (segments.back ()).as_string ());
+       = get (starting_point.get (), seg.as_string ());
 
       if (!res)
-       res = get_lang_prelude (
-         unwrap_type_segment (segments.back ()).as_string ());
+       res = get_lang_prelude (seg.as_string ());
+
+      if (!res && N == Namespace::Types)
+       {
+         if (seg.is_crate_path_seg ())
+           {
+             insert_segment_resolution (outer_seg, root.id);
+             // TODO: does NonShadowable matter?
+             return Rib::Definition::NonShadowable (root.id);
+           }
+         else if (seg.is_lower_self_seg ())
+           {
+             NodeId id = find_closest_module (starting_point.get ()).id;
+             insert_segment_resolution (outer_seg, id);
+             // TODO: does NonShadowable matter?
+             return Rib::Definition::NonShadowable (id);
+           }
+         else if (seg.is_super_path_seg ())
+           {
+             Node &closest_module
+               = find_closest_module (starting_point.get ());
+             if (closest_module.is_root ())
+               {
+                 rust_error_at (seg.get_locus (), ErrorCode::E0433,
+                                "too many leading %<super%> keywords");
+                 return tl::nullopt;
+               }
+
+             NodeId id
+               = find_closest_module (closest_module.parent.value ()).id;
+             insert_segment_resolution (outer_seg, id);
+             // TODO: does NonShadowable matter?
+             return Rib::Definition::NonShadowable (id);
+           }
+       }
 
       if (res && !res->is_ambiguous ())
-       insert_segment_resolution (segments.back (), res->get_node_id ());
+       insert_segment_resolution (outer_seg, res->get_node_id ());
       return res;
     }
 
diff --git a/gcc/testsuite/rust/compile/nr2/exclude 
b/gcc/testsuite/rust/compile/nr2/exclude
index c02805fd2271..31d7a26be4e3 100644
--- a/gcc/testsuite/rust/compile/nr2/exclude
+++ b/gcc/testsuite/rust/compile/nr2/exclude
@@ -1,6 +1,4 @@
 issue-3315-2.rs
-privacy8.rs
-issue-2905-2.rs
 torture/alt_patterns1.rs
 torture/name_resolve1.rs
 issue-3652.rs

Reply via email to