aboutsummaryrefslogtreecommitdiff
path: root/test/closure2.go
diff options
context:
space:
mode:
authorDan Willemsen <dwillemsen@google.com>2015-09-15 13:49:18 -0700
committerDan Willemsen <dwillemsen@google.com>2015-09-15 13:51:48 -0700
commit6ff23253f8283d0c81c9db51c2d7803e086c93ad (patch)
treed70b53746897f5f6a71c19b7c062a079b4f54001 /test/closure2.go
parent1630e73131c3c8cc2a16baa2aefe3b9b82de658b (diff)
downloadlinux-x86-6ff23253f8283d0c81c9db51c2d7803e086c93ad.tar.gz
Change-Id: Ic39c72590cb0561132faefbca121c3782372b9bf
Diffstat (limited to 'test/closure2.go')
-rw-r--r--test/closure2.go118
1 files changed, 118 insertions, 0 deletions
diff --git a/test/closure2.go b/test/closure2.go
new file mode 100644
index 000000000..4d61b45d3
--- /dev/null
+++ b/test/closure2.go
@@ -0,0 +1,118 @@
+// 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()
+ }
+
+ {
+ var g func() int
+ for i := range [2]int{} {
+ if i == 0 {
+ g = func() int {
+ return i // test that we capture by ref here, i is mutated on every interation
+ }
+ }
+ }
+ if g() != 1 {
+ panic("g() != 1")
+ }
+ }
+
+ {
+ var g func() int
+ q := 0
+ for range [2]int{} {
+ q++
+ g = func() int {
+ return q // test that we capture by ref here
+ // q++ must on a different decldepth than q declaration
+ }
+ }
+ if g() != 2 {
+ panic("g() != 2")
+ }
+ }
+
+ {
+ var g func() int
+ var a [2]int
+ q := 0
+ for a[func() int {
+ q++
+ return 0
+ }()] = range [2]int{} {
+ g = func() int {
+ return q // test that we capture by ref here
+ // q++ must on a different decldepth than q declaration
+ }
+ }
+ if g() != 2 {
+ panic("g() != 2")
+ }
+ }
+}