Project

General

Profile

Actions

Bug #21378

open

variable pinning does not look for method arguments

Added by shyouhei (Shyouhei Urabe) 1 day ago. Updated 1 day ago.

Status:
Assigned
Target version:
-
ruby -v:
ruby 3.5.0dev (2025-01-23T15:24:35Z origin/7ed08c4fd31.. 7ed08c4fd3) +PRISM [wasm32-wasi]
[ruby-core:<unknown>]

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'
Actions #1

Updated by nobu (Nobuyoshi Nakada) 1 day ago

It is parsed as (def x?(y, z) = y) in { x: ^z }.

Actions #2

Updated by hsbt (Hiroshi SHIBATA) 1 day ago

  • Status changed from Open to Assigned
Actions #3

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

Also available in: Atom PDF

Like0
Like0Like0Like0