]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
nr2.0: Handle lang item type path segments
authorOwen Avery <powerboat9.gamer@gmail.com>
Sun, 9 Feb 2025 08:02:58 +0000 (03:02 -0500)
committerCohenArthur <arthur.cohen@embecosm.com>
Tue, 25 Feb 2025 15:30:19 +0000 (15:30 +0000)
gcc/rust/ChangeLog:

* resolve/rust-forever-stack.hxx
(ForeverStack::find_starting_point): Stop when hitting a lang
item segment.
(ForeverStack::resolve_segments): Resolve lang item segments.
(ForeverStacl::resolve_path): Handle single segment lang item
paths and add comment.
* util/rust-unwrap-segment.cc
(unwrap_segment_get_lang_item): Add.
* util/rust-unwrap-segment.h
(unwrap_segment_get_lang_item): Add.

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/rust/util/rust-unwrap-segment.cc
gcc/rust/util/rust-unwrap-segment.h
gcc/testsuite/rust/compile/nr2/exclude

index 5dd341397ef44bae3972eb61db1cf2648c66ab5a..65dd02aa84d81fa0dcd9ec852d0ddfe51faa10ae 100644 (file)
@@ -384,6 +384,10 @@ ForeverStack<N>::find_starting_point (
   for (; !is_last (iterator, segments); iterator++)
     {
       auto &outer_seg = *iterator;
+
+      if (unwrap_segment_get_lang_item (outer_seg).has_value ())
+       break;
+
       auto &seg = unwrap_type_segment (outer_seg);
       auto is_self_or_crate
        = seg.is_crate_path_seg () || seg.is_lower_self_seg ();
@@ -452,6 +456,17 @@ ForeverStack<N>::resolve_segments (
   for (; !is_last (iterator, segments); iterator++)
     {
       auto &outer_seg = *iterator;
+
+      if (auto lang_item = unwrap_segment_get_lang_item (outer_seg))
+       {
+         NodeId seg_id = Analysis::Mappings::get ().get_lang_item_node (
+           lang_item.value ());
+         current_node = &dfs_node (root, seg_id).value ();
+
+         insert_segment_resolution (outer_seg, seg_id);
+         continue;
+       }
+
       auto &seg = unwrap_type_segment (outer_seg);
       auto str = seg.as_string ();
       rust_debug ("[ARTHUR]: resolving segment part: %s", str.c_str ());
@@ -538,6 +553,17 @@ 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))
+       {
+         NodeId seg_id = Analysis::Mappings::get ().get_lang_item_node (
+           lang_item.value ());
+
+         insert_segment_resolution (seg, seg_id);
+         // TODO: does NonShadowable matter?
+         return Rib::Definition::NonShadowable (seg_id);
+       }
+
       auto res = get (unwrap_type_segment (segments.back ()).as_string ());
       if (res && !res->is_ambiguous ())
        insert_segment_resolution (segments.back (), res->get_node_id ());
@@ -558,6 +584,7 @@ ForeverStack<N>::resolve_path (
       // leave resolution within impl blocks to type checker
       if (final_node.rib.kind == Rib::Kind::TraitOrImpl)
        return tl::nullopt;
+      // assuming this can't be a lang item segment
       auto res = final_node.rib.get (
        unwrap_type_segment (segments.back ()).as_string ());
       if (res && !res->is_ambiguous ())
index 38ff273fc0646464777bd5da957eca317b3547d5..083a0e54c91b6415613143beba08d40ae8920481 100644 (file)
@@ -38,4 +38,24 @@ unwrap_segment_node_id (const AST::PathExprSegment &seg)
   return seg.get_node_id ();
 }
 
+tl::optional<LangItem::Kind>
+unwrap_segment_get_lang_item (const AST::TypePathSegment &seg)
+{
+  if (seg.is_lang_item ())
+    return seg.get_lang_item ();
+  return tl::nullopt;
+}
+
+tl::optional<LangItem::Kind>
+unwrap_segment_get_lang_item (const AST::SimplePathSegment &seg)
+{
+  return tl::nullopt;
+}
+
+tl::optional<LangItem::Kind>
+unwrap_segment_get_lang_item (const AST::PathExprSegment &seg)
+{
+  return tl::nullopt;
+}
+
 } // namespace Rust
index 4a3838a407a2c95a7cc0c59c695f54669d2ce9a5..bebdc3aadd4df86bb98a97eedbeb6a5c6b214869 100644 (file)
@@ -99,4 +99,23 @@ unwrap_segment_node_id (const std::unique_ptr<T> &ptr)
   return unwrap_segment_node_id (*ptr);
 }
 
+/**
+ * Used to check if a path segment is associated with a lang item
+ */
+tl::optional<LangItem::Kind>
+unwrap_segment_get_lang_item (const AST::TypePathSegment &seg);
+
+tl::optional<LangItem::Kind>
+unwrap_segment_get_lang_item (const AST::SimplePathSegment &seg);
+
+tl::optional<LangItem::Kind>
+unwrap_segment_get_lang_item (const AST::PathExprSegment &seg);
+
+template <class T>
+tl::optional<LangItem::Kind>
+unwrap_segment_get_lang_item (const std::unique_ptr<T> &ptr)
+{
+  return unwrap_segment_get_lang_item (*ptr);
+}
+
 } // namespace Rust
index f74c2ac6c66260ad84c6be34fb73785151400b5b..6dba0f71705eb1f2a0b611524fa4744de14de68c 100644 (file)
@@ -4,7 +4,6 @@ cfg1.rs
 complex-path1.rs
 const_generics_3.rs
 const_generics_4.rs
-derive_macro1.rs
 feature_rust_attri0.rs
 generics9.rs
 issue-1483.rs
@@ -55,9 +54,6 @@ issue-266.rs
 derive_clone_enum1.rs
 derive_clone_enum2.rs
 derive_clone_enum3.rs
-derive_macro4.rs
-derive_macro6.rs
-issue-2987.rs
 issue-3139-1.rs
 issue-3139-3.rs
 derive-debug1.rs
@@ -67,6 +63,5 @@ for-loop1.rs
 for-loop2.rs
 issue-3403.rs
 derive-eq-invalid.rs
-derive-partialeq1.rs
 derive-hash1.rs
 # please don't delete the trailing newline