Actions
Bug #21378
openvariable pinning does not look for method arguments
ruby -v:
ruby 3.5.0dev (2025-01-23T15:24:35Z origin/7ed08c4fd31.. 7ed08c4fd3) +PRISM [wasm32-wasi]
Description
Is this intentional?
irb(main):001> def x?(y, z) = y in { x: ^z }
<internal:kernel>:168:in 'Kernel#loop': (irb):1: syntax error found (SyntaxError)
> 1 | def x?(y, z) = y in { x: ^z }
| ^ z: no such local variable
from eval_async:132:in '<main>'
from /bundle/gems/js-2.7.1/lib/js.rb:109:in 'Kernel.eval'
from /bundle/gems/js-2.7.1/lib/js.rb:109:in 'block in JS.__eval_async_rb'
from /bundle/gems/js-2.7.1/lib/js.rb:120:in 'block in JS.__async'
Updated by nobu (Nobuyoshi Nakada) 1 day ago
It is parsed as (def x?(y, z) = y) in { x: ^z }
.
Updated by hsbt (Hiroshi SHIBATA) 1 day ago
- Status changed from Open to Assigned
Updated by Eregon (Benoit Daloze) 1 day ago
- Assignee changed from prism to matz (Yukihiro Matsumoto)
It's the same with parse.y:
$ ruby -v --parser=parse.y -e 'def x?(y, z) = y in { x: ^z }'
ruby 3.5.0dev (2025-05-28T04:34:40Z master d064fd067b) [x86_64-linux]
-e:1: z: no such local variable
ruby: compile error (SyntaxError)
So I think we should assign matz and not prism.
I guess it's a pitfall of the weird precedence of def =
, which has already been reported many times in various variants.
def x?(y, z); y in { x: ^z }; end
works fine of course.
Actions
Like0
Like0Like0Like0