summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/ruby/test_keyword.rb8
-rw-r--r--vm_args.c2
2 files changed, 10 insertions, 0 deletions
diff --git a/test/ruby/test_keyword.rb b/test/ruby/test_keyword.rb
index e5c6da44c2..25337712fe 100644
--- a/test/ruby/test_keyword.rb
+++ b/test/ruby/test_keyword.rb
@@ -2664,6 +2664,10 @@ class TestKeywordArguments < Test::Unit::TestCase
baz(*args)
end
+ def pass_bar(*args)
+ bar(*args)
+ end
+
def bar(*args, **kw)
[args, kw]
end
@@ -2907,6 +2911,10 @@ class TestKeywordArguments < Test::Unit::TestCase
assert_equal([1, h1], o.baz(1, h1))
assert_equal([h1], o.baz(h1, **{}))
+ assert_warn(/The last argument is used as the keyword parameter.* for `bar'/m) do
+ assert_equal([[1], h1], o.foo(:pass_bar, 1, :a=>1))
+ end
+
assert_warn(/Skipping set of ruby2_keywords flag for bar \(method accepts keywords or method does not accept argument splat\)/) do
assert_nil(c.send(:ruby2_keywords, :bar))
end
diff --git a/vm_args.c b/vm_args.c
index 92deef5586..6fce593bf1 100644
--- a/vm_args.c
+++ b/vm_args.c
@@ -737,6 +737,8 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
if (!kw_flag && len > 0) {
if (RB_TYPE_P(rest_last, T_HASH) &&
(((struct RHash *)rest_last)->basic.flags & RHASH_PASS_AS_KEYWORDS)) {
+ rest_last = rb_hash_dup(rest_last);
+ RARRAY_ASET(args->rest, len - 1, rest_last);
kw_flag |= VM_CALL_KW_SPLAT;
}
else {