mirror of
https://github.com/golang/go.git
synced 2024-09-22 02:48:50 +00:00
cmd/compile: improved error message when calling a shadowed builtin
Otherwise, the error can be confusing if one forgets or doesn't know that the builtin is being shadowed, which is not common practice. Fixes #22822. Change-Id: I735393b5ce28cb83815a1c3f7cd2e7bb5080a32d Reviewed-on: https://go-review.googlesource.com/97455 Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
4b1d704d14
commit
1e308fbc1a
@ -1250,7 +1250,15 @@ func typecheck1(n *Node, top int) *Node {
|
||||
default:
|
||||
n.Op = OCALLFUNC
|
||||
if t.Etype != TFUNC {
|
||||
yyerror("cannot call non-function %v (type %v)", l, t)
|
||||
name := l.String()
|
||||
if isBuiltinFuncName(name) {
|
||||
// be more specific when the function
|
||||
// name matches a predeclared function
|
||||
yyerror("cannot call non-function %s (type %v), declared at %s",
|
||||
name, t, linestr(l.Name.Defn.Pos))
|
||||
} else {
|
||||
yyerror("cannot call non-function %s (type %v)", name, t)
|
||||
}
|
||||
n.Type = nil
|
||||
return n
|
||||
}
|
||||
|
@ -65,6 +65,17 @@ var builtinFuncs = [...]struct {
|
||||
{"recover", ORECOVER},
|
||||
}
|
||||
|
||||
// isBuiltinFuncName reports whether name matches a builtin function
|
||||
// name.
|
||||
func isBuiltinFuncName(name string) bool {
|
||||
for _, fn := range builtinFuncs {
|
||||
if fn.name == name {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
var unsafeFuncs = [...]struct {
|
||||
name string
|
||||
op Op
|
||||
|
16
test/fixedbugs/issue22822.go
Normal file
16
test/fixedbugs/issue22822.go
Normal file
@ -0,0 +1,16 @@
|
||||
// errorcheck
|
||||
|
||||
// Copyright 2018 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.
|
||||
|
||||
// Check that calling a function shadowing a built-in provides a good
|
||||
// error message.
|
||||
|
||||
package main
|
||||
|
||||
func F() {
|
||||
slice := []int{1, 2, 3}
|
||||
len := int(2)
|
||||
println(len(slice)) // ERROR "cannot call non-function len .type int., declared at"
|
||||
}
|
Loading…
Reference in New Issue
Block a user