aboutsummaryrefslogtreecommitdiff
path: root/src/go/types/signature.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/go/types/signature.go')
-rw-r--r--src/go/types/signature.go11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/go/types/signature.go b/src/go/types/signature.go
index a340ac701ea..d22646d7a87 100644
--- a/src/go/types/signature.go
+++ b/src/go/types/signature.go
@@ -5,6 +5,7 @@
package types
import (
+ "fmt"
"go/ast"
"go/token"
)
@@ -41,16 +42,18 @@ func NewSignature(recv *Var, params, results *Tuple, variadic bool) *Signature {
// NewSignatureType creates a new function type for the given receiver,
// receiver type parameters, type parameters, parameters, and results. If
// variadic is set, params must hold at least one parameter and the last
-// parameter must be of unnamed slice type. If recv is non-nil, typeParams must
-// be empty. If recvTypeParams is non-empty, recv must be non-nil.
+// parameter's core type must be of unnamed slice or bytestring type.
+// If recv is non-nil, typeParams must be empty. If recvTypeParams is
+// non-empty, recv must be non-nil.
func NewSignatureType(recv *Var, recvTypeParams, typeParams []*TypeParam, params, results *Tuple, variadic bool) *Signature {
if variadic {
n := params.Len()
if n == 0 {
panic("variadic function must have at least one parameter")
}
- if _, ok := params.At(n - 1).typ.(*Slice); !ok {
- panic("variadic parameter must be of unnamed slice type")
+ core := coreString(params.At(n - 1).typ)
+ if _, ok := core.(*Slice); !ok && !isString(core) {
+ panic(fmt.Sprintf("got %s, want variadic parameter with unnamed slice type or string as core type", core.String()))
}
}
sig := &Signature{recv: recv, params: params, results: results, variadic: variadic}