[ruby-core:96104] [Ruby master Bug#15980] Coverage shows while/until after raise if/unless as uncovered line

[email protected]
Newsgroups gmane.comp.lang.ruby.core
Message-ID <redmine.journal-82963.20191204092615.c7aeaa89bd0a8546@ruby-lang.org>
Issue #15980 has been updated by puchuu (Andrew Aladjev).


There is a workaround for everyone wants to use lines coverage only with 2.6.5 version (recommended by Jeremy Evans):

```ruby
# Workaround for https://bugs.ruby-lang.org/issues/15980
require "coverage"

Coverage.module_eval do
  singleton_class.send :alias_method, :original_start, :start
  def self.start
    original_start :lines => true, :branches => true
  end

  singleton_class.send :alias_method, :original_result, :result
  def self.result
    original_result.transform_values { |coverage| coverage[:lines] }
  end
end
```

It works for simplecov.

----------------------------------------
Bug #15980: Coverage shows while/until after raise if/unless as uncovered line
https://bugs.ruby-lang.org/issues/15980#change-82963

* Author: jeremyevans0 (Jeremy Evans)
* Status: Closed
* Priority: Normal
* Assignee: mame (Yusuke Endoh)
* Target version: 
* ruby -v: ruby 2.7.0dev (2019-07-03) [x86_64-openbsd6.5]
* Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: REQUIRED
----------------------------------------
The following code shows line 2 (`while true`) as uncovered:

```ruby
raise if 1 == 2
while true
  break
end
```

Coverage reports the following for this file: `[1, 0, 1, nil]`.  Note that `true` isn't important, any `while` condition will work.  However, if you change line 1 to `raise if false`, line 1 shows `nil` coverage, and line 2 shows as covered (`[nil, 1, 1, nil]`).  That leads me to believe this issue is related to the optimizer.

I bisected this to commit:100bf2757468439106775a7d95a791a8c10b874a, which certainly appears related.

This is not a theoretical case, it affected three lines in Sequel.  While not a major problem, I do think a fix should be backported to 2.6.

Note that this only affects line coverage.  Branch coverage shows:

```ruby
{"file.rb"=>
  {:branches=>
    {[:if, 0, 1, 0, 1, 15]=>
      {[:then, 1, 1, 0, 1, 5]=>0, [:else, 2, 1, 0, 1, 15]=>1},
     [:while, 3, 2, 0, 4, 3]=>{[:body, 4, 3, 2, 3, 7]=>1}}}}
```

If you run with both branch and line coverage, line coverage shows correctly.

This affects `while`/`until` after a line with `raise ... if ...` or `raise ... unless ...`.  If you switch to `if ...; raise ...; end`, then line coverage shows correctly.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.