summaryrefslogtreecommitdiff
path: root/test/ruby/test_keyword.rb
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2019-10-15 12:46:24 -0700
committerJeremy Evans <code@jeremyevans.net>2019-10-15 12:46:24 -0700
commit6081ddd6e6f2297862b3c7e898d28a76b8f9240b (patch)
tree4c2e563c0d6ce60dc26fe350fb4677eebceb3af8 /test/ruby/test_keyword.rb
parent259601ab578885418b36138e457c2a93dd281896 (diff)
Dup hash with keyword flag when converted to keywords
When ruby2_keywords is used on a method, keywords passed to the method are flagged. When the hash is passed as the last element of an argument splat to another method, the hash should be treated as a keyword splat. When keyword splatting a hash, a duplicate of the hash is made. So when auto-splatting the hash with the keyword flag, a duplicate of the hash should also be made. This fixes cases where the hash is later passed to another method and would be treated as keywords there: class Object ruby2_keywords def foo(*a) bar(*a) end def bar(*a) baz(*a) end def baz(*a, **kw) [a, kw] end end foo(:a=>1) Previously, this would pass the :a=>1 as keywords to bar and also as keywords to baz. Now it only passes :a=>1 as keywords to bar, but bar passes :a=>1 as a positional hash to baz (which in this case generates a warning in 2.7).
Diffstat (limited to 'test/ruby/test_keyword.rb')
-rw-r--r--test/ruby/test_keyword.rb8
1 files changed, 8 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