[COMMITTED 13/25] gccrs: remove old generics hack to reuse generic symbols from previous seg

arthur.cohen@embecosm.com arthur.cohen@embecosm.com
Wed Feb 7 11:43:59 GMT 2024


From: Philip Herron <herron.philip@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



More information about the Gcc-rust mailing list