]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: avoid panic when printing *<N>
authorJosh Bleecher Snyder <josharian@gmail.com>
Wed, 3 May 2017 14:45:20 +0000 (07:45 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Wed, 3 May 2017 14:59:29 +0000 (14:59 +0000)
When compiling the program:

package p

func _(){
*;:=
}

Before:

x.go:4:3: syntax error: unexpected semicolon, expecting expression
x.go:4:4: non-name *%!v(PANIC=runtime error: invalid memory address or nil pointer dereference) on left side of :=
x.go:5:1: syntax error: unexpected }, expecting expression

After:

x.go:4:3: syntax error: unexpected semicolon, expecting expression
x.go:4:4: non-name *<N> on left side of :=
x.go:5:1: syntax error: unexpected }, expecting expression

No test because:

(1) we don't have a good mechanism to check for the
    absence of the string "PANIC" in an error message
(2) the string "*<N>", while better, is itself ugly enough
    that I don't want to actively check for it
(3) the bug isn't very important, the kind of thing only fuzzers encounter
(4) the fix is obvious and trivial

Fixes #20220

Change-Id: I35faa986b60b671414ee999d6264b06937f250e3
Reviewed-on: https://go-review.googlesource.com/42498
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
Reviewed-by: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/fmt.go

index 7534effe2815e25c3002c4ebe461955469c07430..41502268a7bec46c22a8e900af2660616cb390b2 100644 (file)
@@ -1509,16 +1509,10 @@ func (n *Node) exprfmt(s fmt.State, prec int, mode fmtMode) {
                }
                mode.Fprintf(s, "make(%v)", n.Type)
 
+       case OPLUS, OMINUS, OADDR, OCOM, OIND, ONOT, ORECV:
                // Unary
-       case OPLUS,
-               OMINUS,
-               OADDR,
-               OCOM,
-               OIND,
-               ONOT,
-               ORECV:
                mode.Fprintf(s, "%#v", n.Op)
-               if n.Left.Op == n.Op {
+               if n.Left != nil && n.Left.Op == n.Op {
                        fmt.Fprint(s, " ")
                }
                n.Left.exprfmt(s, nprec+1, mode)