diff --git a/prism/prism.c b/prism/prism.c index 744b25c816f891..95bfc5a8dbec60 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -14546,7 +14546,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power) { if (accept1(parser, PM_TOKEN_LESS_LESS)) { pm_token_t operator = parser->previous; - pm_node_t *expression = parse_expression(parser, PM_BINDING_POWER_NOT, PM_ERR_EXPECT_EXPRESSION_AFTER_LESS_LESS); + pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_NOT, PM_ERR_EXPECT_EXPRESSION_AFTER_LESS_LESS); pm_parser_scope_push(parser, true); accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); diff --git a/test/prism/errors_test.rb b/test/prism/errors_test.rb index 5572a3254ffa0e..6f6df71d1408aa 100644 --- a/test/prism/errors_test.rb +++ b/test/prism/errors_test.rb @@ -1508,6 +1508,8 @@ def test_void_value_expression_in_statement end class A < (return) end + class << (return) + end for x in (return) end RUBY @@ -1520,6 +1522,7 @@ class A < (return) [message, 80..86], [message, 110..116], [message, 132..138], + [message, 154..160], ], compare_ripper: false # Ripper does not check 'void value expression'. end