]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: nr2.0: Improve handling of single segment paths
authorOwen Avery <powerboat9.gamer@gmail.com>
Sat, 29 Mar 2025 23:50:28 +0000 (19:50 -0400)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 5 Aug 2025 14:36:45 +0000 (16:36 +0200)
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.gamer@gmail.com>
gcc/rust/resolve/rust-forever-stack.hxx
gcc/testsuite/rust/compile/nr2/exclude

index df3df1059fcbb991e51d908ee5935732776793b2..8721386a2402723b864ac72ef8143a9df9c6f1d7 100644 (file)
@@ -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;
     }
 
index c02805fd2271719216fcd5060a85aa7f3cc75b18..31d7a26be4e3d4e71c58a9334581eb1a746603b8 100644 (file)
@@ -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