From 4686e63c4e840417f2522fabb5611701eee92eca Mon Sep 17 00:00:00 2001 From: Philip Herron Date: Fri, 1 Nov 2024 16:18:28 +0000 Subject: [PATCH] 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 --- .../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(-) create mode 100644 gcc/testsuite/rust/compile/issue-3009.rs 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() -> Foo { + // { dg-warning "associated function is never used" "" { target *-*-* } .-1 } + Foo { t: 14 } + } +} + +trait Bar { + fn bar() -> Foo; +} + +impl Bar for T { + fn bar() -> Foo { + Foo::of::() + } +} 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