Commit 98100c56 authored by Andrew Gerrand's avatar Andrew Gerrand

cmd/cover: fix counting of blocks split by goto statements

When adding coverage counters to a block, the block's statement list is
mutated. CL 77150 removed the part where the mutated list is assigned
back to its parent node; this was confusing ast.Walk, which would then
lose its place and stop walking the current block, dropping counters in
the process.

This change has addCounters make a copy of the list before mutating
it, so that the original list doesn't change under Walk's feet.

Fix #32200

Change-Id: Ia3b67d8cee860ceb7caf8748cb7a80ff9c6276e0
Reviewed-on: https://go-review.googlesource.com/c/go/+/179581Reviewed-by: default avatarRob Pike <r@golang.org>
parent ce656af9
...@@ -386,6 +386,9 @@ func (f *File) addCounters(pos, insertPos, blockEnd token.Pos, list []ast.Stmt, ...@@ -386,6 +386,9 @@ func (f *File) addCounters(pos, insertPos, blockEnd token.Pos, list []ast.Stmt,
f.edit.Insert(f.offset(insertPos), f.newCounter(insertPos, blockEnd, 0)+";") f.edit.Insert(f.offset(insertPos), f.newCounter(insertPos, blockEnd, 0)+";")
return return
} }
// Make a copy of the list, as we may mutate it and should leave the
// existing list intact.
list = append([]ast.Stmt(nil), list...)
// We have a block (statement list), but it may have several basic blocks due to the // We have a block (statement list), but it may have several basic blocks due to the
// appearance of statements that affect the flow of control. // appearance of statements that affect the flow of control.
for { for {
......
...@@ -132,6 +132,10 @@ func testBlockRun() { ...@@ -132,6 +132,10 @@ func testBlockRun() {
func testSwitch() { func testSwitch() {
for i := 0; i < 5; func() { i++; check(LINE, 5) }() { for i := 0; i < 5; func() { i++; check(LINE, 5) }() {
goto label2
label1:
goto label1
label2:
switch i { switch i {
case 0: case 0:
check(LINE, 1) check(LINE, 1)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment