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); }
 }