mirror of
https://github.com/golang/go
synced 2024-11-22 05:24:39 -07:00
allow conversion to interface type
when implicit assignment would have been okay. R=ken OCL=31225 CL=31227
This commit is contained in:
parent
53ebd163c6
commit
d436a70193
@ -3136,10 +3136,10 @@ runifacechecks(void)
|
|||||||
t, iface, m->sym, m->type);
|
t, iface, m->sym, m->type);
|
||||||
else if(!p->explicit && needexplicit) {
|
else if(!p->explicit && needexplicit) {
|
||||||
if(m)
|
if(m)
|
||||||
yyerror("need explicit conversion to use %T as %T\n\tmissing %S%hhT",
|
yyerror("need type assertion to use %T as %T\n\tmissing %S%hhT",
|
||||||
p->src, p->dst, m->sym, m->type);
|
p->src, p->dst, m->sym, m->type);
|
||||||
else
|
else
|
||||||
yyerror("need explicit conversion to use %T as %T",
|
yyerror("need type assertion to use %T as %T",
|
||||||
p->src, p->dst);
|
p->src, p->dst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1275,7 +1275,6 @@ walkconv(Node *n)
|
|||||||
|
|
||||||
// if using .(T), interface assertion.
|
// if using .(T), interface assertion.
|
||||||
if(n->op == ODOTTYPE) {
|
if(n->op == ODOTTYPE) {
|
||||||
// interface conversion
|
|
||||||
defaultlit(l, T);
|
defaultlit(l, T);
|
||||||
if(!isinter(l->type))
|
if(!isinter(l->type))
|
||||||
yyerror("type assertion requires interface on left, have %T", l->type);
|
yyerror("type assertion requires interface on left, have %T", l->type);
|
||||||
@ -1308,6 +1307,14 @@ walkconv(Node *n)
|
|||||||
n->op = OCONVNOP;
|
n->op = OCONVNOP;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// to/from interface.
|
||||||
|
// ifaceas1 will generate a good error
|
||||||
|
// if the conversion is invalid.
|
||||||
|
if(t->etype == TINTER || l->type->etype == TINTER) {
|
||||||
|
indir(n, ifacecvt(t, l, ifaceas1(t, l->type, 0)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// simple fix-float
|
// simple fix-float
|
||||||
if(isint[l->type->etype] || isfloat[l->type->etype])
|
if(isint[l->type->etype] || isfloat[l->type->etype])
|
||||||
|
@ -130,9 +130,7 @@ func send(req *Request) (resp *Response, err os.Error) {
|
|||||||
resp.AddHeader(key, value);
|
resp.AddHeader(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(rsc): Make this work:
|
r := io.Reader(reader);
|
||||||
// r := io.Reader(reader);
|
|
||||||
var r io.Reader = reader;
|
|
||||||
if v := resp.GetHeader("Transfer-Encoding"); v == "chunked" {
|
if v := resp.GetHeader("Transfer-Encoding"); v == "chunked" {
|
||||||
r = newChunkedReader(reader);
|
r = newChunkedReader(reader);
|
||||||
}
|
}
|
||||||
|
@ -15,13 +15,14 @@ type I interface { M() }
|
|||||||
var i I
|
var i I
|
||||||
|
|
||||||
type I2 interface { M(); N(); }
|
type I2 interface { M(); N(); }
|
||||||
var i2 I2;
|
var i2 I2
|
||||||
|
|
||||||
var e interface { };
|
type E interface { }
|
||||||
|
var e E
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
e = t; // ok
|
e = t; // ok
|
||||||
t = e; // ERROR "need explicit"
|
t = e; // ERROR "need explicit|need type assertion"
|
||||||
|
|
||||||
// neither of these can work,
|
// neither of these can work,
|
||||||
// because i has an extra method
|
// because i has an extra method
|
||||||
@ -30,5 +31,11 @@ func main() {
|
|||||||
t = i; // ERROR "missing|incompatible|is not"
|
t = i; // ERROR "missing|incompatible|is not"
|
||||||
|
|
||||||
i = i2; // ok
|
i = i2; // ok
|
||||||
i2 = i; // ERROR "need explicit"
|
i2 = i; // ERROR "need explicit|need type assertion"
|
||||||
|
|
||||||
|
i = I(i2); // ok
|
||||||
|
i2 = I2(i); // ERROR "need explicit|need type assertion"
|
||||||
|
|
||||||
|
e = E(t); // ok
|
||||||
|
t = T(e); // ERROR "need explicit|need type assertion"
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user