cmd/compile: don't crash on (unsafe.Sizeof)(0)

Fixes #17270.

Change-Id: I4affa57e10baf1a758bc0977265d160f220b2945
Reviewed-on: https://go-review.googlesource.com/29960
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Matthew Dempsky 2016-09-28 15:04:00 -07:00
parent 4d07d3e29c
commit 03a1dc3522
2 changed files with 28 additions and 19 deletions

View file

@ -1185,11 +1185,12 @@ OpSwitch:
// call and call like
case OCALL:
n.Left = typecheck(n.Left, Erv|Etype|Ecall)
n.Diag |= n.Left.Diag
l := n.Left
if l.Op == ONAME {
r := unsafenmagic(n)
if r != nil {
if r := unsafenmagic(n); r != nil {
if n.Isddd {
yyerror("invalid use of ... with builtin %v", l)
}
@ -1197,25 +1198,22 @@ OpSwitch:
n = typecheck1(n, top)
return n
}
}
n.Left = typecheck(n.Left, Erv|Etype|Ecall)
n.Diag |= n.Left.Diag
l = n.Left
if l.Op == ONAME && l.Etype != 0 {
// TODO(marvin): Fix Node.EType type union.
if n.Isddd && Op(l.Etype) != OAPPEND {
yyerror("invalid use of ... with builtin %v", l)
if l.Etype != 0 {
// TODO(marvin): Fix Node.EType type union.
if n.Isddd && Op(l.Etype) != OAPPEND {
yyerror("invalid use of ... with builtin %v", l)
}
// builtin: OLEN, OCAP, etc.
// TODO(marvin): Fix Node.EType type union.
n.Op = Op(l.Etype)
n.Left = n.Right
n.Right = nil
n = typecheck1(n, top)
return n
}
// builtin: OLEN, OCAP, etc.
// TODO(marvin): Fix Node.EType type union.
n.Op = Op(l.Etype)
n.Left = n.Right
n.Right = nil
n = typecheck1(n, top)
return n
}
n.Left = defaultlit(n.Left, nil)

View file

@ -0,0 +1,11 @@
// compile
// 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 p
import "unsafe"
const _ = (unsafe.Sizeof)(0)