Issue #14506 has been updated by ibylich (Ilya Bylich).


I've sent a PR https://github.com/ruby/ruby/pull/1823

----------------------------------------
Bug #14506: Possible bug in cmdarg_stack
https://bugs.ruby-lang.org/issues/14506#change-70581

* Author: ibylich (Ilya Bylich)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.6.0dev (2018-02-19 trunk 62484) [x86_64-darwin17]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
cmdarg stack is a stack of bytes that has 1 on top of it when the parser is in the command mode.

But for this code:

~~~ ruby
a b(c d), "x" do end
~~~

And this line in parse.y:

~~~ c
> SHOW_BITSTACK(p->cmdarg_stack, "BEFORE kDO_BLOCK");
if (CMDARG_P() && !IS_lex_state_for(state, EXPR_CMDARG))
  return keyword_do_block;
~~~

It prints:

~~~ text
$ dev-ruby -vye 'a b(c d), "x" do end' | grep -E "kDO_BLOCK"
BEFORE kDO_BLOCK: 10 at line 7461
~~~

So CMDARG_P is false. I understand that 'keyword_do_block" is handled later in the "if (IS_lex_state_for(state, (EXPR_BEG | EXPR_ENDARG)))" section, but is it possible to change parser to rely only on cmdarg stack?



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>