From: ibylich@... Date: 2018-02-21T17:26:11+00:00 Subject: [ruby-core:85735] [Ruby trunk Bug#14506] Possible bug in cmdarg_stack Issue #14506 has been reported by ibylich (Ilya Bylich). ---------------------------------------- Bug #14506: Possible bug in cmdarg_stack https://bugs.ruby-lang.org/issues/14506 * 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: