diff options
| author | David Chase <drchase@google.com> | 2023-07-05 16:21:19 -0400 |
|---|---|---|
| committer | David Chase <drchase@google.com> | 2023-08-08 21:20:26 +0000 |
| commit | fe1daf2e439ec1d650ea1193f10f52525f83f8a7 (patch) | |
| tree | 4db784376b586aa2a60b2ed79fde7889c557273b /src/cmd/compile/internal/noder | |
| parent | 6d8d88a70716bd35708748ba4e0110bdcd9520f3 (diff) | |
| download | go-fe1daf2e439ec1d650ea1193f10f52525f83f8a7.tar.xz | |
cmd/compile: use new for loop semantics for Go 1.22+ compilations
This includes version-dependent support for GOEXPERIMENT and
-d=loopvar, -d=loopvarhash, to allow testing/porting of old code.
Includes tests of downgrade (1.22 -> 1.21) and upgrade (1.21 -> 1.22)
based on //go:build lines (while running a 1.22 build/compiler).
Change-Id: Idd3be61a2b46acec33c7e7edac0924158cc726b4
Reviewed-on: https://go-review.googlesource.com/c/go/+/508819
Run-TryBot: David Chase <drchase@google.com>
Reviewed-by: Russ Cox <rsc@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/noder')
| -rw-r--r-- | src/cmd/compile/internal/noder/irgen.go | 1 | ||||
| -rw-r--r-- | src/cmd/compile/internal/noder/reader.go | 4 | ||||
| -rw-r--r-- | src/cmd/compile/internal/noder/writer.go | 21 |
3 files changed, 23 insertions, 3 deletions
diff --git a/src/cmd/compile/internal/noder/irgen.go b/src/cmd/compile/internal/noder/irgen.go index df5de63620..6019c5986c 100644 --- a/src/cmd/compile/internal/noder/irgen.go +++ b/src/cmd/compile/internal/noder/irgen.go @@ -64,6 +64,7 @@ func checkFiles(m posMap, noders []*noder) (*types2.Package, *types2.Info) { Implicits: make(map[syntax.Node]types2.Object), Scopes: make(map[syntax.Node]*types2.Scope), Instances: make(map[*syntax.Name]types2.Instance), + FileVersions: make(map[*syntax.PosBase]types2.Version), // expand as needed } diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go index 610d02c07c..6dec060c8c 100644 --- a/src/cmd/compile/internal/noder/reader.go +++ b/src/cmd/compile/internal/noder/reader.go @@ -1897,10 +1897,10 @@ func (r *reader) forStmt(label *types.Sym) ir.Node { cond := r.optExpr() post := r.stmt() body := r.blockStmt() - dv := r.Bool() + perLoopVars := r.Bool() r.closeAnotherScope() - stmt := ir.NewForStmt(pos, init, cond, post, body, dv) + stmt := ir.NewForStmt(pos, init, cond, post, body, perLoopVars) stmt.Label = label return stmt } diff --git a/src/cmd/compile/internal/noder/writer.go b/src/cmd/compile/internal/noder/writer.go index afe452bc9c..1d8c0bf933 100644 --- a/src/cmd/compile/internal/noder/writer.go +++ b/src/cmd/compile/internal/noder/writer.go @@ -1456,10 +1456,29 @@ func (w *writer) forStmt(stmt *syntax.ForStmt) { } w.blockStmt(stmt.Body) - w.Bool(base.Debug.LoopVar > 0) + w.Bool(w.distinctVars(stmt)) w.closeAnotherScope() } +func (w *writer) distinctVars(stmt *syntax.ForStmt) bool { + lv := base.Debug.LoopVar + v := w.p.info.FileVersions[stmt.Pos().Base()] + is122 := v.Major == 0 && v.Minor == 0 || v.Major == 1 && v.Minor >= 22 + + // Turning off loopvar for 1.22 is only possible with loopvarhash=qn + // + // Debug.LoopVar values to be preserved for 1.21 compatibility are 1 and 2, + // which are also set (=1) by GOEXPERIMENT=loopvar. The knobs for turning on + // the new, unshared, loopvar behavior apply to versions less than 1.21 because + // (1) 1.21 also did that and (2) this is believed to be the likely use case; + // anyone checking to see if it affects their code will just run the GOEXPERIMENT + // but will not also update all their go.mod files to 1.21. + // + // -gcflags=-d=loopvar=3 enables logging for 1.22 but does not turn loopvar on for <= 1.21. + + return is122 || lv > 0 && lv != 3 +} + // rangeTypes returns the types of values produced by ranging over // expr. func (pw *pkgWriter) rangeTypes(expr syntax.Expr) (key, value types2.Type) { |
