[ruby-core:121234] [Ruby master Bug#21168] Prism doesn't require argument parentheses (in some cases) when a block is present but parse.y does

Issue #21168 has been reported by Earlopain (Earlopain _). ---------------------------------------- Bug #21168: Prism doesn't require argument parentheses (in some cases) when a block is present but parse.y does https://bugs.ruby-lang.org/issues/21168 * Author: Earlopain (Earlopain _) * Status: Open * ruby -v: ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- It's a bit more than that but explaining it in full would be a bit much. Instead, see this: ```rb foo( bar baz do end ) ``` ```sh $ ruby -c --parser=prism test.rb Syntax OK $ ruby -c --parser=parse.y test.rb ruby: test.rb:2: syntax error, unexpected 'do' for block, expecting ')' (SyntaxError) bar baz do ^~ ``` OTOH, this is consistently rejected: ```rb [ foo bar do end, ] # And also foo || bar baz do end ``` -- https://bugs.ruby-lang.org/

Issue #21168 has been updated by tenderlovemaking (Aaron Patterson). Assignee set to prism ---------------------------------------- Bug #21168: Prism doesn't require argument parentheses (in some cases) when a block is present but parse.y does https://bugs.ruby-lang.org/issues/21168#change-112184 * Author: Earlopain (Earlopain _) * Status: Open * Assignee: prism * ruby -v: ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- It's a bit more than that but explaining it in full would be a bit much. Instead, see this: ```rb foo( bar baz do end ) ``` ```sh $ ruby -c --parser=prism test.rb Syntax OK $ ruby -c --parser=parse.y test.rb ruby: test.rb:2: syntax error, unexpected 'do' for block, expecting ')' (SyntaxError) bar baz do ^~ ``` OTOH, this is consistently rejected: ```rb [ foo bar do end, ] # And also foo || bar baz do end ``` -- https://bugs.ruby-lang.org/

Issue #21168 has been updated by eileencodes (Eileen Uchitelle). I took a look at this and I'm not sure any of these cases should fail - which would mean the consistently rejected cases are incorrect. If the argument is wrapped in parenthesis it passes the syntax check (in all cases provided in this report). Prism can parse the first example without error, and if all the methods are defined it runs and produces correct results. So I'd argue that `parse.y` is incorrect in all cases and Prism should be fixed for the last two. Also for what it's worth, with `parse.y` the last two examples point to the passed argument as where the syntax error is occurring, whereas the first example points to the `do` keyword. If it's decided these should all error, I think the error should be consistent in which part of these examples are incorrect (ie is it the argument passes to `bar` or is it the `do` keyword that's unexpected?) Syntax error at the `1` argument with parse.y. ``` [ bar 1 do end ] => ./miniruby: test.rb:2: syntax error, unexpected integer literal, expecting 'do' or '{' or '(' (SyntaxError) bar 1 do ^ ``` Syntax error at the `do` keyword with parse.y: ``` foo( bar 1 do end ) => ./miniruby: test2.rb:2: syntax error, unexpected 'do' for block, expecting ')' (SyntaxError) bar 1 do ^~ ``` ---------------------------------------- Bug #21168: Prism doesn't require argument parentheses (in some cases) when a block is present but parse.y does https://bugs.ruby-lang.org/issues/21168#change-112213 * Author: Earlopain (Earlopain _) * Status: Open * Assignee: prism * ruby -v: ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- It's a bit more than that but explaining it in full would be a bit much. Instead, see this: ```rb foo( bar baz do end ) ``` ```sh $ ruby -c --parser=prism test.rb Syntax OK $ ruby -c --parser=parse.y test.rb ruby: test.rb:2: syntax error, unexpected 'do' for block, expecting ')' (SyntaxError) bar baz do ^~ ``` OTOH, this is consistently rejected: ```rb [ foo bar do end, ] # And also foo || bar baz do end ``` -- https://bugs.ruby-lang.org/

Issue #21168 has been updated by Earlopain (Earlopain _). I found out that this was discussed in a developer meeting: https://github.com/ruby/dev-meeting-log/blob/c35441297cd397fa3626ca0aa38efd7... matz said:
matz: I'll reply it. I like parse.y behavior. I don't want to allow the code any more
I revisited this and got more weird behaviour: ```rb # Accepted by both foo( bar baz { } ) # Accepted by both ( bar baz do end ) ``` I don't think these are so different that they should suddenly be allowed. Should this be consistenly rejected in both parsers? ---------------------------------------- Bug #21168: Prism doesn't require argument parentheses (in some cases) when a block is present but parse.y does https://bugs.ruby-lang.org/issues/21168#change-114463 * Author: Earlopain (Earlopain _) * Status: Assigned * Assignee: prism * ruby -v: ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- It's a bit more than that but explaining it in full would be a bit much. Instead, see this: ```rb foo( bar baz do end ) ``` ```sh $ ruby -c --parser=prism test.rb Syntax OK $ ruby -c --parser=parse.y test.rb ruby: test.rb:2: syntax error, unexpected 'do' for block, expecting ')' (SyntaxError) bar baz do ^~ ``` OTOH, this is consistently rejected: ```rb [ foo bar do end, ] # And also foo || bar baz do end ``` -- https://bugs.ruby-lang.org/

Issue #21168 has been updated by mame (Yusuke Endoh). Discussed at the dev meeting. Matz said that he wanted to permit passing a single command (a method call without parentheses) as an argument to a method call with parentheses. So, parse.y should accept the following, unless it is technically difficult. ```ruby foo( bar baz do end ) ``` And currently Prism accepts the following, but it must be rejected. ```ruby foo( bar baz do end, 1, 2, 3 ) ``` BTW, Matz confirmed that the two code fragments that @Earlopain showed should be both accepted. Currently both parsers accept them, so there is no problem. ```ruby # A single command as an argument, which should be accepted foo( bar baz { } ) # This is not related to this topic because it is not an argument. This should be accepted ( bar baz do end ) ---------------------------------------- Bug #21168: Prism doesn't require argument parentheses (in some cases) when a block is present but parse.y does https://bugs.ruby-lang.org/issues/21168#change-114620 * Author: Earlopain (Earlopain _) * Status: Assigned * Assignee: prism * ruby -v: ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- It's a bit more than that but explaining it in full would be a bit much. Instead, see this: ```rb foo( bar baz do end ) ``` ```sh $ ruby -c --parser=prism test.rb Syntax OK $ ruby -c --parser=parse.y test.rb ruby: test.rb:2: syntax error, unexpected 'do' for block, expecting ')' (SyntaxError) bar baz do ^~ ``` OTOH, this is consistently rejected: ```rb [ foo bar do end, ] # And also foo || bar baz do end ``` -- https://bugs.ruby-lang.org/

Issue #21168 has been updated by Earlopain (Earlopain _). For prism https://github.com/ruby/prism/pull/3652. I implemented the rules as how I understood they should be, please double-check the added examples for correctness. ---------------------------------------- Bug #21168: Prism doesn't require argument parentheses (in some cases) when a block is present but parse.y does https://bugs.ruby-lang.org/issues/21168#change-114650 * Author: Earlopain (Earlopain _) * Status: Assigned * Assignee: prism * ruby -v: ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- It's a bit more than that but explaining it in full would be a bit much. Instead, see this: ```rb foo( bar baz do end ) ``` ```sh $ ruby -c --parser=prism test.rb Syntax OK $ ruby -c --parser=parse.y test.rb ruby: test.rb:2: syntax error, unexpected 'do' for block, expecting ')' (SyntaxError) bar baz do ^~ ``` OTOH, this is consistently rejected: ```rb [ foo bar do end, ] # And also foo || bar baz do end ``` -- https://bugs.ruby-lang.org/

Issue #21168 has been updated by kddnewton (Kevin Newton). Status changed from Assigned to Open Assignee deleted (prism) This is done from Prism's side thanks to @Earlopain with https://github.com/ruby/ruby/commit/71067aa54c9fd819313dd2d35cb5b32803a65ad4. I think it needs an update for parse.y, so leaving it open. ---------------------------------------- Bug #21168: Prism doesn't require argument parentheses (in some cases) when a block is present but parse.y does https://bugs.ruby-lang.org/issues/21168#change-114670 * Author: Earlopain (Earlopain _) * Status: Open * ruby -v: ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- It's a bit more than that but explaining it in full would be a bit much. Instead, see this: ```rb foo( bar baz do end ) ``` ```sh $ ruby -c --parser=prism test.rb Syntax OK $ ruby -c --parser=parse.y test.rb ruby: test.rb:2: syntax error, unexpected 'do' for block, expecting ')' (SyntaxError) bar baz do ^~ ``` OTOH, this is consistently rejected: ```rb [ foo bar do end, ] # And also foo || bar baz do end ``` -- https://bugs.ruby-lang.org/
participants (5)
-
Earlopain (Earlopain _)
-
eileencodes (Eileen Uchitelle)
-
kddnewton (Kevin Newton)
-
mame (Yusuke Endoh)
-
tenderlovemaking (Aaron Patterson)