From: "k0kubun (Takashi Kokubun) via ruby-core" Date: 2026-07-09T18:40:24+00:00 Subject: [ruby-core:126003] [Ruby Bug#22183] parse.y interpolation inside lambda literal Issue #22183 has been updated by k0kubun (Takashi Kokubun). ruby_4_0 backport draft PR: https://github.com/ruby/ruby/pull/17761 ---------------------------------------- Bug #22183: parse.y interpolation inside lambda literal https://bugs.ruby-lang.org/issues/22183#change-117981 * Author: kddnewton (Kevin Newton) * Status: Closed * Backport: 3.3: REQUIRED, 3.4: REQUIRED, 4.0: REQUIRED ---------------------------------------- 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. ```ruby -> a = "#{foo do end}" do end ``` ```console $ 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: ```ruby -> 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: ```ruby -> a = ("#{foo do end}") do end # parse.y: OK -> a = "#{foo do end}" do end # parse.y: syntax error ``` -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/