diff --git a/go/analysis/passes/asmdecl/asmdecl.go b/go/analysis/passes/asmdecl/asmdecl.go index 1e6e32a9..11dfbf6b 100644 --- a/go/analysis/passes/asmdecl/asmdecl.go +++ b/go/analysis/passes/asmdecl/asmdecl.go @@ -506,10 +506,20 @@ func asmParseDecl(pass *analysis.Pass, decl *ast.FuncDecl) map[string]*asmFunc { // addParams adds asmVars for each of the parameters in list. // isret indicates whether the list are the arguments or the return values. + // TODO(adonovan): simplify by passing (*types.Signature).{Params,Results} + // instead of list. addParams := func(list []*ast.Field, isret bool) { argnum := 0 for _, fld := range list { t := pass.TypesInfo.Types[fld.Type].Type + + // Work around github.com/golang/go/issues/28277. + if t == nil { + if ell, ok := fld.Type.(*ast.Ellipsis); ok { + t = types.NewSlice(pass.TypesInfo.Types[ell.Elt].Type) + } + } + align := int(arch.sizes.Alignof(t)) size := int(arch.sizes.Sizeof(t)) offset += -offset & (align - 1) diff --git a/go/analysis/passes/asmdecl/testdata/src/a/asm.go b/go/analysis/passes/asmdecl/testdata/src/a/asm.go index 3ac1688e..661e1a9f 100644 --- a/go/analysis/passes/asmdecl/testdata/src/a/asm.go +++ b/go/analysis/passes/asmdecl/testdata/src/a/asm.go @@ -44,3 +44,5 @@ func f17584(x float32, y complex64) func noframe1(x int32) func noframe2(x int32) + +func fvariadic(int, ...int)