@@ -271,6 +271,79 @@ pub(crate) enum Error<'a> {
271
271
expected : Range < u32 > ,
272
272
found : u32 ,
273
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
+ /// A value passed to a builtin function has a type that is not
290
+ /// accepted by any overload of the function.
291
+ WrongArgumentType {
292
+ /// The name of the function being called.
293
+ function : String ,
294
+
295
+ /// The function name in the call expression.
296
+ call_span : Span ,
297
+
298
+ /// The first argument whose type is unacceptable.
299
+ arg_span : Span ,
300
+
301
+ /// The index of the first argument whose type is unacceptable.
302
+ arg_index : u32 ,
303
+
304
+ /// That argument's actual type.
305
+ arg_ty : String ,
306
+
307
+ /// The set of argument types that would have been accepted for
308
+ /// this argument, given the prior arguments.
309
+ allowed : Vec < String > ,
310
+ } ,
311
+ /// A value passed to a builtin function has a type that is not
312
+ /// accepted, given the earlier arguments' types.
313
+ InconsistentArgumentType {
314
+ /// The name of the function being called.
315
+ function : String ,
316
+
317
+ /// The function name in the call expression.
318
+ call_span : Span ,
319
+
320
+ /// The first unacceptable argument.
321
+ arg_span : Span ,
322
+
323
+ /// The index of the first unacceptable argument.
324
+ arg_index : u32 ,
325
+
326
+ /// The actual type of the first unacceptable argument.
327
+ arg_ty : String ,
328
+
329
+ /// The prior argument whose type made the `arg_span` argument
330
+ /// unacceptable.
331
+ prior_span : Span ,
332
+
333
+ /// The index of the `prior_arg_span` argument.
334
+ prior_index : u32 ,
335
+
336
+ /// The type of the `prior_arg_span` argument.
337
+ prior_ty : String ,
338
+
339
+ /// The types that would have been accepted instead of the
340
+ /// first unacceptable argument.
341
+ allowed : Vec < String > ,
342
+ } ,
343
+ AmbiguousCall {
344
+ call_span : Span ,
345
+ alternatives : Vec < String > ,
346
+ } ,
274
347
FunctionReturnsVoid ( Span ) ,
275
348
FunctionMustUseUnused ( Span ) ,
276
349
FunctionMustUseReturnsVoid ( Span , Span ) ,
@@ -402,7 +475,8 @@ impl<'a> Error<'a> {
402
475
"workgroup size separator (`,`) or a closing parenthesis" . to_string ( )
403
476
}
404
477
ExpectedToken :: GlobalItem => concat ! (
405
- "global item (`struct`, `const`, `var`, `alias`, `fn`, `diagnostic`, `enable`, `requires`, `;`) " ,
478
+ "global item (`struct`, `const`, `var`, `alias`, " ,
479
+ "`fn`, `diagnostic`, `enable`, `requires`, `;`) " ,
406
480
"or the end of the file"
407
481
)
408
482
. to_string ( ) ,
@@ -831,6 +905,85 @@ impl<'a> Error<'a> {
831
905
labels : vec ! [ ( span, "wrong number of arguments" . into( ) ) ] ,
832
906
notes : vec ! [ ] ,
833
907
} ,
908
+ Error :: TooManyArguments {
909
+ ref function,
910
+ call_span,
911
+ arg_span,
912
+ max_arguments,
913
+ } => ParseError {
914
+ message : format ! ( "too many arguments passed to `{function}`" ) ,
915
+ labels : vec ! [
916
+ ( call_span, "" . into( ) ) ,
917
+ ( arg_span, format!( "unexpected argument #{}" , max_arguments + 1 ) . into( ) )
918
+ ] ,
919
+ notes : vec ! [
920
+ format!( "The `{function}` function accepts at most {max_arguments} argument(s)" )
921
+ ] ,
922
+ } ,
923
+ Error :: WrongArgumentType {
924
+ ref function,
925
+ call_span,
926
+ arg_span,
927
+ arg_index,
928
+ ref arg_ty,
929
+ ref allowed,
930
+ } => {
931
+ let message = format ! (
932
+ "wrong type passed as argument #{} to `{function}`" ,
933
+ arg_index + 1 ,
934
+ ) ;
935
+ let labels = vec ! [
936
+ ( call_span, "" . into( ) ) ,
937
+ ( arg_span, format!( "argument #{} has type `{arg_ty}`" , arg_index + 1 ) . into( ) )
938
+ ] ;
939
+
940
+ let mut notes = vec ! [ ] ;
941
+ notes. push ( format ! ( "`{function}` accepts the following types for argument #{}:" , arg_index + 1 ) ) ;
942
+ notes. extend ( allowed. iter ( ) . map ( |ty| format ! ( "allowed type: {ty}" ) ) ) ;
943
+
944
+ ParseError { message, labels, notes }
945
+ } ,
946
+ Error :: InconsistentArgumentType {
947
+ ref function,
948
+ call_span,
949
+ arg_span,
950
+ arg_index,
951
+ ref arg_ty,
952
+ prior_span,
953
+ prior_index,
954
+ ref prior_ty,
955
+ ref allowed
956
+ } => {
957
+ let message = format ! (
958
+ "inconsistent type passed as argument #{} to `{function}`" ,
959
+ arg_index + 1 ,
960
+ ) ;
961
+ let labels = vec ! [
962
+ ( call_span, "" . into( ) ) ,
963
+ ( arg_span, format!( "argument #{} has type {arg_ty}" , arg_index + 1 ) . into( ) ) ,
964
+ ( prior_span, format!(
965
+ "this argument has type {prior_ty}, which constrains subsequent arguments"
966
+ ) . into( ) ) ,
967
+ ] ;
968
+ let mut notes = vec ! [
969
+ format!( "Because argument #{} has type {prior_ty}, only the following types" , prior_index + 1 ) ,
970
+ format!( "(or types that automatically convert to them) are accepted for argument #{}:" , arg_index + 1 ) ,
971
+ ] ;
972
+ notes. extend ( allowed. iter ( ) . map ( |ty| format ! ( "allowed type: {ty}" ) ) ) ;
973
+
974
+ ParseError { message, labels, notes }
975
+ }
976
+ Error :: AmbiguousCall { call_span, ref alternatives } => {
977
+ let message = "function call is ambiguous: more than one overload could apply" . into ( ) ;
978
+ let labels = vec ! [
979
+ ( call_span, "more than one overload of this function could apply to these arguments" . into( ) ) ,
980
+ ] ;
981
+ let mut notes = vec ! [
982
+ "All of the following overloads could apply, but no one overload is clearly preferable:" . into( )
983
+ ] ;
984
+ notes. extend ( alternatives. iter ( ) . map ( |alt| format ! ( "possible overload: {alt}" ) ) ) ;
985
+ ParseError { message, labels, notes }
986
+ } ,
834
987
Error :: FunctionReturnsVoid ( span) => ParseError {
835
988
message : "function does not return any value" . to_string ( ) ,
836
989
labels : vec ! [ ( span, "" . into( ) ) ] ,
0 commit comments