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: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>