Project

General

Profile

Actions

Bug #20570

closed

Nokey behavior changed since 3.3.

Added by ksss (Yuki Kurihara) 5 months ago. Updated 5 months ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 3.3.2 (2024-05-30 revision e5a195edf6) [arm64-darwin22]
[ruby-core:118269]

Description

I am using code that transfers the following method call, but found that the behavior has changed since CRuby 3.3.

receiver_value = Set.new
method_name = :merge
args = [1]
kwargs = {}
block = nil
receiver_value.__send__(method_name, *args, **kwargs, &block)
# => no keywords accepted (ArgumentError)

Upon investigation, I found that the behavior of calling a method using **nil has changed starting from version 3.3.

$ docker run -it --rm rubylang/all-ruby env ALL_RUBY_SINCE=ruby-2.6 ./all-ruby -e 'def foo(*, **nil); end; p foo(*[], **{})'
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
ruby-2.6.0          -e:1: syntax error, unexpected nil, expecting ')'
                    def foo(*, **nil); end; p foo(*[], **{})
                                 ^~~
                exit 1
...
ruby-2.6.10         -e:1: syntax error, unexpected nil, expecting ')'
                    def foo(*, **nil); end; p foo(*[], **{})
                                 ^~~
                exit 1
ruby-2.7.0-preview1 -e:1: syntax error, unexpected `nil', expecting ')'
                    def foo(*, **nil); end; p foo(*[], **{})
                                 ^~~
                exit 1
ruby-2.7.0-preview2 nil
...
ruby-3.2.4          nil
ruby-3.3.0-preview1 -e:1:in `<main>': no keywords accepted (ArgumentError)

                    def foo(*, **nil); end; p foo(*[], **{})
                                                  ^^^^^^^^^
                exit 1
...
ruby-3.3.2          -e:1:in `<main>': no keywords accepted (ArgumentError)

                    def foo(*, **nil); end; p foo(*[], **{})
                                                  ^^^^^^^^^
                exit 1
ruby-3.4.0-preview1 -e:1:in '<main>': no keywords accepted (ArgumentError)

                    def foo(*, **nil); end; p foo(*[], **{})
                                                  ^^^^^^^^^
                exit 1

Is this change intentional?

Updated by austin (Austin Ziegler) 5 months ago

I believe you’re defining with **nil, not calling with **nil. Your test should probably be def foo(*, **); end; p foo(*[], **nil).

This does seem to be a bit of a regression for your particular use case.

Updated by mame (Yusuke Endoh) 5 months ago

  • Status changed from Open to Assigned
  • Assignee set to ko1 (Koichi Sasada)

The following example is easy to understand this issue:

def foo(*, **nil); :ok; end

foo(1, **{})    #=> Ruby 3.2: :ok
                #=> Ruby 3.3: :ok
foo(*[1], **{}) #=> Ruby 3.2: :ok
                #=> Ruby 3.3: no keywords accepted (ArgumentError)

It's an obvious regression.

Accoding to git bisect, the behavior has changed with e87d0882910001ef3b0c2ccd43bf00cee8c34a0c. @ko1 (Koichi Sasada) Could you take a look?

Actions #4

Updated by jeremyevans0 (Jeremy Evans) 5 months ago

  • Backport changed from 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN to 3.1: DONTNEED, 3.2: DONTNEED, 3.3: REQUIRED
Actions #6

Updated by ko1 (Koichi Sasada) 5 months ago

  • Status changed from Assigned to Closed

Updated by k0kubun (Takashi Kokubun) 5 months ago

The patch doesn't apply to Ruby 3.3 cleanly. Could anybody file a backport PR to ruby_3_3 branch?

Updated by k0kubun (Takashi Kokubun) 5 months ago

I think I managed to fix the conflict. I'd appreciate a backport PR next time though.

Updated by k0kubun (Takashi Kokubun) 5 months ago

  • Backport changed from 3.1: DONTNEED, 3.2: DONTNEED, 3.3: REQUIRED to 3.1: DONTNEED, 3.2: DONTNEED, 3.3: DONE
Actions

Also available in: Atom PDF

Like0
Like0Like0Like1Like0Like0Like0Like0Like0Like0