diff --git a/crates/ra_hir_ty/src/infer/path.rs b/crates/ra_hir_ty/src/infer/path.rs
index 1ad0d839716..80d7ed10ec3 100644
--- a/crates/ra_hir_ty/src/infer/path.rs
+++ b/crates/ra_hir_ty/src/infer/path.rs
@@ -81,7 +81,7 @@ impl<'a> InferenceContext<'a> {
                 let generics = crate::utils::generics(self.db.upcast(), impl_id.into());
                 let substs = Substs::type_params_for_generics(&generics);
                 let ty = self.db.impl_self_ty(impl_id).subst(&substs);
-                if let Some((AdtId::StructId(struct_id), _)) = ty.as_adt() {
+                if let Some((AdtId::StructId(struct_id), substs)) = ty.as_adt() {
                     let ty = self.db.value_ty(struct_id.into()).subst(&substs);
                     return Some(ty);
                 } else {
diff --git a/crates/ra_hir_ty/src/tests/regression.rs b/crates/ra_hir_ty/src/tests/regression.rs
index 1f004bd6301..ed43df48476 100644
--- a/crates/ra_hir_ty/src/tests/regression.rs
+++ b/crates/ra_hir_ty/src/tests/regression.rs
@@ -633,3 +633,35 @@ where
     "###
     );
 }
+
+#[test]
+fn issue_4953() {
+    assert_snapshot!(
+        infer(r#"
+pub struct Foo(pub i64);
+impl Foo {
+    fn test() -> Self { Self(0i64) }
+}
+"#),
+        @r###"
+    59..73 '{ Self(0i64) }': Foo
+    61..65 'Self': Foo(i64) -> Foo
+    61..71 'Self(0i64)': Foo
+    66..70 '0i64': i64
+    "###
+    );
+    assert_snapshot!(
+        infer(r#"
+pub struct Foo<T>(pub T);
+impl Foo<i64> {
+    fn test() -> Self { Self(0i64) }
+}
+"#),
+        @r###"
+    65..79 '{ Self(0i64) }': Foo<i64>
+    67..71 'Self': Foo<i64>(i64) -> Foo<i64>
+    67..77 'Self(0i64)': Foo<i64>
+    72..76 '0i64': i64
+    "###
+    );
+}