Project

General

Profile

Bug #14690

Invalid CMDARG state after command_args followed by tLBRACE_ARG

Added by ibylich (Ilya Bylich) almost 2 years ago. Updated almost 2 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.6.0dev (2018-04-15 trunk 63161) [x86_64-darwin17]
[ruby-core:86551]

Description

assert_valid_syntax('let () { m(a) do; end }')

The patch that fixes it is attached.

tLBRACE_ARG does "CMDARG_PUSH(0)" in the lexer and then the parser leaves the "command_args" rule. The parser does "CMDARG_POP" to remove 1 from the top of the "CMDARG", but the thing here is that there's a 0 on top (the one pushed by tLBRACE_ARG) and the parser pops a wrong value. If the next token is tLBRACE_ARG the parser should pop 2nd top value (like "tmp = pop; pop; push(tmp)").

From what I understand that's the only token that can mutate "CMDARG" in the lexer and that can be emitted after command args.

I've found it during stress-testing a parser gem and that's the only issue that I was able to find so far.


Files

Also available in: Atom PDF