Skip to content

Commit

Permalink
Merge #7815
Browse files Browse the repository at this point in the history
7815: hir_ty: use default type generic for box expressions r=cynecx a=cynecx

r? @flodiebold

Fixes #6837 according to #6837 (comment).

Co-authored-by: cynecx <[email protected]>
  • Loading branch information
bors[bot] and cynecx authored Feb 28, 2021
2 parents 23d7dbf + 2cdd1ff commit 72457d0
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 0 deletions.
6 changes: 6 additions & 0 deletions crates/hir_ty/src/infer/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,12 @@ impl<'a> InferenceContext<'a> {
if let Some(box_) = self.resolve_boxed_box() {
let mut sb = Substs::builder(generics(self.db.upcast(), box_.into()).len());
sb = sb.push(inner_ty);
match self.db.generic_defaults(box_.into()).as_ref() {
[_, alloc_ty, ..] if !alloc_ty.value.is_unknown() => {
sb = sb.push(alloc_ty.value.clone());
}
_ => (),
}
sb = sb.fill(repeat_with(|| self.table.new_type_var()));
Ty::Adt(box_, sb.build())
} else {
Expand Down
55 changes: 55 additions & 0 deletions crates/hir_ty/src/tests/simple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2491,3 +2491,58 @@ fn inner_use_enum_rename() {
"#]],
)
}

#[test]
fn box_into_vec() {
check_infer(
r#"
#[lang = "sized"]
pub trait Sized {}
#[lang = "unsize"]
pub trait Unsize<T: ?Sized> {}
#[lang = "coerce_unsized"]
pub trait CoerceUnsized<T> {}
pub unsafe trait Allocator {}
pub struct Global;
unsafe impl Allocator for Global {}
#[lang = "owned_box"]
#[fundamental]
pub struct Box<T: ?Sized, A: Allocator = Global>;
impl<T: ?Sized + Unsize<U>, U: ?Sized, A: Allocator> CoerceUnsized<Box<U, A>> for Box<T, A> {}
pub struct Vec<T, A: Allocator = Global> {}
#[lang = "slice"]
impl<T> [T] {}
#[lang = "slice_alloc"]
impl<T> [T] {
pub fn into_vec<A: Allocator>(self: Box<Self, A>) -> Vec<T, A> {
unimplemented!()
}
}
fn test() {
let vec = <[_]>::into_vec(box [1i32]);
}
"#,
expect![[r#"
569..573 'self': Box<[T], A>
602..634 '{ ... }': Vec<T, A>
612..628 'unimpl...ted!()': Vec<T, A>
648..694 '{ ...2]); }': ()
658..661 'vec': Vec<i32, Global>
664..679 '<[_]>::into_vec': fn into_vec<i32, Global>(Box<[i32], Global>) -> Vec<i32, Global>
664..691 '<[_]>:...1i32])': Vec<i32, Global>
680..690 'box [1i32]': Box<[i32; _], Global>
684..690 '[1i32]': [i32; _]
685..689 '1i32': i32
"#]],
)
}

0 comments on commit 72457d0

Please sign in to comment.