diff options
-rw-r--r-- | crates/hir_ty/src/tests/coercion.rs | 310 |
1 files changed, 129 insertions, 181 deletions
diff --git a/crates/hir_ty/src/tests/coercion.rs b/crates/hir_ty/src/tests/coercion.rs index 58d454a0f..eca6ae1fe 100644 --- a/crates/hir_ty/src/tests/coercion.rs +++ b/crates/hir_ty/src/tests/coercion.rs | |||
@@ -630,25 +630,19 @@ fn coerce_placeholder_ref() { | |||
630 | fn coerce_unsize_array() { | 630 | fn coerce_unsize_array() { |
631 | check_infer_with_mismatches( | 631 | check_infer_with_mismatches( |
632 | r#" | 632 | r#" |
633 | #[lang = "unsize"] | 633 | //- minicore: coerce_unsized |
634 | pub trait Unsize<T> {} | 634 | fn test() { |
635 | #[lang = "coerce_unsized"] | 635 | let f: &[usize] = &[1, 2, 3]; |
636 | pub trait CoerceUnsized<T> {} | 636 | } |
637 | |||
638 | impl<T: Unsize<U>, U> CoerceUnsized<&U> for &T {} | ||
639 | |||
640 | fn test() { | ||
641 | let f: &[usize] = &[1, 2, 3]; | ||
642 | } | ||
643 | "#, | 637 | "#, |
644 | expect![[r#" | 638 | expect![[r#" |
645 | 161..198 '{ ... 3]; }': () | 639 | 10..47 '{ ... 3]; }': () |
646 | 171..172 'f': &[usize] | 640 | 20..21 'f': &[usize] |
647 | 185..195 '&[1, 2, 3]': &[usize; 3] | 641 | 34..44 '&[1, 2, 3]': &[usize; 3] |
648 | 186..195 '[1, 2, 3]': [usize; 3] | 642 | 35..44 '[1, 2, 3]': [usize; 3] |
649 | 187..188 '1': usize | 643 | 36..37 '1': usize |
650 | 190..191 '2': usize | 644 | 39..40 '2': usize |
651 | 193..194 '3': usize | 645 | 42..43 '3': usize |
652 | "#]], | 646 | "#]], |
653 | ); | 647 | ); |
654 | } | 648 | } |
@@ -657,42 +651,34 @@ fn coerce_unsize_array() { | |||
657 | fn coerce_unsize_trait_object_simple() { | 651 | fn coerce_unsize_trait_object_simple() { |
658 | check_infer_with_mismatches( | 652 | check_infer_with_mismatches( |
659 | r#" | 653 | r#" |
660 | #[lang = "sized"] | 654 | //- minicore: coerce_unsized |
661 | pub trait Sized {} | 655 | trait Foo<T, U> {} |
662 | #[lang = "unsize"] | 656 | trait Bar<U, T, X>: Foo<T, U> {} |
663 | pub trait Unsize<T> {} | 657 | trait Baz<T, X>: Bar<usize, T, X> {} |
664 | #[lang = "coerce_unsized"] | ||
665 | pub trait CoerceUnsized<T> {} | ||
666 | |||
667 | impl<T: Unsize<U>, U> CoerceUnsized<&U> for &T {} | ||
668 | |||
669 | trait Foo<T, U> {} | ||
670 | trait Bar<U, T, X>: Foo<T, U> {} | ||
671 | trait Baz<T, X>: Bar<usize, T, X> {} | ||
672 | 658 | ||
673 | struct S<T, X>; | 659 | struct S<T, X>; |
674 | impl<T, X> Foo<T, usize> for S<T, X> {} | 660 | impl<T, X> Foo<T, usize> for S<T, X> {} |
675 | impl<T, X> Bar<usize, T, X> for S<T, X> {} | 661 | impl<T, X> Bar<usize, T, X> for S<T, X> {} |
676 | impl<T, X> Baz<T, X> for S<T, X> {} | 662 | impl<T, X> Baz<T, X> for S<T, X> {} |
677 | 663 | ||
678 | fn test() { | 664 | fn test() { |
679 | let obj: &dyn Baz<i8, i16> = &S; | 665 | let obj: &dyn Baz<i8, i16> = &S; |
680 | let obj: &dyn Bar<_, i8, i16> = &S; | 666 | let obj: &dyn Bar<_, i8, i16> = &S; |
681 | let obj: &dyn Foo<i8, _> = &S; | 667 | let obj: &dyn Foo<i8, _> = &S; |
682 | } | 668 | } |
683 | "#, | 669 | "#, |
684 | expect![[r" | 670 | expect![[r#" |
685 | 424..539 '{ ... &S; }': () | 671 | 236..351 '{ ... &S; }': () |
686 | 434..437 'obj': &dyn Baz<i8, i16> | 672 | 246..249 'obj': &dyn Baz<i8, i16> |
687 | 459..461 '&S': &S<i8, i16> | 673 | 271..273 '&S': &S<i8, i16> |
688 | 460..461 'S': S<i8, i16> | 674 | 272..273 'S': S<i8, i16> |
689 | 471..474 'obj': &dyn Bar<usize, i8, i16> | 675 | 283..286 'obj': &dyn Bar<usize, i8, i16> |
690 | 499..501 '&S': &S<i8, i16> | 676 | 311..313 '&S': &S<i8, i16> |
691 | 500..501 'S': S<i8, i16> | 677 | 312..313 'S': S<i8, i16> |
692 | 511..514 'obj': &dyn Foo<i8, usize> | 678 | 323..326 'obj': &dyn Foo<i8, usize> |
693 | 534..536 '&S': &S<i8, {unknown}> | 679 | 346..348 '&S': &S<i8, {unknown}> |
694 | 535..536 'S': S<i8, {unknown}> | 680 | 347..348 'S': S<i8, {unknown}> |
695 | "]], | 681 | "#]], |
696 | ); | 682 | ); |
697 | } | 683 | } |
698 | 684 | ||
@@ -717,49 +703,41 @@ fn coerce_unsize_trait_object_to_trait_object() { | |||
717 | // 602..606 'obj2': &dyn Baz<i8, i16> | 703 | // 602..606 'obj2': &dyn Baz<i8, i16> |
718 | check_infer_with_mismatches( | 704 | check_infer_with_mismatches( |
719 | r#" | 705 | r#" |
720 | #[lang = "sized"] | 706 | //- minicore: coerce_unsized |
721 | pub trait Sized {} | 707 | trait Foo<T, U> {} |
722 | #[lang = "unsize"] | 708 | trait Bar<U, T, X>: Foo<T, U> {} |
723 | pub trait Unsize<T> {} | 709 | trait Baz<T, X>: Bar<usize, T, X> {} |
724 | #[lang = "coerce_unsized"] | ||
725 | pub trait CoerceUnsized<T> {} | ||
726 | |||
727 | impl<T: Unsize<U>, U> CoerceUnsized<&U> for &T {} | ||
728 | |||
729 | trait Foo<T, U> {} | ||
730 | trait Bar<U, T, X>: Foo<T, U> {} | ||
731 | trait Baz<T, X>: Bar<usize, T, X> {} | ||
732 | 710 | ||
733 | struct S<T, X>; | 711 | struct S<T, X>; |
734 | impl<T, X> Foo<T, usize> for S<T, X> {} | 712 | impl<T, X> Foo<T, usize> for S<T, X> {} |
735 | impl<T, X> Bar<usize, T, X> for S<T, X> {} | 713 | impl<T, X> Bar<usize, T, X> for S<T, X> {} |
736 | impl<T, X> Baz<T, X> for S<T, X> {} | 714 | impl<T, X> Baz<T, X> for S<T, X> {} |
737 | 715 | ||
738 | fn test() { | 716 | fn test() { |
739 | let obj: &dyn Baz<i8, i16> = &S; | 717 | let obj: &dyn Baz<i8, i16> = &S; |
740 | let obj: &dyn Bar<_, _, _> = obj; | 718 | let obj: &dyn Bar<_, _, _> = obj; |
741 | let obj: &dyn Foo<_, _> = obj; | 719 | let obj: &dyn Foo<_, _> = obj; |
742 | let obj2: &dyn Baz<i8, i16> = &S; | 720 | let obj2: &dyn Baz<i8, i16> = &S; |
743 | let _: &dyn Foo<_, _> = obj2; | 721 | let _: &dyn Foo<_, _> = obj2; |
744 | } | 722 | } |
745 | "#, | 723 | "#, |
746 | expect![[r#" | 724 | expect![[r#" |
747 | 424..609 '{ ...bj2; }': () | 725 | 236..421 '{ ...bj2; }': () |
748 | 434..437 'obj': &dyn Baz<i8, i16> | 726 | 246..249 'obj': &dyn Baz<i8, i16> |
749 | 459..461 '&S': &S<i8, i16> | 727 | 271..273 '&S': &S<i8, i16> |
750 | 460..461 'S': S<i8, i16> | 728 | 272..273 'S': S<i8, i16> |
751 | 471..474 'obj': &dyn Bar<{unknown}, {unknown}, {unknown}> | 729 | 283..286 'obj': &dyn Bar<{unknown}, {unknown}, {unknown}> |
752 | 496..499 'obj': &dyn Baz<i8, i16> | 730 | 308..311 'obj': &dyn Baz<i8, i16> |
753 | 509..512 'obj': &dyn Foo<{unknown}, {unknown}> | 731 | 321..324 'obj': &dyn Foo<{unknown}, {unknown}> |
754 | 531..534 'obj': &dyn Bar<{unknown}, {unknown}, {unknown}> | 732 | 343..346 'obj': &dyn Bar<{unknown}, {unknown}, {unknown}> |
755 | 544..548 'obj2': &dyn Baz<i8, i16> | 733 | 356..360 'obj2': &dyn Baz<i8, i16> |
756 | 570..572 '&S': &S<i8, i16> | 734 | 382..384 '&S': &S<i8, i16> |
757 | 571..572 'S': S<i8, i16> | 735 | 383..384 'S': S<i8, i16> |
758 | 582..583 '_': &dyn Foo<{unknown}, {unknown}> | 736 | 394..395 '_': &dyn Foo<{unknown}, {unknown}> |
759 | 602..606 'obj2': &dyn Baz<i8, i16> | 737 | 414..418 'obj2': &dyn Baz<i8, i16> |
760 | 496..499: expected &dyn Bar<{unknown}, {unknown}, {unknown}>, got &dyn Baz<i8, i16> | 738 | 308..311: expected &dyn Bar<{unknown}, {unknown}, {unknown}>, got &dyn Baz<i8, i16> |
761 | 531..534: expected &dyn Foo<{unknown}, {unknown}>, got &dyn Bar<{unknown}, {unknown}, {unknown}> | 739 | 343..346: expected &dyn Foo<{unknown}, {unknown}>, got &dyn Bar<{unknown}, {unknown}, {unknown}> |
762 | 602..606: expected &dyn Foo<{unknown}, {unknown}>, got &dyn Baz<i8, i16> | 740 | 414..418: expected &dyn Foo<{unknown}, {unknown}>, got &dyn Baz<i8, i16> |
763 | "#]], | 741 | "#]], |
764 | ); | 742 | ); |
765 | } | 743 | } |
@@ -768,40 +746,32 @@ fn coerce_unsize_trait_object_to_trait_object() { | |||
768 | fn coerce_unsize_super_trait_cycle() { | 746 | fn coerce_unsize_super_trait_cycle() { |
769 | check_infer_with_mismatches( | 747 | check_infer_with_mismatches( |
770 | r#" | 748 | r#" |
771 | #[lang = "sized"] | 749 | //- minicore: coerce_unsized |
772 | pub trait Sized {} | 750 | trait A {} |
773 | #[lang = "unsize"] | 751 | trait B: C + A {} |
774 | pub trait Unsize<T> {} | 752 | trait C: B {} |
775 | #[lang = "coerce_unsized"] | 753 | trait D: C |
776 | pub trait CoerceUnsized<T> {} | ||
777 | |||
778 | impl<T: Unsize<U>, U> CoerceUnsized<&U> for &T {} | ||
779 | |||
780 | trait A {} | ||
781 | trait B: C + A {} | ||
782 | trait C: B {} | ||
783 | trait D: C | ||
784 | |||
785 | struct S; | ||
786 | impl A for S {} | ||
787 | impl B for S {} | ||
788 | impl C for S {} | ||
789 | impl D for S {} | ||
790 | 754 | ||
791 | fn test() { | 755 | struct S; |
792 | let obj: &dyn D = &S; | 756 | impl A for S {} |
793 | let obj: &dyn A = &S; | 757 | impl B for S {} |
794 | } | 758 | impl C for S {} |
795 | "#, | 759 | impl D for S {} |
796 | expect![[r" | 760 | |
797 | 328..383 '{ ... &S; }': () | 761 | fn test() { |
798 | 338..341 'obj': &dyn D | 762 | let obj: &dyn D = &S; |
799 | 352..354 '&S': &S | 763 | let obj: &dyn A = &S; |
800 | 353..354 'S': S | 764 | } |
801 | 364..367 'obj': &dyn A | 765 | "#, |
802 | 378..380 '&S': &S | 766 | expect![[r#" |
803 | 379..380 'S': S | 767 | 140..195 '{ ... &S; }': () |
804 | "]], | 768 | 150..153 'obj': &dyn D |
769 | 164..166 '&S': &S | ||
770 | 165..166 'S': S | ||
771 | 176..179 'obj': &dyn A | ||
772 | 190..192 '&S': &S | ||
773 | 191..192 'S': S | ||
774 | "#]], | ||
805 | ); | 775 | ); |
806 | } | 776 | } |
807 | 777 | ||
@@ -810,41 +780,35 @@ fn coerce_unsize_generic() { | |||
810 | // FIXME: fix the type mismatches here | 780 | // FIXME: fix the type mismatches here |
811 | check_infer_with_mismatches( | 781 | check_infer_with_mismatches( |
812 | r#" | 782 | r#" |
813 | #[lang = "unsize"] | 783 | //- minicore: coerce_unsized |
814 | pub trait Unsize<T> {} | 784 | struct Foo<T> { t: T }; |
815 | #[lang = "coerce_unsized"] | 785 | struct Bar<T>(Foo<T>); |
816 | pub trait CoerceUnsized<T> {} | ||
817 | |||
818 | impl<T: Unsize<U>, U> CoerceUnsized<&U> for &T {} | ||
819 | |||
820 | struct Foo<T> { t: T }; | ||
821 | struct Bar<T>(Foo<T>); | ||
822 | 786 | ||
823 | fn test() { | 787 | fn test() { |
824 | let _: &Foo<[usize]> = &Foo { t: [1, 2, 3] }; | 788 | let _: &Foo<[usize]> = &Foo { t: [1, 2, 3] }; |
825 | let _: &Bar<[usize]> = &Bar(Foo { t: [1, 2, 3] }); | 789 | let _: &Bar<[usize]> = &Bar(Foo { t: [1, 2, 3] }); |
826 | } | 790 | } |
827 | "#, | 791 | "#, |
828 | expect![[r#" | 792 | expect![[r#" |
829 | 209..317 '{ ... }); }': () | 793 | 58..166 '{ ... }); }': () |
830 | 219..220 '_': &Foo<[usize]> | 794 | 68..69 '_': &Foo<[usize]> |
831 | 238..259 '&Foo {..., 3] }': &Foo<[usize]> | 795 | 87..108 '&Foo {..., 3] }': &Foo<[usize]> |
832 | 239..259 'Foo { ..., 3] }': Foo<[usize]> | 796 | 88..108 'Foo { ..., 3] }': Foo<[usize]> |
833 | 248..257 '[1, 2, 3]': [usize; 3] | 797 | 97..106 '[1, 2, 3]': [usize; 3] |
834 | 249..250 '1': usize | 798 | 98..99 '1': usize |
835 | 252..253 '2': usize | 799 | 101..102 '2': usize |
836 | 255..256 '3': usize | 800 | 104..105 '3': usize |
837 | 269..270 '_': &Bar<[usize]> | 801 | 118..119 '_': &Bar<[usize]> |
838 | 288..314 '&Bar(F... 3] })': &Bar<[i32; 3]> | 802 | 137..163 '&Bar(F... 3] })': &Bar<[i32; 3]> |
839 | 289..292 'Bar': Bar<[i32; 3]>(Foo<[i32; 3]>) -> Bar<[i32; 3]> | 803 | 138..141 'Bar': Bar<[i32; 3]>(Foo<[i32; 3]>) -> Bar<[i32; 3]> |
840 | 289..314 'Bar(Fo... 3] })': Bar<[i32; 3]> | 804 | 138..163 'Bar(Fo... 3] })': Bar<[i32; 3]> |
841 | 293..313 'Foo { ..., 3] }': Foo<[i32; 3]> | 805 | 142..162 'Foo { ..., 3] }': Foo<[i32; 3]> |
842 | 302..311 '[1, 2, 3]': [i32; 3] | 806 | 151..160 '[1, 2, 3]': [i32; 3] |
843 | 303..304 '1': i32 | 807 | 152..153 '1': i32 |
844 | 306..307 '2': i32 | 808 | 155..156 '2': i32 |
845 | 309..310 '3': i32 | 809 | 158..159 '3': i32 |
846 | 248..257: expected [usize], got [usize; 3] | 810 | 97..106: expected [usize], got [usize; 3] |
847 | 288..314: expected &Bar<[usize]>, got &Bar<[i32; 3]> | 811 | 137..163: expected &Bar<[usize]>, got &Bar<[i32; 3]> |
848 | "#]], | 812 | "#]], |
849 | ); | 813 | ); |
850 | } | 814 | } |
@@ -854,15 +818,7 @@ fn coerce_unsize_apit() { | |||
854 | // FIXME: #8984 | 818 | // FIXME: #8984 |
855 | check_infer_with_mismatches( | 819 | check_infer_with_mismatches( |
856 | r#" | 820 | r#" |
857 | #[lang = "sized"] | 821 | //- minicore: coerce_unsized |
858 | pub trait Sized {} | ||
859 | #[lang = "unsize"] | ||
860 | pub trait Unsize<T> {} | ||
861 | #[lang = "coerce_unsized"] | ||
862 | pub trait CoerceUnsized<T> {} | ||
863 | |||
864 | impl<T: Unsize<U>, U> CoerceUnsized<&U> for &T {} | ||
865 | |||
866 | trait Foo {} | 822 | trait Foo {} |
867 | 823 | ||
868 | fn test(f: impl Foo) { | 824 | fn test(f: impl Foo) { |
@@ -870,12 +826,12 @@ fn test(f: impl Foo) { | |||
870 | } | 826 | } |
871 | "#, | 827 | "#, |
872 | expect![[r#" | 828 | expect![[r#" |
873 | 210..211 'f': impl Foo | 829 | 22..23 'f': impl Foo |
874 | 223..252 '{ ... &f; }': () | 830 | 35..64 '{ ... &f; }': () |
875 | 233..234 '_': &dyn Foo | 831 | 45..46 '_': &dyn Foo |
876 | 247..249 '&f': &impl Foo | 832 | 59..61 '&f': &impl Foo |
877 | 248..249 'f': impl Foo | 833 | 60..61 'f': impl Foo |
878 | 247..249: expected &dyn Foo, got &impl Foo | 834 | 59..61: expected &dyn Foo, got &impl Foo |
879 | "#]], | 835 | "#]], |
880 | ); | 836 | ); |
881 | } | 837 | } |
@@ -971,15 +927,7 @@ fn main() { | |||
971 | fn coerce_unsize_expected_type() { | 927 | fn coerce_unsize_expected_type() { |
972 | check_no_mismatches( | 928 | check_no_mismatches( |
973 | r#" | 929 | r#" |
974 | #[lang = "sized"] | 930 | //- minicore: coerce_unsized |
975 | pub trait Sized {} | ||
976 | #[lang = "unsize"] | ||
977 | pub trait Unsize<T> {} | ||
978 | #[lang = "coerce_unsized"] | ||
979 | pub trait CoerceUnsized<T> {} | ||
980 | |||
981 | impl<T: Unsize<U>, U> CoerceUnsized<&U> for &T {} | ||
982 | |||
983 | fn main() { | 931 | fn main() { |
984 | let foo: &[u32] = &[1, 2]; | 932 | let foo: &[u32] = &[1, 2]; |
985 | let foo: &[u32] = match true { | 933 | let foo: &[u32] = match true { |