diff --git a/crates/ra_hir_ty/src/lower.rs b/crates/ra_hir_ty/src/lower.rs index af3db2e1d7c..2c2ecee9cc6 100644 --- a/crates/ra_hir_ty/src/lower.rs +++ b/crates/ra_hir_ty/src/lower.rs @@ -331,7 +331,7 @@ pub(super) fn substs_from_path_segment( if let Some(generic_args) = &segment.args_and_bindings { // if args are provided, it should be all of them, but we can't rely on that let self_param_correction = if add_self_param { 1 } else { 0 }; - let child_len = child_len + self_param_correction; + let child_len = child_len - self_param_correction; for arg in generic_args.args.iter().take(child_len) { match arg { GenericArg::Type(type_ref) => { diff --git a/crates/ra_hir_ty/src/tests/regression.rs b/crates/ra_hir_ty/src/tests/regression.rs index 8b3aa856424..13c5f62e407 100644 --- a/crates/ra_hir_ty/src/tests/regression.rs +++ b/crates/ra_hir_ty/src/tests/regression.rs @@ -365,3 +365,20 @@ fn end() { "### ) } + +#[test] +fn issue_2705() { + assert_snapshot!( + infer(r#" +trait Trait {} +fn test() { + >::foo() +} +"#), + @r###" + [26; 53) '{ ...oo() }': () + [32; 49) '::foo': {unknown} + [32; 51) '