cmd/compile: fix irgen mis-handling of ... argument when creating closure

When bulding formal arguments of newly created closure, irgen forgets to
set "..." field attribute, causing type mismatched between the closure
function and the ONAME node represents that closure function.

Fixes #49432

Change-Id: Ieddaa64980cdd3d8cea236a5a9de0204ee21ee39
Reviewed-on: https://go-review.googlesource.com/c/go/+/361961
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Dan Scales <danscales@google.com>
This commit is contained in:
Cuong Manh Le 2021-11-08 13:08:58 +07:00
parent 67e22941df
commit bee0c73900
2 changed files with 23 additions and 0 deletions

View file

@ -2085,6 +2085,7 @@ func startClosure(pos src.XPos, outer *ir.Func, typ *types.Type) (*ir.Func, []*t
fn.Dcl = append(fn.Dcl, arg)
f := types.NewField(pos, arg.Sym(), t)
f.Nname = arg
f.SetIsDDD(typ.Params().Field(i).IsDDD())
formalParams = append(formalParams, f)
}
for i := 0; i < typ.NumResults(); i++ {

View file

@ -0,0 +1,22 @@
// compile -G=3
// Copyright 2021 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.
package main
type Handler func(in ...interface{})
type Foo[T any] struct{}
func (b *Foo[T]) Bar(in ...interface{}) {}
func (b *Foo[T]) Init() {
_ = Handler(b.Bar)
}
func main() {
c := &Foo[int]{}
c.Init()
}