mirror of
https://github.com/golang/go
synced 2024-11-06 17:26:10 -07:00
f68e2b6f23
We were recursing infinitely in cases like this: switch true { case true: go foo.F<> } There were three things that came together to cause this: 1. We recently starting recursively fixing broken go/defer statements. 2. In this case we were failing to swap in the correct ast.Node in for the *ast.BadStmt because we were only looking for *ast.BlockStmt (and *ast.CaseStmt has no block). 3. After 2), we weren't returning an error so the fix() code thought it should recurse. Fix 2) by using reflection to swap AST nodes in a generic way. Perhaps a bit overkill in this case, but I happened to have already written this for an upcoming change, so I just pulled it in to fix this bug. Fix 3) by returning an error if we fail to swap the AST nodes. Fixes golang/go#34353. Change-Id: I17ff1afd52ae165c0ba9de5820dcec4cb7d756cb Reviewed-on: https://go-review.googlesource.com/c/tools/+/196137 Run-TryBot: Rebecca Stambler <rstambler@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org> |
||
---|---|---|
.. | ||
badstmt_2.go.in | ||
badstmt_3.go.in | ||
badstmt_4.go.in | ||
badstmt.go.in |