Project

General

Profile

Actions

Bug #22183

closed

parse.y interpolation inside lambda literal

Bug #22183: parse.y interpolation inside lambda literal

Added by kddnewton (Kevin Newton) 1 day ago. Updated about 18 hours ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:125939]

Description

This is an odd bug that I think is just leaking parse.y internals to do with paren_nest and lambda_beginning_p.

In parse.y, p->lex.lpar_beg is not isolated when the lexer enters a string interpolation (tSTRING_DBEG). So lambda_beginning_p() can be true inside an interpolation that appears between a lambda's -> and its body, causing a do or { inside the interpolation to be lexed as keyword_do_LAMBDA / tLAMBEG and produce a syntax error.

-> a = "#{foo do end}" do end
$ ruby --parser=parse.y -c test.rb
test.rb: test.rb:1: syntax error found (SyntaxError)
> 1 | -> a = "#{foo do end}" do end
    |               ^~ unexpected 'do' for lambda, ...

The same applies with a brace block inside the interpolation:

-> a = "#{foo { }}" do end   # parse.y: syntax error at the `{`, lexed as tLAMBEG

I'm not 100% sure about this one to be honest. I guess it could potentially have been a design decision? But it seems inconsistent:

-> a = ("#{foo do end}") do end   # parse.y: OK
-> a = "#{foo do end}" do end     # parse.y: syntax error

Updated by nobu (Nobuyoshi Nakada) about 20 hours ago Actions #1

  • Status changed from Open to Closed

Applied in changeset git|3f7d4bc859f03f4c7ea131af910d1c4ae142586d.


[Bug #22183] Preserve lpar_beg across interpolation

Fix unexpected keyword_do_LAMBDA inside string interpolation within
default argument of lambda.

Updated by nobu (Nobuyoshi Nakada) about 18 hours ago Actions #2

  • Backport changed from 3.3: UNKNOWN, 3.4: UNKNOWN, 4.0: UNKNOWN to 3.3: REQUIRED, 3.4: REQUIRED, 4.0: REQUIRED
Actions

Also available in: PDF Atom