diff --git a/src/cmd/8g/cgen.c b/src/cmd/8g/cgen.c index 7b44bac0d3..33506c770c 100644 --- a/src/cmd/8g/cgen.c +++ b/src/cmd/8g/cgen.c @@ -827,16 +827,19 @@ igen(Node *n, Node *a, Node *res) return; case ODOTPTR: - if(n->left->addable - || n->left->op == OCALLFUNC - || n->left->op == OCALLMETH - || n->left->op == OCALLINTER) { + switch(n->left->op) { + case ODOT: + case ODOTPTR: + case OCALLFUNC: + case OCALLMETH: + case OCALLINTER: // igen-able nodes. igen(n->left, &n1, res); regalloc(a, types[tptr], &n1); gmove(&n1, a); regfree(&n1); - } else { + break; + default: regalloc(a, types[tptr], res); cgen(n->left, a); } diff --git a/src/cmd/8g/gsubr.c b/src/cmd/8g/gsubr.c index c5f6c22428..d6d171227c 100644 --- a/src/cmd/8g/gsubr.c +++ b/src/cmd/8g/gsubr.c @@ -1747,7 +1747,7 @@ gins(int as, Node *f, Node *t) case ALEAL: if(f != N && isconst(f, CTNIL)) - fatal("gins LEAQ nil %T", f->type); + fatal("gins LEAL nil %T", f->type); break; } diff --git a/test/fixedbugs/issue4399.go b/test/fixedbugs/issue4399.go new file mode 100644 index 0000000000..6674db9ec3 --- /dev/null +++ b/test/fixedbugs/issue4399.go @@ -0,0 +1,15 @@ +// compile + +// Copyright 2012 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 4399: 8g would print "gins LEAQ nil *A". + +package main + +type A struct{ a int } + +func main() { + println(((*A)(nil)).a) +}