This repository was archived by the owner on May 28, 2025. It is now read-only.
File tree Expand file tree Collapse file tree 3 files changed +37
-20
lines changed
src/tools/rust-analyzer/crates/hir-ty/src Expand file tree Collapse file tree 3 files changed +37
-20
lines changed Original file line number Diff line number Diff 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) => {
Original file line number Diff line number Diff line change @@ -535,17 +535,15 @@ fn test() {
535535
536536#[ test]
537537fn coerce_unsize_generic ( ) {
538- check (
538+ check_no_mismatches (
539539 r#"
540540//- minicore: coerce_unsized
541541struct Foo<T> { t: T };
542542struct Bar<T>(Foo<T>);
543543
544544fn 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+ }
Original file line number Diff line number Diff 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;
You can’t perform that action at this time.
0 commit comments