mirror of
https://github.com/golang/go
synced 2024-11-11 19:41:36 -07:00
844e1fc6f1
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>
65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
// errorcheck
|
|
|
|
// Copyright 2010 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.
|
|
|
|
// Verify that illegal uses of ... are detected.
|
|
// Does not compile.
|
|
|
|
package main
|
|
|
|
import "unsafe"
|
|
|
|
func sum(args ...int) int { return 0 }
|
|
|
|
var (
|
|
_ = sum(1, 2, 3)
|
|
_ = sum()
|
|
_ = sum(1.0, 2.0)
|
|
_ = sum(1.5) // ERROR "integer"
|
|
_ = sum("hello") // ERROR ".hello. .type untyped string. as type int|incompatible"
|
|
_ = sum([]int{1}) // ERROR "\[\]int{...}.*as type int|incompatible"
|
|
)
|
|
|
|
func sum3(int, int, int) int { return 0 }
|
|
func tuple() (int, int, int) { return 1, 2, 3 }
|
|
|
|
var (
|
|
_ = sum(tuple())
|
|
_ = sum(tuple()...) // ERROR "multiple-value"
|
|
_ = sum3(tuple())
|
|
_ = sum3(tuple()...) // ERROR "multiple-value" ERROR "invalid use of .*[.][.][.]"
|
|
)
|
|
|
|
type T []T
|
|
|
|
func funny(args ...T) int { return 0 }
|
|
|
|
var (
|
|
_ = funny(nil)
|
|
_ = funny(nil, nil)
|
|
_ = funny([]T{}) // ok because []T{} is a T; passes []T{[]T{}}
|
|
)
|
|
|
|
func Foo(n int) {}
|
|
|
|
func bad(args ...int) {
|
|
print(1, 2, args...) // ERROR "[.][.][.]"
|
|
println(args...) // ERROR "[.][.][.]"
|
|
ch := make(chan int)
|
|
close(ch...) // ERROR "[.][.][.]"
|
|
_ = len(args...) // ERROR "[.][.][.]"
|
|
_ = new(int...) // ERROR "[.][.][.]"
|
|
n := 10
|
|
_ = make([]byte, n...) // ERROR "[.][.][.]"
|
|
_ = make([]byte, 10 ...) // ERROR "[.][.][.]"
|
|
var x int
|
|
_ = unsafe.Pointer(&x...) // ERROR "[.][.][.]"
|
|
_ = unsafe.Sizeof(x...) // ERROR "[.][.][.]"
|
|
_ = [...]byte("foo") // ERROR "[.][.][.]"
|
|
_ = [...][...]int{{1,2,3},{4,5,6}} // ERROR "[.][.][.]"
|
|
|
|
Foo(x...) // ERROR "invalid use of .*[.][.][.]"
|
|
}
|