summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-04-16 23:07:30 -0700
committerRuss Cox <rsc@golang.org>2009-04-16 23:07:30 -0700
commitdf02778ccda228c665179d0ff3dac77217ad6633 (patch)
treef2cd2aa5dfc0822885e98ff8f7e1419129c2c30a
parent5d2e2e64ba963e53d35350de8e2d4ba2891c9555 (diff)
downloadgolang-df02778ccda228c665179d0ff3dac77217ad6633.tar.gz
make string(array) take []byte only (and thus *[10]byte but not [10]byte)
R=ken OCL=27581 CL=27585
-rw-r--r--src/cmd/gc/walk.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index 1fa07dec0..f64ada8a4 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -1230,8 +1230,9 @@ walkconv(Node *n)
indir(n, stringop(n, Erv));
return;
}
- if(et == TARRAY)
- if(istype(l->type->type, TUINT8)) {
+ // can convert []byte and *[10]byte
+ if((isptr[et] && isfixedarray(l->type->type) && istype(l->type->type->type, TUINT8))
+ || (isslice(l->type) && istype(l->type->type, TUINT8))) {
n->op = OARRAY;
indir(n, stringop(n, Erv));
return;
@@ -1267,6 +1268,9 @@ walkconv(Node *n)
}
bad:
+ if(n->diag)
+ return;
+ n->diag = 1;
if(l->type != T)
yyerror("invalid conversion: %T to %T", l->type, t);
else
@@ -2204,8 +2208,6 @@ stringop(Node *n, int top)
case OARRAY:
// arraystring([]byte) string;
r = n->left;
- if(isfixedarray(r->type))
- r = nod(OADDR, r, N);
on = syslook("arraystring", 0);
r = nod(OCALL, on, r);
break;