From: Philip Herron <herron.phi...@googlemail.com> We do not need to inject inference variables on generic patterns with generic blocks. This will just cause unconstrained inference variables as they may not unify against something.
Fixes Rust-GCC#2323 gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::resolve_root_path): dont infer here gcc/testsuite/ChangeLog: * rust/compile/nr2/exclude: nr2 cant handle this * rust/compile/issue-2323.rs: New test. Signed-off-by: Philip Herron <herron.phi...@googlemail.com> --- gcc/rust/typecheck/rust-hir-type-check-path.cc | 3 ++- gcc/testsuite/rust/compile/issue-2323.rs | 9 +++++++++ gcc/testsuite/rust/compile/nr2/exclude | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/rust/compile/issue-2323.rs diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc b/gcc/rust/typecheck/rust-hir-type-check-path.cc index 231ddd604db..7b934b38eb3 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-path.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-path.cc @@ -245,6 +245,7 @@ TypeCheckExpr::resolve_root_path (HIR::PathInExpression &expr, size_t *offset, auto seg_is_module = mappings.lookup_module (ref).has_value (); auto seg_is_crate = mappings.is_local_hirid_crate (ref); + auto seg_is_pattern = mappings.lookup_hir_pattern (ref).has_value (); if (seg_is_module || seg_is_crate) { // A::B::C::this_is_a_module::D::E::F @@ -321,7 +322,7 @@ TypeCheckExpr::resolve_root_path (HIR::PathInExpression &expr, size_t *offset, if (lookup->get_kind () == TyTy::TypeKind::ERROR) return new TyTy::ErrorType (expr.get_mappings ().get_hirid ()); } - else if (lookup->needs_generic_substitutions ()) + else if (lookup->needs_generic_substitutions () && !seg_is_pattern) { lookup = SubstMapper::InferSubst (lookup, expr.get_locus ()); } diff --git a/gcc/testsuite/rust/compile/issue-2323.rs b/gcc/testsuite/rust/compile/issue-2323.rs new file mode 100644 index 00000000000..02a3f90b4d8 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-2323.rs @@ -0,0 +1,9 @@ +#[lang = "sized"] +trait Sized {} + +pub struct S<T>(T); + +pub fn foo<T>(x: T) { + let y = S(x); + y.0; +} diff --git a/gcc/testsuite/rust/compile/nr2/exclude b/gcc/testsuite/rust/compile/nr2/exclude index 4ba27d31f88..eaa2a1e0d0b 100644 --- a/gcc/testsuite/rust/compile/nr2/exclude +++ b/gcc/testsuite/rust/compile/nr2/exclude @@ -222,4 +222,5 @@ if_let_expr_simple.rs iflet.rs issue-3033.rs issue-3009.rs +issue-2323.rs # please don't delete the trailing newline -- 2.45.2