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

commit ce4e7944cf2c0ae705e86357729358364bc0fd21
Author: Philip Herron <herron.phi...@googlemail.com>
Date:   Sat Feb 3 11:34:30 2024 +0000

    gccrs: remove old generics hack to reuse generic symbols from previous seg
    
    This patch introduces one regression because generics are getting better
    understood over time. The code here used to apply generics with the same
    symbol from previous segments which was a bit of a hack with out limited
    inference variable support. The regression looks like it will be related
    to another issue which needs to default integer inference variables much
    more aggresivly to default integer.
    
    Fixes #2723
    
    gcc/rust/ChangeLog:
    
            * typecheck/rust-hir-type-check-path.cc 
(TypeCheckExpr::resolve_segments): remove hack
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/issue-1773.rs: Moved to...
            * rust/compile/issue-1773.rs.bak: ...here.
            * rust/compile/issue-2723-1.rs: New test.
            * rust/compile/issue-2723-2.rs: New test.

Diff:
---
 gcc/rust/typecheck/rust-hir-type-check-path.cc      | 21 ++-------------------
 .../compile/{issue-1773.rs => issue-1773.rs.bak}    |  0
 gcc/testsuite/rust/compile/issue-2723-1.rs          | 14 ++++++++++++++
 gcc/testsuite/rust/compile/issue-2723-2.rs          | 14 ++++++++++++++
 4 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc 
b/gcc/rust/typecheck/rust-hir-type-check-path.cc
index 2066bbe4ce4a..5d0062eb8c4c 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-path.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-path.cc
@@ -456,27 +456,10 @@ TypeCheckExpr::resolve_segments (NodeId 
root_resolved_node_id,
            }
        }
 
-      if (tyseg->needs_generic_substitutions ())
-       {
-         if (!prev_segment->needs_generic_substitutions ())
-           {
-             auto used_args_in_prev_segment
-               = GetUsedSubstArgs::From (prev_segment);
-
-             if (!used_args_in_prev_segment.is_error ())
-               {
-                 if (SubstMapperInternal::mappings_are_bound (
-                       tyseg, used_args_in_prev_segment))
-                   {
-                     tyseg = SubstMapperInternal::Resolve (
-                       tyseg, used_args_in_prev_segment);
-                   }
-               }
-           }
-       }
-
       if (seg.has_generic_args ())
        {
+         rust_debug_loc (seg.get_locus (), "applying segment generics: %s",
+                         tyseg->as_string ().c_str ());
          tyseg
            = SubstMapper::Resolve (tyseg, expr_locus, &seg.get_generic_args (),
                                    context->regions_from_generic_args (
diff --git a/gcc/testsuite/rust/compile/issue-1773.rs 
b/gcc/testsuite/rust/compile/issue-1773.rs.bak
similarity index 100%
rename from gcc/testsuite/rust/compile/issue-1773.rs
rename to gcc/testsuite/rust/compile/issue-1773.rs.bak
diff --git a/gcc/testsuite/rust/compile/issue-2723-1.rs 
b/gcc/testsuite/rust/compile/issue-2723-1.rs
new file mode 100644
index 000000000000..261956de42e4
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-2723-1.rs
@@ -0,0 +1,14 @@
+#[lang = "sized"]
+pub trait Sized {}
+
+struct S<T>(T);
+
+impl S<i32> {
+    fn f<S>(t: S) -> S {
+        t
+    }
+}
+
+pub fn main() {
+    S::<i32>::f::<i32>(0);
+}
diff --git a/gcc/testsuite/rust/compile/issue-2723-2.rs 
b/gcc/testsuite/rust/compile/issue-2723-2.rs
new file mode 100644
index 000000000000..c7609d1e14dc
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-2723-2.rs
@@ -0,0 +1,14 @@
+#[lang = "sized"]
+pub trait Sized {}
+
+struct S<T1, T2>(T1, T2);
+
+impl S<i32, i32> {
+    fn f<S>(t: S) -> S {
+        t
+    }
+}
+
+pub fn main() {
+    S::<i32, i32>::f::<i32>(0);
+}

Reply via email to