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