diff options
author | Russ Cox <rsc@golang.org> | 2014-10-28 23:22:46 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-10-28 23:22:46 -0400 |
commit | 6b54cc93d015e4cab1b12c8c78edf1d4a0a7cd0e (patch) | |
tree | 33df7bdf70271b94eb9b4874c9d522f3af895008 | |
parent | c88ba199e2cf24b6dff3d069b50d3bccda4c1552 (diff) | |
download | go-6b54cc93d015e4cab1b12c8c78edf1d4a0a7cd0e.tar.gz go-6b54cc93d015e4cab1b12c8c78edf1d4a0a7cd0e.zip |
cmd/gc: fix internal compiler error in struct compare
Fixes #9006.
LGTM=r
R=r
CC=golang-codereviews
https://golang.org/cl/167800043
-rw-r--r-- | src/cmd/gc/walk.c | 17 | ||||
-rw-r--r-- | test/fixedbugs/issue9006.go | 37 |
2 files changed, 49 insertions, 5 deletions
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index e5f2217970..2986f4b542 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -3157,7 +3157,7 @@ countfield(Type *t) static void walkcompare(Node **np, NodeList **init) { - Node *n, *l, *r, *call, *a, *li, *ri, *expr; + Node *n, *l, *r, *call, *a, *li, *ri, *expr, *cmpl, *cmpr; int andor, i; Type *t, *t1; @@ -3177,18 +3177,25 @@ walkcompare(Node **np, NodeList **init) break; } - if(!islvalue(n->left) || !islvalue(n->right)) { - fatal("arguments of comparison must be lvalues"); + cmpl = n->left; + while(cmpl != N && cmpl->op == OCONVNOP) + cmpl = cmpl->left; + cmpr = n->right; + while(cmpr != N && cmpr->op == OCONVNOP) + cmpr = cmpr->left; + + if(!islvalue(cmpl) || !islvalue(cmpr)) { + fatal("arguments of comparison must be lvalues - %N %N", cmpl, cmpr); } l = temp(ptrto(t)); - a = nod(OAS, l, nod(OADDR, n->left, N)); + a = nod(OAS, l, nod(OADDR, cmpl, N)); a->right->etype = 1; // addr does not escape typecheck(&a, Etop); *init = list(*init, a); r = temp(ptrto(t)); - a = nod(OAS, r, nod(OADDR, n->right, N)); + a = nod(OAS, r, nod(OADDR, cmpr, N)); a->right->etype = 1; // addr does not escape typecheck(&a, Etop); *init = list(*init, a); diff --git a/test/fixedbugs/issue9006.go b/test/fixedbugs/issue9006.go new file mode 100644 index 0000000000..c559f58f14 --- /dev/null +++ b/test/fixedbugs/issue9006.go @@ -0,0 +1,37 @@ +// run + +// 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. + +package main + +type T1 struct { + X int +} + +func NewT1(x int) T1 { return T1{x} } + +type T2 int + +func NewT2(x int) T2 { return T2(x) } + +func main() { + switch (T1{}) { + case NewT1(1): + panic("bad1") + case NewT1(0): + // ok + default: + panic("bad2") + } + + switch T2(0) { + case NewT2(2): + panic("bad3") + case NewT2(0): + // ok + default: + panic("bad4") + } +} |