1
0
mirror of https://github.com/golang/go synced 2024-11-24 23:07:56 -07:00

cmd/gc: add missing conversion from bool to interface in switches.

In switches without an expression, the compiler would not convert the implicit true to an interface, causing codegen errors.

Fixes #3980.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6497147
This commit is contained in:
Daniel Morsing 2012-09-17 21:29:10 +02:00
parent c7631f555f
commit 551e263823
2 changed files with 18 additions and 0 deletions

View File

@ -442,6 +442,10 @@ exprbsw(Case *c0, int ncase, int arg)
n = c0->node; n = c0->node;
lno = setlineno(n); lno = setlineno(n);
if(assignop(n->left->type, exprname->type, nil) == OCONVIFACE ||
assignop(exprname->type, n->left->type, nil) == OCONVIFACE)
goto snorm;
switch(arg) { switch(arg) {
case Strue: case Strue:
a = nod(OIF, N, N); a = nod(OIF, N, N);
@ -457,6 +461,7 @@ exprbsw(Case *c0, int ncase, int arg)
break; break;
default: default:
snorm:
a = nod(OIF, N, N); a = nod(OIF, N, N);
a->ntest = nod(OEQ, exprname, n->left); // if name == val a->ntest = nod(OEQ, exprname, n->left); // if name == val
typecheck(&a->ntest, Erv); typecheck(&a->ntest, Erv);
@ -520,6 +525,8 @@ exprswitch(Node *sw)
exprname = temp(sw->ntest->type); exprname = temp(sw->ntest->type);
cas = list1(nod(OAS, exprname, sw->ntest)); cas = list1(nod(OAS, exprname, sw->ntest));
typechecklist(cas, Etop); typechecklist(cas, Etop);
} else {
exprname = nodbool(arg == Strue);
} }
c0 = mkcaselist(sw, arg); c0 = mkcaselist(sw, arg);

View File

@ -294,6 +294,17 @@ func main() {
assert(false, `i should be "hello"`) assert(false, `i should be "hello"`)
} }
// switch on implicit bool converted to interface
// was broken: see issue 3980
switch i := interface{}(true); {
case i:
assert(true, "true")
case false:
assert(false, "i should be true")
default:
assert(false, "i should be true")
}
// switch on array. // switch on array.
switch ar := [3]int{1, 2, 3}; ar { switch ar := [3]int{1, 2, 3}; ar {
case [3]int{1,2,3}: case [3]int{1,2,3}: