From a8c70ed2b42013158c1d5ebe11b8ed5aeed8eb45 Mon Sep 17 00:00:00 2001 From: HParker Date: Thu, 10 Aug 2023 10:17:43 -0700 Subject: [PATCH] [ruby/yarp] add a diagnostic for *rest in order after optional state https://github.com/ruby/yarp/commit/908244ba12 --- test/yarp/errors_test.rb | 16 ++++++++++++++++ yarp/yarp.c | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/test/yarp/errors_test.rb b/test/yarp/errors_test.rb index e705a6423c..0777efe47a 100644 --- a/test/yarp/errors_test.rb +++ b/test/yarp/errors_test.rb @@ -1076,6 +1076,22 @@ class ErrorsTest < Test::Unit::TestCase assert_errors expected, "def foo(a,b,&a);end", [ ["Duplicated parameter name.", 13..14] ] + + expected = DefNode( + Location(), + nil, + ParametersNode([], [OptionalParameterNode(:a, Location(), Location(), IntegerNode())], [RequiredParameterNode(:b)], RestParameterNode(Location(), Location()), [], nil, nil), + nil, + [:a, :b, :c], + Location(), + nil, + Location(), + Location(), + nil, + Location() + ) + + assert_errors expected, "def foo(a = 1,b,*c);end", [["Unexpected parameter *", 16..17]] end private diff --git a/yarp/yarp.c b/yarp/yarp.c index dcfde47d01..59ec35a03d 100644 --- a/yarp/yarp.c +++ b/yarp/yarp.c @@ -8312,6 +8312,10 @@ update_parameter_state(yp_parser_t *parser, yp_token_t *token, yp_parameters_ord return; } + if (token->type == YP_TOKEN_USTAR && *current == YP_PARAMETERS_ORDER_AFTER_OPTIONAL) { + yp_diagnostic_list_append(&parser->error_list, token->start, token->end, "Unexpected parameter *"); + } + if (*current == YP_PARAMETERS_ORDER_NOTHING_AFTER || state > *current) { // We know what transition we failed on, so we can provide a better error here. yp_diagnostic_list_append(&parser->error_list, token->start, token->end, "Unexpected parameter order");