Skip to content

Commit d7fb8f1

Browse files
authored
Merge pull request rust-lang#19122 from Austaras/master
pass struct fields to chalk
2 parents 123f17c + 8f8e1c6 commit d7fb8f1

File tree

3 files changed

+37
-20
lines changed

3 files changed

+37
-20
lines changed

src/tools/rust-analyzer/crates/hir-ty/src/chalk_db.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -768,23 +768,21 @@ pub(crate) fn adt_datum_query(
768768
phantom_data,
769769
};
770770

771-
// this slows down rust-analyzer by quite a bit unfortunately, so enabling this is currently not worth it
772-
let _variant_id_to_fields = |id: VariantId| {
771+
let variant_id_to_fields = |id: VariantId| {
773772
let variant_data = &id.variant_data(db.upcast());
774-
let fields = if variant_data.fields().is_empty() {
773+
let fields = if variant_data.fields().is_empty() || bound_vars_subst.is_empty(Interner) {
775774
vec![]
776775
} else {
777-
let field_types = db.field_types(id);
778-
variant_data
779-
.fields()
780-
.iter()
781-
.map(|(idx, _)| field_types[idx].clone().substitute(Interner, &bound_vars_subst))
782-
.filter(|it| !it.contains_unknown())
783-
.collect()
776+
// HACK: provide full struct type info slows down rust-analyzer by quite a bit unfortunately,
777+
// so we trick chalk into thinking that our struct impl Unsize
778+
if let Some(ty) = bound_vars_subst.at(Interner, 0).ty(Interner) {
779+
vec![ty.clone()]
780+
} else {
781+
vec![]
782+
}
784783
};
785784
rust_ir::AdtVariantDatum { fields }
786785
};
787-
let variant_id_to_fields = |_: VariantId| rust_ir::AdtVariantDatum { fields: vec![] };
788786

789787
let (kind, variants) = match adt_id {
790788
hir_def::AdtId::StructId(id) => {

src/tools/rust-analyzer/crates/hir-ty/src/tests/coercion.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -535,17 +535,15 @@ fn test() {
535535

536536
#[test]
537537
fn coerce_unsize_generic() {
538-
check(
538+
check_no_mismatches(
539539
r#"
540540
//- minicore: coerce_unsized
541541
struct Foo<T> { t: T };
542542
struct Bar<T>(Foo<T>);
543543
544544
fn test() {
545545
let _: &Foo<[usize]> = &Foo { t: [1, 2, 3] };
546-
//^^^^^^^^^^^^^^^^^^^^^ expected &'? Foo<[usize]>, got &'? Foo<[i32; 3]>
547546
let _: &Bar<[usize]> = &Bar(Foo { t: [1, 2, 3] });
548-
//^^^^^^^^^^^^^^^^^^^^^^^^^^ expected &'? Bar<[usize]>, got &'? Bar<[i32; 3]>
549547
}
550548
"#,
551549
);
@@ -957,3 +955,24 @@ fn f() {
957955
"#,
958956
);
959957
}
958+
959+
#[test]
960+
fn coerce_nested_unsized_struct() {
961+
check_types(
962+
r#"
963+
//- minicore: fn, coerce_unsized, dispatch_from_dyn, sized
964+
use core::marker::Unsize;
965+
966+
struct Foo<T: ?Sized>(T);
967+
968+
fn need(_: &Foo<dyn Fn(i32) -> i32>) {
969+
}
970+
971+
fn test() {
972+
let callback = |x| x;
973+
//^ i32
974+
need(&Foo(callback));
975+
}
976+
"#,
977+
)
978+
}

src/tools/rust-analyzer/crates/hir-ty/src/tests/traits.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4694,21 +4694,21 @@ fn f<T: Send, U>() {
46944694
Struct::<T>::IS_SEND;
46954695
//^^^^^^^^^^^^^^^^^^^^Yes
46964696
Struct::<U>::IS_SEND;
4697-
//^^^^^^^^^^^^^^^^^^^^Yes
4697+
//^^^^^^^^^^^^^^^^^^^^{unknown}
46984698
Struct::<*const T>::IS_SEND;
4699-
//^^^^^^^^^^^^^^^^^^^^^^^^^^^Yes
4699+
//^^^^^^^^^^^^^^^^^^^^^^^^^^^{unknown}
47004700
Enum::<T>::IS_SEND;
47014701
//^^^^^^^^^^^^^^^^^^Yes
47024702
Enum::<U>::IS_SEND;
4703-
//^^^^^^^^^^^^^^^^^^Yes
4703+
//^^^^^^^^^^^^^^^^^^{unknown}
47044704
Enum::<*const T>::IS_SEND;
4705-
//^^^^^^^^^^^^^^^^^^^^^^^^^Yes
4705+
//^^^^^^^^^^^^^^^^^^^^^^^^^{unknown}
47064706
Union::<T>::IS_SEND;
47074707
//^^^^^^^^^^^^^^^^^^^Yes
47084708
Union::<U>::IS_SEND;
4709-
//^^^^^^^^^^^^^^^^^^^Yes
4709+
//^^^^^^^^^^^^^^^^^^^{unknown}
47104710
Union::<*const T>::IS_SEND;
4711-
//^^^^^^^^^^^^^^^^^^^^^^^^^^Yes
4711+
//^^^^^^^^^^^^^^^^^^^^^^^^^^{unknown}
47124712
PhantomData::<T>::IS_SEND;
47134713
//^^^^^^^^^^^^^^^^^^^^^^^^^Yes
47144714
PhantomData::<U>::IS_SEND;

0 commit comments

Comments
 (0)