https://gcc.gnu.org/g:4686e63c4e840417f2522fabb5611701eee92eca

commit 4686e63c4e840417f2522fabb5611701eee92eca
Author: Philip Herron <herron.phi...@googlemail.com>
Date:   Fri Nov 1 16:18:28 2024 +0000

    gccrs: fix bad type inferencing on path's
    
    This catch to inject inference variables into generic paths was a
    catch all 'hack' that we needed before we handled generics correctly
    as we do now.
    
    Fixes #3009
    
    gcc/rust/ChangeLog:
    
            * typecheck/rust-hir-type-check-path.cc 
(TypeCheckExpr::resolve_segments): remove hack
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/nr2/exclude: nr2 cant handle this
            * rust/compile/issue-3009.rs: New test.
    
    Signed-off-by: Philip Herron <herron.phi...@googlemail.com>

Diff:
---
 gcc/rust/typecheck/rust-hir-type-check-path.cc |  8 --------
 gcc/testsuite/rust/compile/issue-3009.rs       | 24 ++++++++++++++++++++++++
 gcc/testsuite/rust/compile/nr2/exclude         |  1 +
 3 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc 
b/gcc/rust/typecheck/rust-hir-type-check-path.cc
index d2962e6c2f19..ddf2abcb7402 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-path.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-path.cc
@@ -490,14 +490,6 @@ TypeCheckExpr::resolve_segments (NodeId 
root_resolved_node_id,
     }
 
   rust_assert (resolved_node_id != UNKNOWN_NODEID);
-  if (tyseg->needs_generic_substitutions () && !reciever_is_generic)
-    {
-      location_t locus = segments.back ().get_locus ();
-      tyseg = SubstMapper::InferSubst (tyseg, locus);
-      if (tyseg->get_kind () == TyTy::TypeKind::ERROR)
-       return;
-    }
-
   context->insert_receiver (expr_mappings.get_hirid (), prev_segment);
 
   // name scope first
diff --git a/gcc/testsuite/rust/compile/issue-3009.rs 
b/gcc/testsuite/rust/compile/issue-3009.rs
new file mode 100644
index 000000000000..2eb4ef39abdc
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3009.rs
@@ -0,0 +1,24 @@
+#[lang = "sized"]
+trait Sized {}
+
+struct Foo {
+    // { dg-warning "struct is never constructed" "" { target *-*-* } .-1 }
+    t: u64,
+}
+
+impl Foo {
+    fn of<T>() -> Foo {
+        // { dg-warning "associated function is never used" "" { target *-*-* 
} .-1 }
+        Foo { t: 14 }
+    }
+}
+
+trait Bar {
+    fn bar() -> Foo;
+}
+
+impl<T> Bar for T {
+    fn bar() -> Foo {
+        Foo::of::<T>()
+    }
+}
diff --git a/gcc/testsuite/rust/compile/nr2/exclude 
b/gcc/testsuite/rust/compile/nr2/exclude
index ceada8bc51a6..4ba27d31f88b 100644
--- a/gcc/testsuite/rust/compile/nr2/exclude
+++ b/gcc/testsuite/rust/compile/nr2/exclude
@@ -221,4 +221,5 @@ issue-3032-2.rs
 if_let_expr_simple.rs
 iflet.rs
 issue-3033.rs
+issue-3009.rs
 # please don't delete the trailing newline

Reply via email to