@@ -270,6 +270,110 @@ pub(crate) enum Error<'a> {
270
270
expected : Range < u32 > ,
271
271
found : u32 ,
272
272
} ,
273
+
274
+ /// No overload of this function accepts this many arguments.
275
+ TooManyArguments {
276
+ /// The name of the function being called.
277
+ function : String ,
278
+
279
+ /// The function name in the call expression.
280
+ call_span : Span ,
281
+
282
+ /// The first argument that is unacceptable.
283
+ arg_span : Span ,
284
+
285
+ /// Maximum number of arguments accepted by any overload of
286
+ /// this function.
287
+ max_arguments : u32 ,
288
+ } ,
289
+
290
+ /// Given the types of the prior arguments, no remaining overload
291
+ /// accepts this many arguments.
292
+ WrongArgumentCountForOverloads {
293
+ /// The name of the function being called.
294
+ function : String ,
295
+
296
+ /// The function name in the call expression.
297
+ call_span : Span ,
298
+
299
+ /// The first argument that is unacceptable.
300
+ arg_span : Span ,
301
+
302
+ /// The prior argument whose type made the `arg_span` argument
303
+ /// unacceptable.
304
+ prior_span : Span ,
305
+
306
+ /// The index of the `prior_arg_span` argument.
307
+ prior_index : u32 ,
308
+
309
+ /// The type of the `prior_arg_span` argument.
310
+ prior_ty : String ,
311
+
312
+ /// Maximum number of arguments accepted by any overload of
313
+ /// this function.
314
+ max_arguments : u32 ,
315
+ } ,
316
+
317
+ /// A value passed to a builtin function has a type that is not
318
+ /// accepted by any overload of the function.
319
+ WrongArgumentType {
320
+ /// The name of the function being called.
321
+ function : String ,
322
+
323
+ /// The function name in the call expression.
324
+ call_span : Span ,
325
+
326
+ /// The first argument whose type is unacceptable.
327
+ arg_span : Span ,
328
+
329
+ /// The index of the first argument whose type is unacceptable.
330
+ arg_index : u32 ,
331
+
332
+ /// That argument's actual type.
333
+ arg_ty : String ,
334
+
335
+ /// The set of argument types that would have been accepted for
336
+ /// this argument, given the prior arguments.
337
+ allowed : Vec < String > ,
338
+ } ,
339
+
340
+ /// A value passed to a builtin function has a type that is not
341
+ /// accepted, given the earlier arguments' types.
342
+ InconsistentArgumentType {
343
+ /// The name of the function being called.
344
+ function : String ,
345
+
346
+ /// The function name in the call expression.
347
+ call_span : Span ,
348
+
349
+ /// The first unacceptable argument.
350
+ arg_span : Span ,
351
+
352
+ /// The index of the first unacceptable argument.
353
+ arg_index : u32 ,
354
+
355
+ /// The actual type of the first unacceptable argument.
356
+ arg_ty : String ,
357
+
358
+ /// The prior argument whose type made the `arg_span` argument
359
+ /// unacceptable.
360
+ prior_span : Span ,
361
+
362
+ /// The index of the `prior_arg_span` argument.
363
+ prior_index : u32 ,
364
+
365
+ /// The type of the `prior_arg_span` argument.
366
+ prior_ty : String ,
367
+
368
+ /// The types that would have been accepted instead of the
369
+ /// first unacceptable argument.
370
+ allowed : Vec < String > ,
371
+ } ,
372
+
373
+ AmbiguousCall {
374
+ call_span : Span ,
375
+ alternatives : Vec < String > ,
376
+ } ,
273
377
FunctionReturnsVoid ( Span ) ,
274
378
FunctionMustUseUnused ( Span ) ,
275
379
FunctionMustUseReturnsVoid ( Span , Span ) ,
@@ -401,7 +505,8 @@ impl<'a> Error<'a> {
401
505
"workgroup size separator (`,`) or a closing parenthesis" . to_string ( )
402
506
}
403
507
ExpectedToken :: GlobalItem => concat ! (
404
- "global item (`struct`, `const`, `var`, `alias`, `fn`, `diagnostic`, `enable`, `requires`, `;`) " ,
508
+ "global item (`struct`, `const`, `var`, `alias`, " ,
509
+ "`fn`, `diagnostic`, `enable`, `requires`, `;`) " ,
405
510
"or the end of the file"
406
511
)
407
512
. to_string ( ) ,
@@ -825,6 +930,107 @@ impl<'a> Error<'a> {
825
930
labels : vec ! [ ( span, "wrong number of arguments" . into( ) ) ] ,
826
931
notes : vec ! [ ] ,
827
932
} ,
933
+ Error :: TooManyArguments {
934
+ ref function,
935
+ call_span,
936
+ arg_span,
937
+ max_arguments,
938
+ } => ParseError {
939
+ message : format ! ( "Too many arguments passed to `{function}`" ) ,
940
+ labels : vec ! [
941
+ ( call_span, "The function is called here" . into( ) ) ,
942
+ ( arg_span, "This is the first excess argument" . into( ) )
943
+ ] ,
944
+ notes : vec ! [
945
+ format!( "The `{function}` function accepts at most {max_arguments} argument(s)" )
946
+ ] ,
947
+ } ,
948
+ Error :: WrongArgumentCountForOverloads {
949
+ ref function,
950
+ call_span,
951
+ arg_span,
952
+ prior_span,
953
+ prior_index,
954
+ ref prior_ty,
955
+ max_arguments,
956
+ } => {
957
+ let message = format ! ( "Too many arguments in this call to to `{function}`" ) ;
958
+ let labels = vec ! [
959
+ ( call_span, "The function is called here" . into( ) ) ,
960
+ ( arg_span, "This is the first excess argument" . into( ) ) ,
961
+ ( prior_span, format!( "This argument has type `{prior_ty}`." ) . into( ) ) ,
962
+ ] ;
963
+ let notes = vec ! [
964
+ format!( "Because argument #{} has type `{prior_ty}`," , prior_index + 1 ) ,
965
+ format!( "`{function}` accepts only {max_arguments} argument(s)." ) ,
966
+ ] ;
967
+
968
+ ParseError { message, labels, notes }
969
+ }
970
+ Error :: WrongArgumentType {
971
+ ref function,
972
+ call_span,
973
+ arg_span,
974
+ arg_index,
975
+ ref arg_ty,
976
+ ref allowed,
977
+ } => {
978
+ let message = format ! (
979
+ "Wrong type passed as argument #{} to `{function}`" ,
980
+ arg_index + 1 ,
981
+ ) ;
982
+ let labels = vec ! [
983
+ ( call_span, "The function is called here" . into( ) ) ,
984
+ ( arg_span, format!( "This argument has type `{arg_ty}`" ) . into( ) )
985
+ ] ;
986
+
987
+ let mut notes = vec ! [ ] ;
988
+ notes. push ( format ! ( "`{function}` accepts the following types for argument #{}:" , arg_index + 1 ) ) ;
989
+ notes. extend ( allowed. iter ( ) . map ( |ty| format ! ( "allowed type: {ty}" ) ) ) ;
990
+
991
+ ParseError { message, labels, notes }
992
+ } ,
993
+ Error :: InconsistentArgumentType {
994
+ ref function,
995
+ call_span,
996
+ arg_span,
997
+ arg_index,
998
+ ref arg_ty,
999
+ prior_span,
1000
+ prior_index,
1001
+ ref prior_ty,
1002
+ ref allowed
1003
+ } => {
1004
+ let message = format ! (
1005
+ "Inconsistent type passed as argument #{} to `{function}`" ,
1006
+ arg_index + 1 ,
1007
+ ) ;
1008
+ let labels = vec ! [
1009
+ ( call_span, "The function is called here" . into( ) ) ,
1010
+ ( arg_span, format!( "This argument has type {arg_ty}" ) . into( ) ) ,
1011
+ ( prior_span, format!(
1012
+ "This argument has type {prior_ty}, which constrains subsequent arguments"
1013
+ ) . into( ) ) ,
1014
+ ] ;
1015
+ let mut notes = vec ! [
1016
+ format!( "Because argument #{} has type {prior_ty}, only the following types" , prior_index + 1 ) ,
1017
+ format!( "(or types that automatically convert to them) are accepted for argument #{}:" , arg_index + 1 ) ,
1018
+ ] ;
1019
+ notes. extend ( allowed. iter ( ) . map ( |ty| format ! ( "allowed type: {ty}" ) ) ) ;
1020
+
1021
+ ParseError { message, labels, notes }
1022
+ }
1023
+ Error :: AmbiguousCall { call_span, ref alternatives } => {
1024
+ let message = "Function call is ambiguous: more than one overload could apply" . into ( ) ;
1025
+ let labels = vec ! [
1026
+ ( call_span, "More than one overload of this function could apply to these arguments" . into( ) ) ,
1027
+ ] ;
1028
+ let mut notes = vec ! [
1029
+ "All of the following overloads could apply, but no one overload is clearly preferable:" . into( )
1030
+ ] ;
1031
+ notes. extend ( alternatives. iter ( ) . map ( |alt| format ! ( "possible overload: {alt}" ) ) ) ;
1032
+ ParseError { message, labels, notes }
1033
+ } ,
828
1034
Error :: FunctionReturnsVoid ( span) => ParseError {
829
1035
message : "function does not return any value" . to_string ( ) ,
830
1036
labels : vec ! [ ( span, "" . into( ) ) ] ,
0 commit comments