insert type assertions when narrowing.
R=r
OCL=24349
CL=24913
diff --git a/test/chan/powser2.go b/test/chan/powser2.go
index 6e769e9..b481108 100644
--- a/test/chan/powser2.go
+++ b/test/chan/powser2.go
@@ -126,7 +126,7 @@
func get(in *dch) *rat {
seqno++;
in.req <- seqno;
- return <-in.dat;
+ return (<-in.dat).(*rat);
}
// Get one item from each of n demand channels
@@ -332,9 +332,9 @@
for {
<-Z.req;
uv = get2(U,V);
- switch end(uv[0])+2*end(uv[1]) {
+ switch end(uv[0].(*rat))+2*end(uv[1].(*rat)) {
case 0:
- Z.dat <- add(uv[0], uv[1]);
+ Z.dat <- add(uv[0].(*rat), uv[1].(*rat));
case 1:
Z.dat <- uv[1];
copy(V,Z);
@@ -448,13 +448,13 @@
go func(U, V, Z PS){
<-Z.req;
uv := get2(U,V);
- if end(uv[0])!=0 || end(uv[1]) != 0 {
+ if end(uv[0].(*rat))!=0 || end(uv[1].(*rat)) != 0 {
Z.dat <- finis;
} else {
- Z.dat <- mul(uv[0],uv[1]);
+ Z.dat <- mul(uv[0].(*rat),uv[1].(*rat));
UU := Split(U);
VV := Split(V);
- W := Add(Cmul(uv[0],VV[0]),Cmul(uv[1],UU[0]));
+ W := Add(Cmul(uv[0].(*rat),VV[0]),Cmul(uv[1].(*rat),UU[0]));
<-Z.req;
Z.dat <- get(W);
copy(Add(W,Mul(UU[1],VV[1])),Z);
diff --git a/test/fixedbugs/bug027.go b/test/fixedbugs/bug027.go
index 1630050..acc295d 100644
--- a/test/fixedbugs/bug027.go
+++ b/test/fixedbugs/bug027.go
@@ -46,7 +46,7 @@
v.Insert(i0);
for i := 0; i < v.nelem; i++ {
var x *I;
- x = v.At(i);
+ x = v.At(i).(*I);
print(i, " ", x.val, "\n"); // prints correct list
}
for i := 0; i < v.nelem; i++ {
diff --git a/test/fixedbugs/bug054.go b/test/fixedbugs/bug054.go
index 0ed5d07..c8a2272 100644
--- a/test/fixedbugs/bug054.go
+++ b/test/fixedbugs/bug054.go
@@ -23,10 +23,7 @@
}
func (s *TStruct) field(i int) *TStruct {
- // works if we say
- // t := s.fields.At(i);
- // return t;
- return s.fields.At(i);
+ return s.fields.At(i).(*TStruct);
}
func main() {
diff --git a/test/fixedbugs/bug089.go b/test/fixedbugs/bug089.go
index 296e9e6..e3d8ff6 100644
--- a/test/fixedbugs/bug089.go
+++ b/test/fixedbugs/bug089.go
@@ -17,5 +17,5 @@
func
main()
{
- i2 = e(); // bug089.go:16: fatal error: agen_inter i2i
+ i2 = e().(I2); // bug089.go:16: fatal error: agen_inter i2i
}
diff --git a/test/fixedbugs/bug113.go b/test/fixedbugs/bug113.go
index ea75260..14bd076 100644
--- a/test/fixedbugs/bug113.go
+++ b/test/fixedbugs/bug113.go
@@ -11,10 +11,10 @@
func main() {
var i I;
i = 1;
- var v1 int = i;
+ var v1 = i.(int);
if foo1(v1) != 1 { panicln(1) }
- var v2 int32 = int32(i.(int));
+ var v2 = int32(i.(int));
if foo2(v2) != 1 { panicln(2) }
- var v3 int32 = i; // This implicit type conversion should fail at runtime.
+ var v3 = i.(int32); // This type conversion should fail at runtime.
if foo2(v3) != 1 { panicln(3) }
}
diff --git a/test/interface2.go b/test/interface2.go
index 1db0338..5367678 100644
--- a/test/interface2.go
+++ b/test/interface2.go
@@ -17,7 +17,7 @@
var i I;
var e interface {};
e = s;
- i = e;
+ i = e.(I);
}
// hide S down here to avoid static warning
diff --git a/test/interface5.go b/test/interface5.go
index 2e273dd..86036a7 100644
--- a/test/interface5.go
+++ b/test/interface5.go
@@ -12,10 +12,21 @@
type I interface { M() }
var i I
+type I2 interface { M(); N(); }
+var i2 I2;
+
+var e interface { };
+
func main() {
+ e = t; // ok
+ t = e; // ERROR "need explicit"
+
// neither of these can work,
// because i has an extra method
// that t does not, so i cannot contain a t.
- i = t; // ERROR "missing|incompatible"
- t = i; // ERROR "missing|incompatible"
+ i = t; // ERROR "missing|incompatible|is not"
+ t = i; // ERROR "missing|incompatible|is not"
+
+ i = i2; // ok
+ i2 = i; // ERROR "need explicit"
}
diff --git a/test/ken/embed.go b/test/ken/embed.go
index f0c9f4e..8f4641e 100644
--- a/test/ken/embed.go
+++ b/test/ken/embed.go
@@ -214,7 +214,7 @@
// run it thru an interface
i = s;
- s = i;
+ s = i.(*S);
// same as t3
if s.test1() != s.a1 { panicln("t4", 1) }
diff --git a/test/ken/interbasic.go b/test/ken/interbasic.go
index 05eea39..c6b982f 100644
--- a/test/ken/interbasic.go
+++ b/test/ken/interbasic.go
@@ -85,21 +85,21 @@
u32 = 4455; ia[11] = u32;
u64 = 765432; ia[12] = u64;
- s = ia[0]; if s != "xxx" { panicln(0,s); }
+ s = ia[0].(string); if s != "xxx" { panicln(0,s); }
i32 = int32(ia[1].(int));
if i32 != 12345 { panicln(1,i32); }
- b = ia[2]; if b != true { panicln(2,b); }
+ b = ia[2].(bool); if b != true { panicln(2,b); }
- s = ia[3]; if s != "now is" { panicln(3,s); }
- b = ia[4]; if b != false { panicln(4,b); }
+ s = ia[3].(string); if s != "now is" { panicln(3,s); }
+ b = ia[4].(bool); if b != false { panicln(4,b); }
- i8 = ia[5]; if i8 != 29 { panicln(5,i8); }
- i16 = ia[6]; if i16 != 994 { panicln(6,i16); }
- i32 = ia[7]; if i32 != 3434 { panicln(7,i32); }
- i64 = ia[8]; if i64 != 1234567 { panicln(8,i64); }
+ i8 = ia[5].(int8); if i8 != 29 { panicln(5,i8); }
+ i16 = ia[6].(int16); if i16 != 994 { panicln(6,i16); }
+ i32 = ia[7].(int32); if i32 != 3434 { panicln(7,i32); }
+ i64 = ia[8].(int64); if i64 != 1234567 { panicln(8,i64); }
- u8 = ia[9]; if u8 != 12 { panicln(5,u8); }
- u16 = ia[10]; if u16 != 799 { panicln(6,u16); }
- u32 = ia[11]; if u32 != 4455 { panicln(7,u32); }
- u64 = ia[12]; if u64 != 765432 { panicln(8,u64); }
+ u8 = ia[9].(uint8); if u8 != 12 { panicln(5,u8); }
+ u16 = ia[10].(uint16); if u16 != 799 { panicln(6,u16); }
+ u32 = ia[11].(uint32); if u32 != 4455 { panicln(7,u32); }
+ u64 = ia[12].(uint64); if u64 != 765432 { panicln(8,u64); }
}
diff --git a/test/ken/interfun.go b/test/ken/interfun.go
index 97db893..876d941 100644
--- a/test/ken/interfun.go
+++ b/test/ken/interfun.go
@@ -49,16 +49,16 @@
if s.g() != 6 { panic(12); }
i1 = s; // convert S to I1
- i2 = i1; // convert I1 to I2
+ i2 = i1.(I2); // convert I1 to I2
// call interface
if i1.f() != 5 { panic(21); }
if i2.f() != 5 { panic(22); }
if i2.g() != 6 { panic(23); }
- g = i1; // convert I1 to S
+ g = i1.(*S); // convert I1 to S
if g != s { panic(31); }
- g = i2; // convert I2 to S
+ g = i2.(*S); // convert I2 to S
if g != s { panic(32); }
}