func typecheckclosure(clo *Node, top int) {
xfunc := clo.Func.Closure
+ clo.Func.Ntype = typecheck(clo.Func.Ntype, Etype)
+ clo.Type = clo.Func.Ntype.Type
+ clo.Func.Top = top
+
+ // Do not typecheck xfunc twice, otherwise, we will end up pushing
+ // xfunc to xtop multiple times, causing initLSym called twice.
+ // See #30709
+ if xfunc.Typecheck() == 1 {
+ return
+ }
for _, ln := range xfunc.Func.Cvars.Slice() {
n := ln.Name.Defn
declare(xfunc.Func.Nname, PFUNC)
xfunc = typecheck(xfunc, ctxStmt)
- clo.Func.Ntype = typecheck(clo.Func.Ntype, Etype)
- clo.Type = clo.Func.Ntype.Type
- clo.Func.Top = top
-
// Type check the body now, but only if we're inside a function.
// At top level (in a variable initialization: curfn==nil) we're not
// ready to type check code yet; we'll check it later, because the
--- /dev/null
+// run
+
+// Copyright 2019 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 closure in const declaration group can be compiled
+// and set correct value
+
+package main
+
+import "unsafe"
+
+const (
+ x = unsafe.Sizeof(func() {})
+ y
+)
+
+func main() {
+ const (
+ z = unsafe.Sizeof(func() {})
+ t
+ )
+
+ // x and y must be equal
+ println(x == y)
+ // size must be greater than zero
+ println(y > 0)
+
+ // Same logic as x, y above
+ println(z == t)
+ println(t > 0)
+}