loader: make sure Go version is plumbed through

This fixes the new loop variable behavior in Go 1.22.

Specifically:
  * The compiler (actually, the x/tools/go/ssa package) now correctly
    picks up the Go version.
  * If a module doesn't specify the Go version, the current Go version
    (from the `go` tool and standard library) is used. This fixes
    `go run`.
  * The tests in testdata/ that use a separate directory are now
    actually run in that directory. This makes it possible to use a
    go.mod file there.
  * There is a test to make sure old Go modules still work with the old
    Go behavior, even on a newer Go version.
This commit is contained in:
Ayke van Laethem
2024-01-19 16:57:04 +01:00
committed by Ron Evans
parent 38a80b45d3
commit 57f49af726
10 changed files with 78 additions and 10 deletions
+3
View File
@@ -0,0 +1,3 @@
module github.com/tinygo-org/tinygo/testdata/go1.22
go 1.22
+4 -6
View File
@@ -19,15 +19,13 @@ func testLoopVar() {
f = func() int { return i }
}
}
// Prints 1 in Go 1.21, or 0 in Go 1.22.
// TODO: this still prints Go 1.21 even in Go 1.22. We probably need to
// specify the Go version somewhere.
// Variable n is 1 in Go 1.21, or 0 in Go 1.22.
n := f()
if n == 0 {
println("behaves like Go 1.22")
println("loops behave like Go 1.22")
} else if n == 1 {
println("behaves like Go 1.21")
println("loops behave like Go 1.21")
} else {
println("unknown behavior")
println("unknown loop behavior")
}
}
+1 -1
View File
@@ -9,4 +9,4 @@
2
1
go1.22 has lift-off!
behaves like Go 1.21
loops behave like Go 1.22
+5
View File
@@ -0,0 +1,5 @@
module github.com/tinygo-org/tinygo/testdata/oldgo
// Go version doesn't matter much, as long as it's old.
go 1.15
+26
View File
@@ -0,0 +1,26 @@
package main
// This package verifies that the Go language version is correctly picked up
// from the go.mod file.
func main() {
testLoopVar()
}
func testLoopVar() {
var f func() int
for i := 0; i < 1; i++ {
if i == 0 {
f = func() int { return i }
}
}
// Variable n is 1 in Go 1.21, or 0 in Go 1.22.
n := f()
if n == 0 {
println("loops behave like Go 1.22")
} else if n == 1 {
println("loops behave like Go 1.21")
} else {
println("unknown loop behavior")
}
}
+1
View File
@@ -0,0 +1 @@
loops behave like Go 1.21