diff options
-rw-r--r-- | src/cmd/gc/walk.c | 22 | ||||
-rw-r--r-- | src/lib/io/pipe_test.go | 2 |
2 files changed, 11 insertions, 13 deletions
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 73872213f..13e915fc1 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -1955,7 +1955,7 @@ ascompat(Type *dst, Type *src) if(eqtype(dst, src, 0)) return 1; - if(isslice(dst) && isfixedarray(src)) + if(isslice(dst) && isfixedarray(src) && eqtype(dst->type, src->type, 0)) return 1; if(isnilinter(dst) || isnilinter(src)) @@ -2080,6 +2080,8 @@ makecompat(Node *n) if(t != T) switch(t->etype) { case TARRAY: + if(!isslice(t)) + goto bad; return arrayop(n, Erv); case TMAP: return mapop(n, Erv); @@ -2087,15 +2089,11 @@ makecompat(Node *n) return chanop(n, Erv); } - /* - * ken had code to malloc here, - * but rsc cut it out so that make(int) - * is diagnosed as an error (probably meant new). - * might come back once we know the - * language semantics for make(int). - */ - - yyerror("cannot make(%T)", t); +bad: + if(!n->diag) { + n->diag = 1; + yyerror("cannot make(%T)", t); + } return n; } @@ -3223,7 +3221,7 @@ dorange(Node *nn) ary: hk = nod(OXXX, N, N); // hidden key tempname(hk, types[TINT]); - + ha = nod(OXXX, N, N); // hidden array tempname(ha, t); @@ -3305,7 +3303,7 @@ chan: hc = nod(OXXX, N, N); // hidden chan tempname(hc, t); - + hv = nod(OXXX, N, N); // hidden value tempname(hv, t->type); diff --git a/src/lib/io/pipe_test.go b/src/lib/io/pipe_test.go index 981197600..df2ed8941 100644 --- a/src/lib/io/pipe_test.go +++ b/src/lib/io/pipe_test.go @@ -148,7 +148,7 @@ func testPipeReadClose(t *testing.T, async bool) { } else { delayClose(t, w, c); } - var buf [64]int; + var buf [64]byte; n, err := r.Read(buf); <-c; if err != nil { |