]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't crash reporting misuse of shadowed built-in function
authortaylorza <taylorza@gmail.com>
Sun, 2 Sep 2018 22:09:29 +0000 (18:09 -0400)
committerRobert Griesemer <gri@golang.org>
Thu, 6 Sep 2018 02:49:21 +0000 (02:49 +0000)
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 <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/issue27356.go [new file with mode: 0644]

index cc98c3ae69e6c25c69e8f9a9da71efa88bbc5066..bb78d8bf73d8d303c478b9d059273ee867956a1c 100644 (file)
@@ -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 (file)
index 0000000..4278487
--- /dev/null
@@ -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"
+