// run // Copyright 2015 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. // Check that these do not use "by value" capturing, // because changes are made to the value during the closure. package main func main() { type X struct { v int } var x X func() { x.v++ }() if x.v != 1 { panic("x.v != 1") } type Y struct { X } var y Y func() { y.v = 1 }() if y.v != 1 { panic("y.v != 1") } type Z struct { a [3]byte } var z Z func() { i := 0 for z.a[1] = 1; i < 10; i++ { } }() if z.a[1] != 1 { panic("z.a[1] != 1") } w := 0 tmp := 0 f := func() { if w != 1 { panic("w != 1") } } func() { tmp = w // force capture of w, but do not write to it yet _ = tmp func() { func() { w++ // write in a nested closure }() }() }() f() }