File tree 3 files changed +33
-13
lines changed 3 files changed +33
-13
lines changed Original file line number Diff line number Diff line change @@ -768,8 +768,9 @@ pub(crate) fn adt_datum_query(
768
768
phantom_data,
769
769
} ;
770
770
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
+ // this slows down rust-analyzer by quite a bit unfortunately
772
+ // but it's needed to trick chalk into impl Unsize
773
+ let variant_id_to_fields = |id : VariantId | {
773
774
let variant_data = & id. variant_data ( db. upcast ( ) ) ;
774
775
let fields = if variant_data. fields ( ) . is_empty ( ) {
775
776
vec ! [ ]
@@ -778,13 +779,13 @@ pub(crate) fn adt_datum_query(
778
779
variant_data
779
780
. fields ( )
780
781
. iter ( )
782
+ . rev ( )
783
+ . take ( 1 )
781
784
. map ( |( idx, _) | field_types[ idx] . clone ( ) . substitute ( Interner , & bound_vars_subst) )
782
- . filter ( |it| !it. contains_unknown ( ) )
783
785
. collect ( )
784
786
} ;
785
787
rust_ir:: AdtVariantDatum { fields }
786
788
} ;
787
- let variant_id_to_fields = |_: VariantId | rust_ir:: AdtVariantDatum { fields : vec ! [ ] } ;
788
789
789
790
let ( kind, variants) = match adt_id {
790
791
hir_def:: AdtId :: StructId ( id) => {
Original file line number Diff line number Diff line change @@ -536,17 +536,15 @@ fn test() {
536
536
537
537
#[ test]
538
538
fn coerce_unsize_generic ( ) {
539
- check (
539
+ check_no_mismatches (
540
540
r#"
541
541
//- minicore: coerce_unsized
542
542
struct Foo<T> { t: T };
543
543
struct Bar<T>(Foo<T>);
544
544
545
545
fn test() {
546
546
let _: &Foo<[usize]> = &Foo { t: [1, 2, 3] };
547
- //^^^^^^^^^^^^^^^^^^^^^ expected &'? Foo<[usize]>, got &'? Foo<[i32; 3]>
548
547
let _: &Bar<[usize]> = &Bar(Foo { t: [1, 2, 3] });
549
- //^^^^^^^^^^^^^^^^^^^^^^^^^^ expected &'? Bar<[usize]>, got &'? Bar<[i32; 3]>
550
548
}
551
549
"# ,
552
550
) ;
@@ -958,3 +956,24 @@ fn f() {
958
956
"# ,
959
957
) ;
960
958
}
959
+
960
+ #[ test]
961
+ fn coerce_nested_unsized_struct ( ) {
962
+ check_types (
963
+ r#"
964
+ //- minicore: fn, coerce_unsized, dispatch_from_dyn, sized
965
+ use core::marker::Unsize;
966
+
967
+ struct Foo<T: ?Sized>(T);
968
+
969
+ fn need(_: &Foo<dyn Fn(i32) -> i32>) {
970
+ }
971
+
972
+ fn test() {
973
+ let callback = |x| x;
974
+ //^ i32
975
+ need(&Foo(callback));
976
+ }
977
+ "# ,
978
+ )
979
+ }
Original file line number Diff line number Diff line change @@ -4694,21 +4694,21 @@ fn f<T: Send, U>() {
4694
4694
Struct::<T>::IS_SEND;
4695
4695
//^^^^^^^^^^^^^^^^^^^^Yes
4696
4696
Struct::<U>::IS_SEND;
4697
- //^^^^^^^^^^^^^^^^^^^^Yes
4697
+ //^^^^^^^^^^^^^^^^^^^^{unknown}
4698
4698
Struct::<*const T>::IS_SEND;
4699
- //^^^^^^^^^^^^^^^^^^^^^^^^^^^Yes
4699
+ //^^^^^^^^^^^^^^^^^^^^^^^^^^^{unknown}
4700
4700
Enum::<T>::IS_SEND;
4701
4701
//^^^^^^^^^^^^^^^^^^Yes
4702
4702
Enum::<U>::IS_SEND;
4703
- //^^^^^^^^^^^^^^^^^^Yes
4703
+ //^^^^^^^^^^^^^^^^^^{unknown}
4704
4704
Enum::<*const T>::IS_SEND;
4705
- //^^^^^^^^^^^^^^^^^^^^^^^^^Yes
4705
+ //^^^^^^^^^^^^^^^^^^^^^^^^^{unknown}
4706
4706
Union::<T>::IS_SEND;
4707
4707
//^^^^^^^^^^^^^^^^^^^Yes
4708
4708
Union::<U>::IS_SEND;
4709
- //^^^^^^^^^^^^^^^^^^^Yes
4709
+ //^^^^^^^^^^^^^^^^^^^{unknown}
4710
4710
Union::<*const T>::IS_SEND;
4711
- //^^^^^^^^^^^^^^^^^^^^^^^^^^Yes
4711
+ //^^^^^^^^^^^^^^^^^^^^^^^^^^{unknown}
4712
4712
PhantomData::<T>::IS_SEND;
4713
4713
//^^^^^^^^^^^^^^^^^^^^^^^^^Yes
4714
4714
PhantomData::<U>::IS_SEND;
You can’t perform that action at this time.
0 commit comments