complain when trying to put T into an interface

if T has pointer methods.  this is just a heuristic
but it catches the problem robert ran into and
lets me put the larger interface issues aside for
now.  found one bug in pretty.

R=ken
OCL=26141
CL=26141
This commit is contained in:
Russ Cox 2009-03-11 16:06:17 -07:00
parent 40e204b9eb
commit 4eb7ceba58
5 changed files with 54 additions and 47 deletions

View file

@ -2805,12 +2805,23 @@ ifacelookdot(Sym *s, Type *t)
// check whether non-interface type t
// satisifes inteface type iface.
int
ifaceokT2I(Type *t, Type *iface, Type **m)
ifaceokT2I(Type *t0, Type *iface, Type **m)
{
Type *im, *tm;
Type *t, *im, *tm;
int imhash;
t = methtype(t);
t = methtype(t0);
// stopgap: check for
// non-pointer type in T2I, methods want pointers.
// supposed to do something better eventually
// but this will catch errors while we decide the
// details of the "better" solution.
if(t == t0 && t->methptr == 2) {
yyerror("probably wanted *%T not %T", t, t);
*m = iface->type;
return 0;
}
// if this is too slow,
// could sort these first

View file

@ -64,10 +64,6 @@ Faulting address: 0x0
pc: xxx
=========== ./interface6.go
failure in f4 i
BUG interface6
=========== ./peano.go
0! = 1
1! = 1

View file

@ -35,11 +35,11 @@ func ptrs() {
var smallptr SmallPtr = SmallPtr{ 12345 };
var intptr IntPtr = 12345;
test("bigptr", bigptr);
// test("bigptr", bigptr);
test("&bigptr", &bigptr);
test("smallptr", smallptr);
// test("smallptr", smallptr);
test("&smallptr", &smallptr);
test("intptr", intptr);
// test("intptr", intptr);
test("&intptr", &intptr);
}

View file

@ -49,13 +49,13 @@ type S2 struct { i int }
func (p *S2) Get() int { return p.i }
func (p *S2) Put(i int) { p.i = i }
func f4() {
s := S2{1};
var i I1 = s;
i.Put(2);
check(i.Get() == 2, "f4 i");
check(s.i == 1, "f4 s");
}
// func f4() {
// s := S2{1};
// var i I1 = s;
// i.Put(2);
// check(i.Get() == 2, "f4 i");
// check(s.i == 1, "f4 s");
// }
func f5() {
s := S2{1};
@ -107,13 +107,13 @@ type S4 struct { i, j, k, l int64 }
func (p *S4) Get() int64 { return p.l }
func (p *S4) Put(i int64) { p.l = i }
func f10() {
s := S4{1, 2, 3, 4};
var i I2 = s;
i.Put(5);
check(i.Get() == 5, "f10 i");
check(s.l == 4, "f10 s");
}
// func f10() {
// s := S4{1, 2, 3, 4};
// var i I2 = s;
// i.Put(5);
// check(i.Get() == 5, "f10 i");
// check(s.l == 4, "f10 s");
// }
func f11() {
s := S4{1, 2, 3, 4};
@ -135,13 +135,13 @@ func main() {
f1();
f2();
f3();
f4();
// f4();
f5();
f6();
f7();
f8();
f9();
f10();
// f10();
f11();
f12();
if fail > 0 {

View file

@ -642,7 +642,7 @@ func (P *Parser) parseStructType() ast.Expr {
}
}
return ast.StructType{loc, fields, end};
return &ast.StructType{loc, fields, end};
}