aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <herron.philip@googlemail.com>2024-02-03 11:34:30 +0000
committerPhilip Herron <philip.herron@embecosm.com>2024-02-04 00:21:21 +0000
commitce4e7944cf2c0ae705e86357729358364bc0fd21 (patch)
treefd3919cb757df6eb71b0c53823d5fe51f3db57c6
parentd6c97f6d03845b018f855bc310493269f0b50eb5 (diff)
downloadgcc-ce4e7944cf2c0ae705e86357729358364bc0fd21.zip
gcc-ce4e7944cf2c0ae705e86357729358364bc0fd21.tar.gz
gcc-ce4e7944cf2c0ae705e86357729358364bc0fd21.tar.bz2
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.
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-path.cc21
-rw-r--r--gcc/testsuite/rust/compile/issue-1773.rs.bak (renamed from gcc/testsuite/rust/compile/issue-1773.rs)0
-rw-r--r--gcc/testsuite/rust/compile/issue-2723-1.rs14
-rw-r--r--gcc/testsuite/rust/compile/issue-2723-2.rs14
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 2066bbe..5d0062e 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
index a4542aea0..a4542aea0 100644
--- a/gcc/testsuite/rust/compile/issue-1773.rs
+++ b/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 0000000..261956d
--- /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 0000000..c7609d1
--- /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);
+}