Browse Source

compiler: add support for Go 1.23 range-over-func

pull/4418/head
Ayke van Laethem 3 months ago
committed by Ron Evans
parent
commit
8b626e6ea7
  1. 2
      compiler/compiler.go
  2. 2
      compiler/symbol.go
  3. 3
      main_test.go
  4. 3
      testdata/go1.23/go.mod
  5. 18
      testdata/go1.23/main.go
  6. 11
      testdata/go1.23/out.txt

2
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())
}
}
}

2
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()

3
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),

3
testdata/go1.23/go.mod

@ -0,0 +1,3 @@
module github.com/tinygo-org/tinygo/testdata/go1.23
go 1.23

18
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)
}
}

11
testdata/go1.23/out.txt

@ -0,0 +1,11 @@
10
9
8
7
6
5
4
3
2
1
go1.23 has lift-off!
Loading…
Cancel
Save