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:
parent
c7631f555f
commit
551e263823
@ -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);
|
||||||
|
@ -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}:
|
||||||
|
Loading…
Reference in New Issue
Block a user