💨

[Bug #21986] リテラルのあとに if が続く RubyVM::AST の位置が正しくないというバグ報告

に公開

[Bug #21986] RubyVM::AST incorrect location for literals followed by modifier if

  • リテラルのあとに if が続くと RubyVM::AST の位置が正しくないというバグ報告
  • 以下のように 1.0if true みたいなコードだと 1.0 の開始位置がおかしくなっている
# これは正しい
pp RubyVM::AbstractSyntaxTree.parse("1.0 if true")
# => (SCOPE@1:0-1:11 tbl: [] args: nil body: (IF@1:0-1:11 (TRUE@1:7-1:11) (FLOAT@1:0-1:3 1.0) nil))

# これは NG
pp RubyVM::AbstractSyntaxTree.parse("1.0if true")
# => (SCOPE@1:0-1:10 tbl: [] args: nil body: (IF@1:0-1:10 (TRUE@1:6-1:10) (FLOAT@1:3-1:3 1.0) nil))

pp RubyVM::AbstractSyntaxTree.parse("1if true")
# => (SCOPE@1:0-1:8 tbl: [] args: nil body: (IF@1:0-1:8 (TRUE@1:4-1:8) (INTEGER@1:1-1:1 1) nil))
  • そもそも 1.0if true って Ruby で有効な構文なんですね、知らなかった
  • この不具合は開発版の Ruby 4.1-dev で修正済
pp RubyVM::AbstractSyntaxTree.parse("1.0if true")
# Ruby 4.0 => (SCOPE@1:0-1:10 tbl: [] args: nil body: (IF@1:0-1:10 (TRUE@1:6-1:10) (FLOAT@1:3-1:3 1.0) nil))
# Ruby 4.1 => (SCOPE@1:0-1:10 tbl: [] args: nil body: (IF@1:0-1:10 (TRUE@1:6-1:10) (FLOAT@1:0-1:3 1.0) nil))
GitHubで編集を提案

Discussion