// func(a int, byval int, &byref *int) {
// println(byval)
// (*&byref)++
- // }(42, byval, &byref)
+ // }(byval, &byref, 42)
// f is ONAME of the actual function.
f := xfunc.Func.Nname
- // Get pointer to input arguments and rewind to the end.
- // We are going to append captured variables to input args.
+ // Get pointer to input arguments.
+ // We are going to insert captured variables before input args.
param := &getinargx(f.Type).Type
+ original_args := *param // old input args
+ original_dcl := xfunc.Func.Dcl
+ xfunc.Func.Dcl = nil
- for ; *param != nil; param = &(*param).Down {
- }
var v *Node
var addr *Node
var fld *Type
fld.Type = fld.Nname.Type
fld.Sym = fld.Nname.Sym
- // Declare the new param and append it to input arguments.
+ // Declare the new param and add it the first part of the input arguments.
xfunc.Func.Dcl = list(xfunc.Func.Dcl, fld.Nname)
*param = fld
param = &fld.Down
}
+ *param = original_args
+ xfunc.Func.Dcl = concat(xfunc.Func.Dcl, original_dcl)
// Recalculate param offsets.
if f.Type.Width > 0 {
// Transform direct call of a closure to call of a normal function.
// transformclosure already did all preparation work.
- // Append captured variables to argument list.
- n.List = concat(n.List, n.Left.Func.Enter)
+ // Prepend captured variables to argument list.
+ n.List = concat(n.Left.Func.Enter, n.List)
n.Left.Func.Enter = nil
--- /dev/null
+// compile
+
+// 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.
+
+// Issue 11750: mkdotargslice: typecheck failed
+
+package main
+
+func main() {
+ fn := func(names string) {
+
+ }
+ func(names ...string) {
+ for _, name := range names {
+ fn(name)
+ }
+ }("one", "two")
+}