about summary refs log tree commit diff
diff options
context:
space:
mode:
authoraustaras <austaras@outlook.com>2023-12-18 22:31:58 +0800
committeraustaras <austaras@outlook.com>2023-12-18 22:31:58 +0800
commitbd61888b8db35965cca9ff46119615cbc73448a0 (patch)
tree13d043e8de3685743a9a63c3bb474e4d5a718565
parentcfc959d73a9259f0eb3b1813df7e9db8108945b7 (diff)
downloadrust-bd61888b8db35965cca9ff46119615cbc73448a0.tar.gz
rust-bd61888b8db35965cca9ff46119615cbc73448a0.zip
fix: resolve alias before resolve variant
-rw-r--r--crates/hir-ty/src/infer.rs6
-rw-r--r--crates/hir-ty/src/tests/patterns.rs34
2 files changed, 40 insertions, 0 deletions
diff --git a/crates/hir-ty/src/infer.rs b/crates/hir-ty/src/infer.rs
index 6f724e45874..e295dd8d4e1 100644
--- a/crates/hir-ty/src/infer.rs
+++ b/crates/hir-ty/src/infer.rs
@@ -1200,6 +1200,12 @@ impl<'a> InferenceContext<'a> {
         path: &ModPath,
     ) -> (Ty, Option<VariantId>) {
         let remaining = unresolved.map(|it| path.segments()[it..].len()).filter(|it| it > &0);
+        let ty = match ty.kind(Interner) {
+            TyKind::Alias(AliasTy::Projection(proj_ty)) => {
+                self.db.normalize_projection(proj_ty.clone(), self.table.trait_env.clone())
+            }
+            _ => ty,
+        };
         match remaining {
             None => {
                 let variant = ty.as_adt().and_then(|(adt_id, _)| match adt_id {
diff --git a/crates/hir-ty/src/tests/patterns.rs b/crates/hir-ty/src/tests/patterns.rs
index 7234af2d683..548f782f4f2 100644
--- a/crates/hir-ty/src/tests/patterns.rs
+++ b/crates/hir-ty/src/tests/patterns.rs
@@ -1155,6 +1155,40 @@ fn main() {
 }
 
 #[test]
+fn generic_alias_with_qualified_path() {
+    check_types(
+        r#"
+type Wrap<T> = T;
+
+struct S;
+
+trait Schematic {
+    type Props;
+}
+
+impl Schematic for S {
+    type Props = X;
+}
+
+enum X {
+    A { cool: u32, stuff: u32 },
+    B,
+}
+
+fn main() {
+    let wrapped = Wrap::<<S as Schematic>::Props>::A {
+        cool: 100,
+        stuff: 100,
+    };
+
+    if let Wrap::<<S as Schematic>::Props>::A { cool, ..} = &wrapped {}
+                                              //^^^^ &u32
+}
+"#,
+    );
+}
+
+#[test]
 fn type_mismatch_pat_const_reference() {
     check_no_mismatches(
         r#"