mirror of
https://github.com/golang/go
synced 2024-11-21 17:34:40 -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;
|
||||
lno = setlineno(n);
|
||||
|
||||
if(assignop(n->left->type, exprname->type, nil) == OCONVIFACE ||
|
||||
assignop(exprname->type, n->left->type, nil) == OCONVIFACE)
|
||||
goto snorm;
|
||||
|
||||
switch(arg) {
|
||||
case Strue:
|
||||
a = nod(OIF, N, N);
|
||||
@ -457,6 +461,7 @@ exprbsw(Case *c0, int ncase, int arg)
|
||||
break;
|
||||
|
||||
default:
|
||||
snorm:
|
||||
a = nod(OIF, N, N);
|
||||
a->ntest = nod(OEQ, exprname, n->left); // if name == val
|
||||
typecheck(&a->ntest, Erv);
|
||||
@ -520,6 +525,8 @@ exprswitch(Node *sw)
|
||||
exprname = temp(sw->ntest->type);
|
||||
cas = list1(nod(OAS, exprname, sw->ntest));
|
||||
typechecklist(cas, Etop);
|
||||
} else {
|
||||
exprname = nodbool(arg == Strue);
|
||||
}
|
||||
|
||||
c0 = mkcaselist(sw, arg);
|
||||
|
@ -294,6 +294,17 @@ func main() {
|
||||
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 ar := [3]int{1, 2, 3}; ar {
|
||||
case [3]int{1,2,3}:
|
||||
|
Loading…
Reference in New Issue
Block a user