aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2021-01-01 04:51:22 -0800
committerMatthew Dempsky <mdempsky@google.com>2021-01-01 13:44:37 +0000
commitbfa97ba48fa2924d9c2da1dca01fdb65b44cdb5f (patch)
treeb7e8ab044abb36437189853407b521392406cd7f
parent67ad695416fbcdf9d61e5bfc0f9cd9aac313caa4 (diff)
downloadgo-bfa97ba48fa2924d9c2da1dca01fdb65b44cdb5f.tar.xz
[dev.regabi] test: add another closure test case
When deciding whether a captured variable can be passed by value, the compiler is sensitive to the order that the OCLOSURE node is typechecked relative to the order that the variable is passed to "checkassign". Today, for an assignment like: q, g = 2, func() int { return q } we get this right because we always typecheck the full RHS expression list before calling checkassign on any LHS expression. But I nearly made a change that would interleave this ordering, causing us to call checkassign on q before typechecking the function literal. And alarmingly, there weren't any tests that caught this. So this commit adds one. Change-Id: I66cacd61066c7a229070861a7d973bcc434904cc Reviewed-on: https://go-review.googlesource.com/c/go/+/280998 Trust: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
-rw-r--r--test/closure2.go14
1 files changed, 14 insertions, 0 deletions
diff --git a/test/closure2.go b/test/closure2.go
index e4db05d884..812d41f8ce 100644
--- a/test/closure2.go
+++ b/test/closure2.go
@@ -9,6 +9,8 @@
package main
+var never bool
+
func main() {
{
type X struct {
@@ -115,4 +117,16 @@ func main() {
panic("g() != 2")
}
}
+
+ {
+ var g func() int
+ q := 0
+ q, g = 1, func() int { return q }
+ if never {
+ g = func() int { return 2 }
+ }
+ if g() != 1 {
+ panic("g() != 1")
+ }
+ }
}