@@ -2,6 +2,7 @@ use core::ops::ControlFlow;
2
2
use std:: borrow:: Cow ;
3
3
use std:: path:: PathBuf ;
4
4
5
+ use rustc_abi:: ExternAbi ;
5
6
use rustc_ast:: TraitObjectSyntax ;
6
7
use rustc_data_structures:: fx:: FxHashMap ;
7
8
use rustc_data_structures:: unord:: UnordSet ;
@@ -2799,32 +2800,57 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
2799
2800
}
2800
2801
2801
2802
// Note any argument mismatches
2802
- let given_ty = params. skip_binder ( ) ;
2803
+ let ty:: Tuple ( given) = * params. skip_binder ( ) . kind ( ) else {
2804
+ return ;
2805
+ } ;
2806
+
2803
2807
let expected_ty = trait_pred. skip_binder ( ) . trait_ref . args . type_at ( 1 ) ;
2804
- if let ty:: Tuple ( given) = given_ty. kind ( )
2805
- && let ty:: Tuple ( expected) = expected_ty. kind ( )
2806
- {
2807
- if expected. len ( ) != given. len ( ) {
2808
- // Note number of types that were expected and given
2809
- err. note (
2810
- format ! (
2811
- "expected a closure taking {} argument{}, but one taking {} argument{} was given" ,
2812
- given. len( ) ,
2813
- pluralize!( given. len( ) ) ,
2814
- expected. len( ) ,
2815
- pluralize!( expected. len( ) ) ,
2816
- )
2817
- ) ;
2818
- } else if !self . same_type_modulo_infer ( given_ty, expected_ty) {
2819
- // Print type mismatch
2820
- let ( expected_args, given_args) = self . cmp ( given_ty, expected_ty) ;
2821
- err. note_expected_found (
2822
- & "a closure with arguments" ,
2823
- expected_args,
2824
- & "a closure with arguments" ,
2825
- given_args,
2826
- ) ;
2827
- }
2808
+ let ty:: Tuple ( expected) = * expected_ty. kind ( ) else {
2809
+ return ;
2810
+ } ;
2811
+
2812
+ if expected. len ( ) != given. len ( ) {
2813
+ // Note number of types that were expected and given
2814
+ err. note ( format ! (
2815
+ "expected a closure taking {} argument{}, but one taking {} argument{} was given" ,
2816
+ given. len( ) ,
2817
+ pluralize!( given. len( ) ) ,
2818
+ expected. len( ) ,
2819
+ pluralize!( expected. len( ) ) ,
2820
+ ) ) ;
2821
+ return ;
2822
+ }
2823
+
2824
+ let given_ty = Ty :: new_fn_ptr (
2825
+ self . tcx ,
2826
+ params. rebind ( self . tcx . mk_fn_sig (
2827
+ given,
2828
+ self . tcx . types . unit ,
2829
+ false ,
2830
+ hir:: Safety :: Safe ,
2831
+ ExternAbi :: Rust ,
2832
+ ) ) ,
2833
+ ) ;
2834
+ let expected_ty = Ty :: new_fn_ptr (
2835
+ self . tcx ,
2836
+ trait_pred. rebind ( self . tcx . mk_fn_sig (
2837
+ expected,
2838
+ self . tcx . types . unit ,
2839
+ false ,
2840
+ hir:: Safety :: Safe ,
2841
+ ExternAbi :: Rust ,
2842
+ ) ) ,
2843
+ ) ;
2844
+
2845
+ if !self . same_type_modulo_infer ( given_ty, expected_ty) {
2846
+ // Print type mismatch
2847
+ let ( expected_args, given_args) = self . cmp ( expected_ty, given_ty) ;
2848
+ err. note_expected_found (
2849
+ "a closure with signature" ,
2850
+ expected_args,
2851
+ "a closure with signature" ,
2852
+ given_args,
2853
+ ) ;
2828
2854
}
2829
2855
}
2830
2856
0 commit comments