Project

General

Profile

Actions

Bug #20817

closed

Ruby 3.4.0dev emits `warning: possibly useless use of + in void context` while Ruby 3.3.5 does not

Added by yahonda (Yasuo Honda) about 2 months ago. Updated 10 days ago.

Status:
Rejected
Assignee:
Target version:
-
ruby -v:
ruby 3.4.0dev (2024-10-25T11:52:32Z master 9c8c140d73) +PRISM [x86_64-linux]
[ruby-core:119622]

Description

Ruby 3.4.0dev emits warning: possibly useless use of + in void context while Ruby 3.3.5 does not

This issue is based on Rails Action Pack test case against Ruby 3.4.0dev.
Here is the minimum script to reproduce it.

Steps to reproduce

  • Create a sample foo.rb file
class C
  class_eval "def throw_syntax_error; eval %(
    'abc' + pluralize 'def'
  ); end", "lib/file.rb", 42
end
c = C.new
c.throw_syntax_error
  • Run this foo.rb using Ruby 3.4.0dev

Expected behavior

It should report SyntaxError, but it shoud not emit any warnings as Ruby 3.3.5 does not.

$ ruby -v
ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [x86_64-linux]
$ ruby -w foo.rb
lib/file.rb:42:in `eval': (eval at lib/file.rb:42):2: syntax error, unexpected string literal, expecting `do' or '{' or '(' (SyntaxError)
    'abc' + pluralize 'def'
                      ^

	from lib/file.rb:42:in `throw_syntax_error'
	from foo.rb:7:in `<main>'

Actual behavior

It reports It should SyntaxError and it emits the warning: possibly useless use of + in void context

$ ruby -v
ruby 3.4.0dev (2024-10-25T11:52:32Z master 9c8c140d73) +PRISM [x86_64-linux]
$ ruby -w foo.rb
(eval at lib/file.rb:42):2: warning: possibly useless use of + in void context
lib/file.rb:42:in 'Kernel#eval': (eval at lib/file.rb:42):2: syntax error found (SyntaxError)
  1 |
> 2 |     'abc' + pluralize 'def'
    |                       ^ unexpected string literal, expecting end-of-input
  3 |

	from lib/file.rb:42:in 'C#throw_syntax_error'
	from foo.rb:7:in '<main>'
$

Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #20736: prism emits wrong warnings in syntax-error codeFeedbackkddnewton (Kevin Newton)Actions

Updated by yahonda (Yasuo Honda) about 2 months ago

Here is the original Rails CI log file.
https://buildkite.com/rails/rails-nightly/builds/1214#0192c57b-b994-43cb-9f48-63b1b41e6f4e/1177-1185
"(eval at lib/file.rb:42):2: warning: possibly useless use of + in void context"

How to reproduce this behavior locally

git clone https://github.com/rails/rails
cd rails/actionpack
bundle install
bin/test test/dispatch/exception_wrapper_test.rb -n /source_extracts_works_with_eval_syntax_error/
$ ruby -v
ruby 3.4.0dev (2024-10-25T11:52:32Z master 9c8c140d73) +PRISM [x86_64-linux]
$ bin/test test/dispatch/exception_wrapper_test.rb -n /source_extracts_works_with_eval_syntax_error/
/home/yahonda/.rbenv/versions/trunk/lib/ruby/gems/3.4.0+0/gems/minitest-5.25.1/lib/minitest/mock.rb:33: warning: redefining 'object_id' may cause serious problems
/home/yahonda/.rbenv/versions/trunk/lib/ruby/gems/3.4.0+0/gems/capybara-3.40.0/lib/capybara/session/config.rb:95: warning: URI::RFC3986_PARSER.make_regexp is obsoleted. Use URI::RFC2396_PARSER.make_regexp explicitly.
Running 20 tests in a single process (parallelization threshold is 50)
Run options: -n /source_extracts_works_with_eval_syntax_error/ --seed 47290

# Running:

(eval at lib/file.rb:42):2: warning: possibly useless use of + in void context
.

Finished in 0.013903s, 71.9264 runs/s, 143.8528 assertions/s.
1 runs, 2 assertions, 0 failures, 0 errors, 0 skips
$

Updated by yahonda (Yasuo Honda) about 2 months ago

Using parse.y parser works as Ruby 3.3.5 does. No warnings emitted.

$ RUBYOPT=--parser=parse.y ruby -v
ruby 3.4.0dev (2024-10-25T11:52:32Z master 9c8c140d73) [x86_64-linux]
$ RUBYOPT=--parser=parse.y ruby -w foo.rb
lib/file.rb:42:in 'Kernel#eval': (eval at lib/file.rb:42):2: syntax error, unexpected string literal, expecting 'do' or '{' or '(' (SyntaxError)
    'abc' + pluralize 'def'
                      ^

	from lib/file.rb:42:in 'C#throw_syntax_error'
	from foo.rb:7:in '<main>'
	$
Actions #4

Updated by mame (Yusuke Endoh) about 2 months ago

  • Related to Bug #20736: prism emits wrong warnings in syntax-error code added

Updated by nobu (Nobuyoshi Nakada) about 2 months ago

This seems the case that the recovery works wrongly.
When no syntax error, also the "useless use" warning occurs inside eval.
Not in eval, the warning is emitted regardless the syntax error.

Updated by kddnewton (Kevin Newton) about 2 months ago

  • Assignee set to kddnewton (Kevin Newton)

Updated by kddnewton (Kevin Newton) about 2 months ago

  • Assignee changed from kddnewton (Kevin Newton) to prism
Actions #8

Updated by hsbt (Hiroshi SHIBATA) about 1 month ago

  • Status changed from Open to Assigned

Updated by mame (Yusuke Endoh) 10 days ago

  • Status changed from Assigned to Rejected

Discussed at the dev meeting. This incompatibility that a subtle warning is printed when code is a syntax error should be considered minor and acceptable.

If the frequency or volume of the warning is high, or if it is difficult to suppress the warning, or if there are other circumstances that warrant consideration, then this may be reconsidered.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0