]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.22] cmd/compile: fix early deadcode with label statement
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Wed, 21 Feb 2024 11:50:11 +0000 (18:50 +0700)
committerThan McIntosh <thanm@google.com>
Tue, 26 Mar 2024 19:31:39 +0000 (19:31 +0000)
CL 517775 moved early deadcode into unified writer. with new way to
handle dead code with label statement involved: any statements after
terminating statement will be considered dead until next label
statement.

However, this is not safe, because code after label statement may still
refer to dead statements between terminating and label statement.

It's only safe to remove statements after terminating *and* label one.

Fixes #66134

Change-Id: Idb630165240931fad50789304a9e4535f51f56e2
Reviewed-on: https://go-review.googlesource.com/c/go/+/565596
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/569717
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/cmd/compile/internal/noder/writer.go
test/fixedbugs/issue65593.go [new file with mode: 0644]

index e5894c950543ae091e6b934196ffe562a6c43b7a..c317f392c1d438c94798623a94077b97283be2ba 100644 (file)
@@ -1209,10 +1209,17 @@ func (w *writer) stmt(stmt syntax.Stmt) {
 func (w *writer) stmts(stmts []syntax.Stmt) {
        dead := false
        w.Sync(pkgbits.SyncStmts)
-       for _, stmt := range stmts {
-               if dead {
-                       // Any statements after a terminating statement are safe to
-                       // omit, at least until the next labeled statement.
+       var lastLabel = -1
+       for i, stmt := range stmts {
+               if _, ok := stmt.(*syntax.LabeledStmt); ok {
+                       lastLabel = i
+               }
+       }
+       for i, stmt := range stmts {
+               if dead && i > lastLabel {
+                       // Any statements after a terminating and last label statement are safe to omit.
+                       // Otherwise, code after label statement may refer to dead stmts between terminating
+                       // and label statement, see issue #65593.
                        if _, ok := stmt.(*syntax.LabeledStmt); !ok {
                                continue
                        }
diff --git a/test/fixedbugs/issue65593.go b/test/fixedbugs/issue65593.go
new file mode 100644 (file)
index 0000000..892a781
--- /dev/null
@@ -0,0 +1,21 @@
+// compile
+
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+const run = false
+
+func f() {
+       if !run {
+               return
+       }
+
+       messages := make(chan struct{}, 1)
+main:
+       for range messages {
+               break main
+       }
+}