diff --git a/testdata/src/a/a.go b/testdata/src/a/a.go index 22acc1b..5718bcf 100644 --- a/testdata/src/a/a.go +++ b/testdata/src/a/a.go @@ -109,7 +109,7 @@ func mugen() { var i int var hoge int for { - hoge = 5 // want "reassigned, but never used afterwards" + hoge = 5 // want "wasted assignment" // break } @@ -130,3 +130,26 @@ func noMugen() { println(hoge) return } + +func reassignInsideLoop() { + bar := func(b []byte) ([]byte, error) { return b, nil } + var err error + var rest []byte + for { + rest, err = bar(rest) + if err == nil { + break + } + } + return +} + +func reassignInsideLoop2() { + var x int = 0 + var y int = 1 + for i := 1; i < 3; i++ { + x += y + y *= 2 * i + } + println(x) +} diff --git a/wastedassign.go b/wastedassign.go index 6e72d9b..21b8de1 100644 --- a/wastedassign.go +++ b/wastedassign.go @@ -163,20 +163,20 @@ func (wr wastedReason) String() string { } } -func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value, haveCheckedMap map[int]bool) wastedReason { +func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value, haveCheckedMap map[int]int) wastedReason { var wastedReasons []wastedReason var wastedReasonsCurrentBls []wastedReason if haveCheckedMap == nil { - haveCheckedMap = map[int]bool{} + haveCheckedMap = map[int]int{} } for _, bl := range bls { - if haveCheckedMap[bl.Index] { + if haveCheckedMap[bl.Index] == 2 { continue } - haveCheckedMap[bl.Index] = true + haveCheckedMap[bl.Index]++ breakFlag := false for _, ist := range bl.Instrs { if breakFlag { @@ -201,7 +201,7 @@ func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value, hav var buf [10]*ssa.Value for _, op := range ist.Operands(buf[:0]) { if *op == *currentOp { - // 連続storeではなかった + // It wasn't a continuous store. return notWasted } }