From 4a095b87d30f1f6f7ae01e966f1af5ee63b15c1c Mon Sep 17 00:00:00 2001 From: taylorza Date: Sun, 2 Sep 2018 18:09:29 -0400 Subject: [PATCH] cmd/compile: don't crash reporting misuse of shadowed built-in function The existing implementation causes a compiler panic if a function parameter shadows a built-in function, and then calling that shadowed name. Fixes #27356 Change-Id: I1ffb6dc01e63c7f499e5f6f75f77ce2318f35bcd Reviewed-on: https://go-review.googlesource.com/132876 Reviewed-by: Robert Griesemer Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/typecheck.go | 2 +- test/fixedbugs/issue27356.go | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue27356.go diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index cc98c3ae69e6c2..bb78d8bf73d8d3 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -1263,7 +1263,7 @@ func typecheck1(n *Node, top int) *Node { n.Op = OCALLFUNC if t.Etype != TFUNC { name := l.String() - if isBuiltinFuncName(name) { + if isBuiltinFuncName(name) && l.Name.Defn != nil { // be more specific when the function // name matches a predeclared function yyerror("cannot call non-function %s (type %v), declared at %s", diff --git a/test/fixedbugs/issue27356.go b/test/fixedbugs/issue27356.go new file mode 100644 index 00000000000000..42784876a558a2 --- /dev/null +++ b/test/fixedbugs/issue27356.go @@ -0,0 +1,19 @@ +// 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. + +// Issue 27356: function parameter hiding built-in function results in compiler crash + +package p + +var a = []int{1,2,3} + +func _(len int) { + _ = len(a) // ERROR "cannot call non-function" +} + +var cap = false +var _ = cap(a) // ERROR "cannot call non-function" +