mirror of
https://github.com/golang/go
synced 2024-11-26 08:27:56 -07:00
cmd/gc: comma-ok assignments produce untyped bool as 2nd result
LGTM=rsc R=gri, rsc CC=golang-codereviews https://golang.org/cl/127950043
This commit is contained in:
parent
b5674a2b72
commit
897f7a31fa
@ -593,6 +593,9 @@ orderstmt(Node *n, Order *order)
|
|||||||
orderexpr(&n->rlist->n->left, order); // arg to recv
|
orderexpr(&n->rlist->n->left, order); // arg to recv
|
||||||
ch = n->rlist->n->left->type;
|
ch = n->rlist->n->left->type;
|
||||||
tmp1 = ordertemp(ch->type, order, haspointers(ch->type));
|
tmp1 = ordertemp(ch->type, order, haspointers(ch->type));
|
||||||
|
if(!isblank(n->list->next->n))
|
||||||
|
tmp2 = ordertemp(n->list->next->n->type, order, 0);
|
||||||
|
else
|
||||||
tmp2 = ordertemp(types[TBOOL], order, 0);
|
tmp2 = ordertemp(types[TBOOL], order, 0);
|
||||||
order->out = list(order->out, n);
|
order->out = list(order->out, n);
|
||||||
r = nod(OAS, n->list->n, tmp1);
|
r = nod(OAS, n->list->n, tmp1);
|
||||||
|
@ -2965,7 +2965,7 @@ typecheckas2(Node *n)
|
|||||||
if(l->defn == n)
|
if(l->defn == n)
|
||||||
l->type = r->type;
|
l->type = r->type;
|
||||||
l = n->list->next->n;
|
l = n->list->next->n;
|
||||||
if(l->type != T)
|
if(l->type != T && l->type->etype != TBOOL)
|
||||||
checkassignto(types[TBOOL], l);
|
checkassignto(types[TBOOL], l);
|
||||||
if(l->defn == n && l->ntype == N)
|
if(l->defn == n && l->ntype == N)
|
||||||
l->type = types[TBOOL];
|
l->type = types[TBOOL];
|
||||||
|
@ -673,7 +673,7 @@ walkexpr(Node **np, NodeList **init)
|
|||||||
n1 = nod(OADDR, n->list->n, N);
|
n1 = nod(OADDR, n->list->n, N);
|
||||||
n1->etype = 1; // addr does not escape
|
n1->etype = 1; // addr does not escape
|
||||||
fn = chanfn("chanrecv2", 2, r->left->type);
|
fn = chanfn("chanrecv2", 2, r->left->type);
|
||||||
r = mkcall1(fn, types[TBOOL], init, typename(r->left->type), r->left, n1);
|
r = mkcall1(fn, n->list->next->n->type, init, typename(r->left->type), r->left, n1);
|
||||||
n = nod(OAS, n->list->next->n, r);
|
n = nod(OAS, n->list->next->n, r);
|
||||||
typecheck(&n, Etop);
|
typecheck(&n, Etop);
|
||||||
goto ret;
|
goto ret;
|
||||||
@ -723,6 +723,12 @@ walkexpr(Node **np, NodeList **init)
|
|||||||
var->typecheck = 1;
|
var->typecheck = 1;
|
||||||
fn = mapfn(p, t);
|
fn = mapfn(p, t);
|
||||||
r = mkcall1(fn, getoutargx(fn->type), init, typename(t), r->left, key);
|
r = mkcall1(fn, getoutargx(fn->type), init, typename(t), r->left, key);
|
||||||
|
|
||||||
|
// mapaccess2* returns a typed bool, but due to spec changes,
|
||||||
|
// the boolean result of i.(T) is now untyped so we make it the
|
||||||
|
// same type as the variable on the lhs.
|
||||||
|
if(!isblank(n->list->next->n))
|
||||||
|
r->type->type->down->type = n->list->next->n->type;
|
||||||
n->rlist = list1(r);
|
n->rlist = list1(r);
|
||||||
n->op = OAS2FUNC;
|
n->op = OAS2FUNC;
|
||||||
n->list->n = var;
|
n->list->n = var;
|
||||||
@ -770,6 +776,12 @@ walkexpr(Node **np, NodeList **init)
|
|||||||
*p = '\0';
|
*p = '\0';
|
||||||
|
|
||||||
fn = syslook(buf, 1);
|
fn = syslook(buf, 1);
|
||||||
|
|
||||||
|
// runtime.assert(E|I)2TOK returns a typed bool, but due
|
||||||
|
// to spec changes, the boolean result of i.(T) is now untyped
|
||||||
|
// so we make it the same type as the variable on the lhs.
|
||||||
|
if(!isblank(n->list->next->n))
|
||||||
|
fn->type->type->down->type->type = n->list->next->n->type;
|
||||||
ll = list1(typename(r->type));
|
ll = list1(typename(r->type));
|
||||||
ll = list(ll, r->left);
|
ll = list(ll, r->left);
|
||||||
argtype(fn, r->left->type);
|
argtype(fn, r->left->type);
|
||||||
|
25
test/fixedbugs/issue8475.go
Normal file
25
test/fixedbugs/issue8475.go
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// build
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// Issue 8745: comma-ok assignments should produce untyped bool as 2nd result.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
type mybool bool
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var ok mybool
|
||||||
|
_ = ok
|
||||||
|
|
||||||
|
var i interface{}
|
||||||
|
_, ok = i.(int)
|
||||||
|
|
||||||
|
var m map[int]int
|
||||||
|
_, ok = m[0]
|
||||||
|
|
||||||
|
var c chan int
|
||||||
|
_, ok = <-c
|
||||||
|
}
|
@ -41,21 +41,21 @@ func main() {
|
|||||||
asBool(1 != 2) // ok now
|
asBool(1 != 2) // ok now
|
||||||
asBool(i < j) // ok now
|
asBool(i < j) // ok now
|
||||||
|
|
||||||
_, b = m[2] // ERROR "cannot .* bool.*type Bool"
|
_, b = m[2] // ok now
|
||||||
|
|
||||||
var inter interface{}
|
var inter interface{}
|
||||||
_, b = inter.(Map) // ERROR "cannot .* bool.*type Bool"
|
_, b = inter.(Map) // ok now
|
||||||
_ = b
|
_ = b
|
||||||
|
|
||||||
var minter interface {
|
var minter interface {
|
||||||
M()
|
M()
|
||||||
}
|
}
|
||||||
_, b = minter.(Map) // ERROR "cannot .* bool.*type Bool"
|
_, b = minter.(Map) // ok now
|
||||||
_ = b
|
_ = b
|
||||||
|
|
||||||
_, bb := <-c
|
_, bb := <-c
|
||||||
asBool(bb) // ERROR "cannot use.*type bool.*as type Bool"
|
asBool(bb) // ERROR "cannot use.*type bool.*as type Bool"
|
||||||
_, b = <-c // ERROR "cannot .* bool.*type Bool"
|
_, b = <-c // ok now
|
||||||
_ = b
|
_ = b
|
||||||
|
|
||||||
asString(String(slice)) // ok
|
asString(String(slice)) // ok
|
||||||
|
Loading…
Reference in New Issue
Block a user