From: "jeremyevans0 (Jeremy Evans)" Date: 2022-03-29T21:58:10+00:00 Subject: [ruby-core:108111] [Ruby master Bug#18396] An unexpected "hash value omission" syntax error when without parentheses call expr follows Issue #18396 has been updated by jeremyevans0 (Jeremy Evans). mame (Yusuke Endoh) wrote in #note-6: > ```diff > diff --git a/parse.y b/parse.y > index 0ff3ddbb4e..73deae8627 100644 > --- a/parse.y > +++ b/parse.y > @@ -9291,6 +9291,9 @@ parser_yylex(struct parser_params *p) > c = (IS_lex_state(EXPR_BEG|EXPR_CLASS|EXPR_FNAME|EXPR_DOT) && > !IS_lex_state(EXPR_LABELED)); > if (c || IS_lex_state_all(EXPR_ARG|EXPR_LABELED)) { > + if (IS_lex_state_all(EXPR_ARG|EXPR_LABELED) && !p->lex.paren_nest) { > + rb_warn0("keyword label followed by newline without parentheses will be changed in Ruby 3.3"); > + } > if (!fallthru) { > dispatch_scan_event(p, tIGNORED_NL); > } > ``` I did some testing with this and found it that warns for method definitions with required keywords, such as: ```ruby def obj.foo a: a end ``` Since the behavior for that wouldn't change, I don't think this warning will work. We'll have to figure out a way to issue the warning only in the method call case and not in the method definition case. I guess that means we'll have to move the warning from the lexer to the parser. ---------------------------------------- Bug #18396: An unexpected "hash value omission" syntax error when without parentheses call expr follows https://bugs.ruby-lang.org/issues/18396#change-97076 * Author: koic (Koichi ITO) * Status: Open * Priority: Normal * ruby -v: ruby 3.1.0dev (2021-12-07T23:18:11Z master 4a3e7984bf) [x86_64-darwin19] * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- ## Summary I encountered an unexpected "hash value omission" syntax error when parentheses call expression follows: ```ruby % cat example.rb foo key: foo arg ``` ```console % ruby -cv /tmp/b.rb ruby 3.1.0dev (2021-12-07T23:18:11Z master 4a3e7984bf) [x86_64-darwin19] example.rb:2: syntax error, unexpected local variable or method, expecting `do' or '{' or '(' foo arg ``` ## Additional Information The following is a traditional usage. ```ruby # No errors. foo key: key foo arg ``` A syntax error is unexpectedly raised when hash value omission argument without parentheses is followed by a method call without parentheses. ```ruby # No errors is expected, but syntax error is raised. foo key: foo arg ``` No error occurs if any of the calls have parentheses. ```ruby # No errors. foo(key:) foo arg ``` ```ruby # Also no errors. foo key: foo(arg) ``` No error occurs when calling alone. ```ruby # No errors. foo key: ``` I encountered this error while trying to apply hash value omission to RSpec code of a real-world application (proprietary) . But this is a new Ruby 3.1 syntax and may not be supported yet. Thank you. -- https://bugs.ruby-lang.org/ Unsubscribe: