diff options
author | Ayke van Laethem <[email protected]> | 2024-08-15 19:55:39 +0200 |
---|---|---|
committer | Ron Evans <[email protected]> | 2024-08-17 11:49:14 +0200 |
commit | 8b626e6ea7e98887fbd48e3c55216fdd9327fac6 (patch) | |
tree | fe24168bcad481bedf2bf4408b49efb840fdbbd5 | |
parent | 1d1f4fc401b449e325f6c2c04001db14801cd398 (diff) | |
download | tinygo-8b626e6ea7e98887fbd48e3c55216fdd9327fac6.tar.gz tinygo-8b626e6ea7e98887fbd48e3c55216fdd9327fac6.zip |
compiler: add support for Go 1.23 range-over-func
-rw-r--r-- | compiler/compiler.go | 2 | ||||
-rw-r--r-- | compiler/symbol.go | 2 | ||||
-rw-r--r-- | main_test.go | 3 | ||||
-rw-r--r-- | testdata/go1.23/go.mod | 3 | ||||
-rw-r--r-- | testdata/go1.23/main.go | 18 | ||||
-rw-r--r-- | testdata/go1.23/out.txt | 11 |
6 files changed, 37 insertions, 2 deletions
diff --git a/compiler/compiler.go b/compiler/compiler.go index bc17250d9..201605d78 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -1963,7 +1963,7 @@ func (b *builder) getValue(expr ssa.Value, pos token.Pos) llvm.Value { return value } else { // indicates a compiler bug - panic("local has not been parsed: " + expr.String()) + panic("SSA value not previously found in function: " + expr.String()) } } } diff --git a/compiler/symbol.go b/compiler/symbol.go index 37c987859..29f009520 100644 --- a/compiler/symbol.go +++ b/compiler/symbol.go @@ -218,7 +218,7 @@ func (c *compilerContext) getFunction(fn *ssa.Function) (llvm.Type, llvm.Value) // should be created right away. // The exception is the package initializer, which does appear in the // *ssa.Package members and so shouldn't be created here. - if fn.Synthetic != "" && fn.Synthetic != "package initializer" && fn.Synthetic != "generic function" { + if fn.Synthetic != "" && fn.Synthetic != "package initializer" && fn.Synthetic != "generic function" && fn.Synthetic != "range-over-func yield" { irbuilder := c.ctx.NewBuilder() b := newBuilder(c, irbuilder, fn) b.createFunction() diff --git a/main_test.go b/main_test.go index 4c11f7b18..e70e9f7fd 100644 --- a/main_test.go +++ b/main_test.go @@ -97,6 +97,9 @@ func TestBuild(t *testing.T) { if minor >= 22 { tests = append(tests, "go1.22/") } + if minor >= 23 { + tests = append(tests, "go1.23/") + } if *testTarget != "" { // This makes it possible to run one specific test (instead of all), diff --git a/testdata/go1.23/go.mod b/testdata/go1.23/go.mod new file mode 100644 index 000000000..c0ad79b6d --- /dev/null +++ b/testdata/go1.23/go.mod @@ -0,0 +1,3 @@ +module github.com/tinygo-org/tinygo/testdata/go1.23 + +go 1.23 diff --git a/testdata/go1.23/main.go b/testdata/go1.23/main.go new file mode 100644 index 000000000..01782d235 --- /dev/null +++ b/testdata/go1.23/main.go @@ -0,0 +1,18 @@ +package main + +func main() { + testFuncRange(counter) +} + +func testFuncRange(f func(yield func(int) bool)) { + for i := range f { + println(i) + } + println("go1.23 has lift-off!") +} + +func counter(yield func(int) bool) { + for i := 10; i >= 1; i-- { + yield(i) + } +} diff --git a/testdata/go1.23/out.txt b/testdata/go1.23/out.txt new file mode 100644 index 000000000..aeeb7d40e --- /dev/null +++ b/testdata/go1.23/out.txt @@ -0,0 +1,11 @@ +10 +9 +8 +7 +6 +5 +4 +3 +2 +1 +go1.23 has lift-off! |