From: merch-redmine@... Date: 2020-01-24T20:20:23+00:00 Subject: [ruby-core:96993] [Ruby master Bug#16560] Proc autosplats first argument if called with one argument and empty keyword splat Issue #16560 has been updated by jeremyevans0 (Jeremy Evans). Backport changed from 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN to 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: REQUIRED I have submitted a pull request to fix this: https://github.com/ruby/ruby/pull/2861 Note that behavior still changes slightly compared to 2.6: ```ruby h = {} b.call([1,2,3],**h) #=> [[1, 2, 3], 0] (with patch) #=> [[1, 2, 3], {}] (in 2.6) ``` This is because the splat argument is still removed, so only a single argument is provided, and the second parameter uses the default argument. This is the expected behavior in 2.7+. ---------------------------------------- Bug #16560: Proc autosplats first argument if called with one argument and empty keyword splat https://bugs.ruby-lang.org/issues/16560#change-84050 * Author: Dan0042 (Daniel DeLorme) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: REQUIRED ---------------------------------------- While working on understanding the vm_args.c code via refactoring, I found the following: ```ruby b = proc{ |a,b=0| [a,b] } h = {k:42} b.call([1,2,3],**h) #=> [[1, 2, 3], {:k=>42}] h = {} b.call([1,2,3],**h) #=> [1, 2] (in 2.7) #=> [[1, 2, 3], {}] (in 2.6) ``` Since the result is different from 2.6 I think this is a bug, especially since the result in 2.7 is so different based on being an empty or non-empty splat. In my refactoring branch I'm solving this by moving the `args_check_block_arg0` check before the `ignore_keyword_hash_p` check, but that doesn't look so easy in master. -- https://bugs.ruby-lang.org/ Unsubscribe: