@@ -2423,7 +2423,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
24232423
24242424 fn parameter_count_error < ' tcx > ( sess : & Session , sp : Span , expected_count : usize ,
24252425 arg_count : usize , error_code : & str , variadic : bool ,
2426- def_span : Option < Span > ) {
2426+ def_span : Option < Span > , sugg_unit : bool ) {
24272427 let mut err = sess. struct_span_err_with_code ( sp,
24282428 & format ! ( "this function takes {}{} parameter{} but {} parameter{} supplied" ,
24292429 if variadic { "at least " } else { "" } ,
@@ -2433,13 +2433,23 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
24332433 if arg_count == 1 { " was" } else { "s were" } ) ,
24342434 error_code) ;
24352435
2436- err. span_label ( sp, format ! ( "expected {}{} parameter{}" ,
2437- if variadic { "at least " } else { "" } ,
2438- expected_count,
2439- if expected_count == 1 { "" } else { "s" } ) ) ;
24402436 if let Some ( def_s) = def_span {
24412437 err. span_label ( def_s, "defined here" ) ;
24422438 }
2439+ if sugg_unit {
2440+ let mut sugg_span = sp. end_point ( ) ;
2441+ // remove closing `)` from the span
2442+ sugg_span. hi = sugg_span. lo ;
2443+ err. span_suggestion (
2444+ sugg_span,
2445+ "expected the unit value `()`. You can create one with a pair of parenthesis" ,
2446+ String :: from ( "()" ) ) ;
2447+ } else {
2448+ err. span_label ( sp, format ! ( "expected {}{} parameter{}" ,
2449+ if variadic { "at least " } else { "" } ,
2450+ expected_count,
2451+ if expected_count == 1 { "" } else { "s" } ) ) ;
2452+ }
24432453 err. emit ( ) ;
24442454 }
24452455
@@ -2448,7 +2458,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
24482458 match tuple_type. sty {
24492459 ty:: TyTuple ( arg_types, _) if arg_types. len ( ) != args. len ( ) => {
24502460 parameter_count_error ( tcx. sess , sp_args, arg_types. len ( ) , args. len ( ) ,
2451- "E0057" , false , def_span) ;
2461+ "E0057" , false , def_span, false ) ;
24522462 expected_arg_tys = & [ ] ;
24532463 self . err_args ( args. len ( ) )
24542464 }
@@ -2477,13 +2487,21 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
24772487 fn_inputs. to_vec ( )
24782488 } else {
24792489 parameter_count_error ( tcx. sess , sp_args, expected_arg_count,
2480- supplied_arg_count, "E0060" , true , def_span) ;
2490+ supplied_arg_count, "E0060" , true , def_span, false ) ;
24812491 expected_arg_tys = & [ ] ;
24822492 self . err_args ( supplied_arg_count)
24832493 }
24842494 } else {
2495+ // is the missing argument of type `()`?
2496+ let sugg_unit = if expected_arg_tys. len ( ) == 1 && supplied_arg_count == 0 {
2497+ self . resolve_type_vars_if_possible ( & expected_arg_tys[ 0 ] ) . is_nil ( )
2498+ } else if fn_inputs. len ( ) == 1 && supplied_arg_count == 0 {
2499+ self . resolve_type_vars_if_possible ( & fn_inputs[ 0 ] ) . is_nil ( )
2500+ } else {
2501+ false
2502+ } ;
24852503 parameter_count_error ( tcx. sess , sp_args, expected_arg_count,
2486- supplied_arg_count, "E0061" , false , def_span) ;
2504+ supplied_arg_count, "E0061" , false , def_span, sugg_unit ) ;
24872505 expected_arg_tys = & [ ] ;
24882506 self . err_args ( supplied_arg_count)
24892507 } ;
0 commit comments