cmd/gc: fix bad checknil with ints on 32 bit compilers

Fixes #7413.

LGTM=rsc
R=remyoudompheng
CC=golang-codereviews, r, rsc
https://golang.org/cl/69180044
This commit is contained in:
Josh Bleecher Snyder 2014-02-26 12:25:13 -08:00
parent 7954b2b90b
commit 3081261b58
2 changed files with 26 additions and 2 deletions

View file

@ -471,8 +471,8 @@ cgen_checknil(Node *n)
if(disable_checknil)
return;
// Ideally we wouldn't see any TUINTPTR here, but we do.
if(n->type == T || (!isptr[n->type->etype] && n->type->etype != TUINTPTR && n->type->etype != TUNSAFEPTR)) {
// Ideally we wouldn't see any integer types here, but we do.
if(n->type == T || (!isptr[n->type->etype] && !isint[n->type->etype] && n->type->etype != TUNSAFEPTR)) {
dump("checknil", n);
fatal("bad checknil");
}

24
test/nilptr4.go Normal file
View file

@ -0,0 +1,24 @@
// build
// Copyright 2014 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.
// Test that the compiler does not crash during compilation.
package main
import "unsafe"
// Issue 7413
func f1() {
type t struct {
i int
}
var v *t
_ = int(uintptr(unsafe.Pointer(&v.i)))
_ = int32(uintptr(unsafe.Pointer(&v.i)))
}
func main() {}