1
0
mirror of https://github.com/golang/go synced 2024-11-11 23:20:24 -07:00

cmd/compile: make typecheckaste correctly report invalid use of "..."

Currently, when "..." argument is passed to non-variadic function, the
compiler may skip that check, but continue checking whether the number
of arguments matches the function signature.

That causes the sanity check which was added in CL 255241 trigger.

Instead, we should report an invalid use of "...", which matches the
behavior of new type checker and go/types.

Fixes #45913

Change-Id: Icbb254052cbcd756bbd41f966c2c8e316c44420f
Reviewed-on: https://go-review.googlesource.com/c/go/+/315796
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Cuong Manh Le 2021-05-03 02:19:10 +07:00
parent 9ed736ac2a
commit 844e1fc6f1
3 changed files with 23 additions and 1 deletions

View File

@ -1330,6 +1330,9 @@ func typecheckaste(op ir.Op, call ir.Node, isddd bool, tstruct *types.Type, nl i
n1 := tstruct.NumFields() n1 := tstruct.NumFields()
n2 := len(nl) n2 := len(nl)
if !hasddd(tstruct) { if !hasddd(tstruct) {
if isddd {
goto invalidddd
}
if n2 > n1 { if n2 > n1 {
goto toomany goto toomany
} }
@ -1395,6 +1398,8 @@ func typecheckaste(op ir.Op, call ir.Node, isddd bool, tstruct *types.Type, nl i
if i < len(nl) { if i < len(nl) {
goto toomany goto toomany
} }
invalidddd:
if isddd { if isddd {
if call != nil { if call != nil {
base.Errorf("invalid use of ... in call to %v", call) base.Errorf("invalid use of ... in call to %v", call)

View File

@ -29,7 +29,7 @@ var (
_ = sum(tuple()) _ = sum(tuple())
_ = sum(tuple()...) // ERROR "multiple-value" _ = sum(tuple()...) // ERROR "multiple-value"
_ = sum3(tuple()) _ = sum3(tuple())
_ = sum3(tuple()...) // ERROR "multiple-value" _ = sum3(tuple()...) // ERROR "multiple-value" ERROR "invalid use of .*[.][.][.]"
) )
type T []T type T []T

View File

@ -0,0 +1,17 @@
// errorcheck
// 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
import (
"fmt"
)
func f(s1, s2 string) { fmt.Printf("%s %s", s1, s2) }
func main() {
f([2]string{"a", "b"}...) // ERROR "invalid use of .*[.][.][.]|cannot use [.][.][.] in call to non-variadic"
}