@@ -2472,7 +2472,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
24722472
24732473 fn parameter_count_error < ' tcx > ( sess : & Session , sp : Span , expected_count : usize ,
24742474 arg_count : usize , error_code : & str , variadic : bool ,
2475- def_span : Option < Span > ) {
2475+ def_span : Option < Span > , sugg_unit : bool ) {
24762476 let mut err = sess. struct_span_err_with_code ( sp,
24772477 & format ! ( "this function takes {}{} parameter{} but {} parameter{} supplied" ,
24782478 if variadic { "at least " } else { "" } ,
@@ -2482,13 +2482,23 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
24822482 if arg_count == 1 { " was" } else { "s were" } ) ,
24832483 error_code) ;
24842484
2485- err. span_label ( sp, format ! ( "expected {}{} parameter{}" ,
2486- if variadic { "at least " } else { "" } ,
2487- expected_count,
2488- if expected_count == 1 { "" } else { "s" } ) ) ;
24892485 if let Some ( def_s) = def_span {
24902486 err. span_label ( def_s, "defined here" ) ;
24912487 }
2488+ if sugg_unit {
2489+ let mut sugg_span = sp. end_point ( ) ;
2490+ // remove closing `)` from the span
2491+ sugg_span. hi = sugg_span. lo ;
2492+ err. span_suggestion (
2493+ sugg_span,
2494+ "expected the unit value `()`. You can create one with a pair of parenthesis" ,
2495+ String :: from ( "()" ) ) ;
2496+ } else {
2497+ err. span_label ( sp, format ! ( "expected {}{} parameter{}" ,
2498+ if variadic { "at least " } else { "" } ,
2499+ expected_count,
2500+ if expected_count == 1 { "" } else { "s" } ) ) ;
2501+ }
24922502 err. emit ( ) ;
24932503 }
24942504
@@ -2497,7 +2507,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
24972507 match tuple_type. sty {
24982508 ty:: TyTuple ( arg_types, _) if arg_types. len ( ) != args. len ( ) => {
24992509 parameter_count_error ( tcx. sess , sp_args, arg_types. len ( ) , args. len ( ) ,
2500- "E0057" , false , def_span) ;
2510+ "E0057" , false , def_span, false ) ;
25012511 expected_arg_tys = & [ ] ;
25022512 self . err_args ( args. len ( ) )
25032513 }
@@ -2526,13 +2536,21 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
25262536 fn_inputs. to_vec ( )
25272537 } else {
25282538 parameter_count_error ( tcx. sess , sp_args, expected_arg_count,
2529- supplied_arg_count, "E0060" , true , def_span) ;
2539+ supplied_arg_count, "E0060" , true , def_span, false ) ;
25302540 expected_arg_tys = & [ ] ;
25312541 self . err_args ( supplied_arg_count)
25322542 }
25332543 } else {
2544+ // is the missing argument of type `()`?
2545+ let sugg_unit = if expected_arg_tys. len ( ) == 1 && supplied_arg_count == 0 {
2546+ self . resolve_type_vars_if_possible ( & expected_arg_tys[ 0 ] ) . is_nil ( )
2547+ } else if fn_inputs. len ( ) == 1 && supplied_arg_count == 0 {
2548+ self . resolve_type_vars_if_possible ( & fn_inputs[ 0 ] ) . is_nil ( )
2549+ } else {
2550+ false
2551+ } ;
25342552 parameter_count_error ( tcx. sess , sp_args, expected_arg_count,
2535- supplied_arg_count, "E0061" , false , def_span) ;
2553+ supplied_arg_count, "E0061" , false , def_span, sugg_unit ) ;
25362554 expected_arg_tys = & [ ] ;
25372555 self . err_args ( supplied_arg_count)
25382556 } ;
0 commit comments