blob: ff5393ef86b96a9d037e6028dc215e14de294dbb [file]
// run
// Copyright 2026 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.
// Test that a closure that captures a variable holding a constant still
// observes the right value once inlining made several copies of it, each
// capturing a different constant.
package main
import "fmt"
func str(s string) func() string {
return func() string { return s }
}
func num(n int) func() int {
return func() int { return n }
}
func iface(n int) func() any {
return func() any { return n }
}
func nested(s string) func() func() string {
return func() func() string {
return func() string { return s }
}
}
func main() {
for i, f := range []func() string{str("a"), str("b"), str("c")} {
if got, want := f(), string(rune('a'+i)); got != want {
panic(fmt.Sprintf("str: got %q, want %q", got, want))
}
}
for i, f := range []func() int{num(0), num(1), num(2)} {
if got := f(); got != i {
panic(fmt.Sprintf("num: got %d, want %d", got, i))
}
}
for i, f := range []func() any{iface(0), iface(1), iface(2)} {
if got := f(); got != any(i) {
panic(fmt.Sprintf("iface: got %v, want %v", got, i))
}
}
for i, f := range []func() func() string{nested("a"), nested("b"), nested("c")} {
if got, want := f()(), string(rune('a'+i)); got != want {
panic(fmt.Sprintf("nested: got %q, want %q", got, want))
}
}
}