From: Philip Herron <herron.phi...@googlemail.com>

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.
---
 .../typecheck/rust-hir-type-check-path.cc     | 21 ++-----------------
 .../{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(-)
 rename gcc/testsuite/rust/compile/{issue-1773.rs => issue-1773.rs.bak} (100%)
 create mode 100644 gcc/testsuite/rust/compile/issue-2723-1.rs
 create mode 100644 gcc/testsuite/rust/compile/issue-2723-2.rs

diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc 
b/gcc/rust/typecheck/rust-hir-type-check-path.cc
index ea7d8422980..ad31fb74a80 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 00000000000..261956de42e
--- /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 00000000000..c7609d1e14d
--- /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);
+}
-- 
2.42.1

Reply via email to