From: aladjev.andrew@... Date: 2019-12-04T16:09:36+00:00 Subject: [ruby-core:96109] [Ruby master Bug#15980] Coverage shows while/until after raise if/unless as uncovered line Issue #15980 has been updated by puchuu (Andrew Aladjev). Yusuke Endoh, I've tested using the following code: ```ruby loop do break if rand < 0 break while true next if rand < 0 break until false return if rand < 0 break while true raise if rand < 0 break until false exit if rand < 0 break while true break end ``` Result is `[1, 1, 1, nil, 1, 1, nil, 1, 1, nil, 1, 1, nil, 1, 1, nil, 1, nil]`, works fine, thank you. ---------------------------------------- Bug #15980: Coverage shows while/until after raise if/unless as uncovered line https://bugs.ruby-lang.org/issues/15980#change-82968 * 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: