Bug #22099
closedKeyword-only method silently accepts a positional argument
Description
A method that declares only keyword parameters accepts a positional argument without raising, but only from the second call onward; a prior valid keyword call to the same method is required to trigger it. Once triggered, the positional value is bound to the first keyword and an explicitly passed keyword of the same name is dropped.
class Foo
def bar(a: nil, b: nil)
p [:body, a: a, b: b]
end
end
foo = Foo.new
foo.bar(a: 1, b: 2) #=> [:body, {a: 1, b: 2}]
foo.bar(99, a: 0) #=> [:body, {a: 99, b: nil}]
foo.bar(99, b: 0) #=> [:body, {a: nil, b: 99}]
Although one positional argument is passed, no exception is raised. The positional value (99) is bound to the first keyword a, and the explicitly passed keyword (a: 0 / b: 0) is not reflected in the result.
Since bar accepts no positional arguments, an ArgumentError (wrong number of arguments (given 1, expected 0)) should be raised.
Updated by nobu (Nobuyoshi Nakada) about 2 months ago
- Backport changed from 3.3: UNKNOWN, 3.4: UNKNOWN, 4.0: UNKNOWN to 3.3: DONTNEED, 3.4: REQUIRED, 4.0: REQUIRED
It appears to be since 3.4.
Updated by jeremyevans0 (Jeremy Evans) about 2 months ago
I bisected the failure to 147ca9585ede559fd68e162cbbbaba84f009c9a1
CC @tenderlovemaking (Aaron Patterson) @jhawthorn (John Hawthorn)
Updated by luke-gru (Luke Gruber) 24 days ago
I created a PR. It's currently being reviewed.
Updated by Anonymous 18 days ago
- Status changed from Open to Closed
Applied in changeset git|034fa35ff042933ddb722cadf438e120dbe05881.
CI shape comparison needs to take into account # of kwargs given
If number of keyword arguments are not taken into account when comparing CI
shapes, invalid bindings happen:
class Foo
def bar(a: nil, b: nil)
p [:body, a: a, b: b]
end
end
foo = Foo.new
foo.bar(a: 1, b: 2) #=> [:body, {a: 1, b: 2}] # prime CC
foo.bar(99, a: 0) #=> [:body, {a: 99, b: nil}] # BAD!
Also, set max keywords to 2**16-1 so we don't grow the cc_entries_entry struct.
Fixes [Bug #22099]
Updated by k0kubun (Takashi Kokubun) 16 days ago
ruby_4_0 backport draft PR: https://github.com/ruby/ruby/pull/17763
Updated by k0kubun (Takashi Kokubun) 16 days ago
- Backport changed from 3.3: DONTNEED, 3.4: REQUIRED, 4.0: REQUIRED to 3.3: DONTNEED, 3.4: REQUIRED, 4.0: DONE
ruby_4_0 aad9ef5ce42d07004cebe4dab1d8d661a195d550 merged revision(s) 034fa35ff042933ddb722cadf438e120dbe05881.