]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix conversion error message for printed slices
authorEmmanuel Odeke <emm.odeke@gmail.com>
Sat, 30 Jul 2016 08:45:27 +0000 (01:45 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Thu, 2 Feb 2017 05:10:22 +0000 (05:10 +0000)
Fixes #15055.

Updates exprfmt printing using fmt verb "%v" to check that n.Left
is non-nil before attempting to print it, otherwise we'll print
the nodes in the list using verb "%.v".

Credit to @mdempsky for this approach and for finding
the root cause of the issue.

Change-Id: I20a6464e916dc70d5565e145164bb9553e5d3865
Reviewed-on: https://go-review.googlesource.com/25361
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

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

index e76d38a64b1b988937e1c04d9c4014d09aea360a..835d34bb7ff78e549ef1409eccf7a12493dc5602 100644 (file)
@@ -1335,14 +1335,15 @@ func (n *Node) exprfmt(s fmt.State, prec int) {
                OSTRARRAYRUNE,
                ORUNESTR:
                if n.Type == nil || n.Type.Sym == nil {
-                       fmt.Fprintf(s, "(%v)(%v)", n.Type, n.Left)
-                       return
+                       fmt.Fprintf(s, "(%v)", n.Type)
+               } else {
+                       fmt.Fprintf(s, "%v", n.Type)
                }
                if n.Left != nil {
-                       fmt.Fprintf(s, "%v(%v)", n.Type, n.Left)
-                       return
+                       fmt.Fprintf(s, "(%v)", n.Left)
+               } else {
+                       fmt.Fprintf(s, "(%.v)", n.List)
                }
-               fmt.Fprintf(s, "%v(%.v)", n.Type, n.List)
 
        case OREAL,
                OIMAG,
diff --git a/test/fixedbugs/issue15055.go b/test/fixedbugs/issue15055.go
new file mode 100644 (file)
index 0000000..e58047e
--- /dev/null
@@ -0,0 +1,17 @@
+// errorcheck
+
+// Copyright 2016 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
+
+func main() {
+       type name string
+       _ = []byte("abc", "def", 12)    // ERROR "too many arguments to conversion to \[\]byte: \(\[\]byte\)\(.abc., .def., 12\)"
+       _ = string("a", "b", nil)       // ERROR "too many arguments to conversion to string: string\(.a., .b., nil\)"
+       _ = []byte()                    // ERROR "missing argument to conversion to \[\]byte: \(\[\]byte\)\(\)"
+       _ = string()                    // ERROR "missing argument to conversion to string: string\(\)"
+       _ = name("a", 1, 3.3)           // ERROR "too many arguments to conversion to name: name\(.a., 1, 3.3\)"
+       _ = map[string]string(nil, nil) // ERROR "too many arguments to conversion to map\[string\]string: \(map\[string\]string\)\(nil, nil\)"
+}