Bug #13073
closedHash Key => Proc parse failure
Description
A Hash that stores multiple Proc literals causes syntax failures when passed as a method argument. Specifically, this only appears to happen on the second Proc literal in a Hash, not the first.
Minimal test case:
def foo a, h
[a, h]
end
foo :bar, {
a: proc do
end,
b: proc do
end
}
Attempting to load this code causes the following error:
SyntaxError: test.rb:8: syntax error, unexpected keyword_do_block, expecting '}'
b: proc do
^
I first encountered this while attempting to run the Middleman gem (version 4.2.0). The specific error is:
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:194: syntax error, unexpected keyword_do_block, expecting '}' (SyntaxError)
layout: proc do |file, app|
^
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:194: syntax error, unexpected '|', expecting '='
layout: proc do |file, app|
^
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:197: syntax error, unexpected '}', expecting keyword_end
}, 'Callbacks that can exclude
^
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:460: syntax error, unexpected keyword_end, expecting end-of-input
The offending code is visible on GitHub, here.
Updated by myrrlyn (Alexander Payne) almost 8 years ago
A Hash that stores multiple Proc literals causes syntax failures when passed as a method argument. Specifically, this only appears to happen on the second Proc literal in a Hash, not the first.
Minimal test case:
def foo a, h
[a, h]
end
foo :bar, {
a: proc do
end,
b: proc do
end
}
Attempting to load this code causes the following error:
SyntaxError: test.rb:8: syntax error, unexpected keyword_do_block, expecting '}'
b: proc do
^
Note that simply commenting out the lines for b: proc do \n end
cause the file to be successfully parsed.
def foo a, h
[a, h]
end
foo :bar, {
a: proc do
end,
# b: proc do
# end
}
I first encountered this while attempting to run the Middleman gem (version 4.2.0). The specific error is:
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:194: syntax error, unexpected keyword_do_block, expecting '}' (SyntaxError)
layout: proc do |file, app|
^
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:194: syntax error, unexpected '|', expecting '='
layout: proc do |file, app|
^
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:197: syntax error, unexpected '}', expecting keyword_end
}, 'Callbacks that can exclude
^
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:460: syntax error, unexpected keyword_end, expecting end-of-input
The offending code is visible on GitHub, here.
Updated by nobu (Nobuyoshi Nakada) almost 8 years ago
- Status changed from Open to Closed
Applied in changeset r57198.
parse.y: preserve cmdarg stack
- parse.y (do_body): preserve cmdarg stack around do/end block.
[ruby-core:78837] [Bug #13073]
Updated by naruse (Yui NARUSE) over 7 years ago
- Backport changed from 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN to 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: DONE
ruby_2_4 r57837 merged revision(s) 57198.