mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 17:24:06 +00:00
fix: resolve alias before resolve variant
This commit is contained in:
parent
cfc959d73a
commit
bd61888b8d
@ -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 {
|
||||
|
@ -1154,6 +1154,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(
|
||||
|
Loading…
Reference in New Issue
Block a user