Properly substitute inherent associated types.
This commit is contained in:
parent
cab4fd678c
commit
8a7ae23f75
2 changed files with 24 additions and 4 deletions
|
@ -347,7 +347,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
assert!(self_ty.is_some());
|
assert!(self_ty.is_some());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
assert!(self_ty.is_none() && parent_substs.is_empty());
|
assert!(self_ty.is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
let arg_count = Self::check_generic_arg_count(
|
let arg_count = Self::check_generic_arg_count(
|
||||||
|
@ -1821,7 +1821,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
|
|
||||||
// Check if we have an enum variant.
|
// Check if we have an enum variant.
|
||||||
let mut variant_resolution = None;
|
let mut variant_resolution = None;
|
||||||
if let ty::Adt(adt_def, _) = qself_ty.kind() {
|
if let ty::Adt(adt_def, adt_substs) = qself_ty.kind() {
|
||||||
if adt_def.is_enum() {
|
if adt_def.is_enum() {
|
||||||
let variant_def = adt_def
|
let variant_def = adt_def
|
||||||
.variants()
|
.variants()
|
||||||
|
@ -1923,8 +1923,13 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
let Some(assoc_ty_did) = self.lookup_assoc_ty(assoc_ident, hir_ref_id, span, impl_) else {
|
let Some(assoc_ty_did) = self.lookup_assoc_ty(assoc_ident, hir_ref_id, span, impl_) else {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
// FIXME(inherent_associated_types): This does not substitute parameters.
|
let item_substs = self.create_substs_for_associated_item(
|
||||||
let ty = tcx.type_of(assoc_ty_did);
|
span,
|
||||||
|
assoc_ty_did,
|
||||||
|
assoc_segment,
|
||||||
|
adt_substs,
|
||||||
|
);
|
||||||
|
let ty = tcx.bound_type_of(assoc_ty_did).subst(tcx, item_substs);
|
||||||
return Ok((ty, DefKind::AssocTy, assoc_ty_did));
|
return Ok((ty, DefKind::AssocTy, assoc_ty_did));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
15
src/test/ui/associated-inherent-types/struct-generics.rs
Normal file
15
src/test/ui/associated-inherent-types/struct-generics.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// check-pass
|
||||||
|
|
||||||
|
#![feature(inherent_associated_types)]
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
|
||||||
|
struct S<T>(T);
|
||||||
|
|
||||||
|
impl<T> S<T> {
|
||||||
|
type P = T;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
type A = S<()>::P;
|
||||||
|
let _: A = ();
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue