Commit 9be56adf authored by Russ Cox's avatar Russ Cox

gc: allow implicit conversion of *[10]int -> []int

when used as arg to copy.

R=ken2
https://golang.org/cl/157071
parent 91cf0af1
...@@ -32,6 +32,7 @@ static void checklvalue(Node*, char*); ...@@ -32,6 +32,7 @@ static void checklvalue(Node*, char*);
static void checkassign(Node*); static void checkassign(Node*);
static void checkassignlist(NodeList*); static void checkassignlist(NodeList*);
static int islvalue(Node*); static int islvalue(Node*);
static void toslice(Node**);
void void
typechecklist(NodeList *l, int top) typechecklist(NodeList *l, int top)
...@@ -777,12 +778,16 @@ reswitch: ...@@ -777,12 +778,16 @@ reswitch:
n->type = types[TINT]; n->type = types[TINT];
typecheck(&n->left, Erv); typecheck(&n->left, Erv);
typecheck(&n->right, Erv); typecheck(&n->right, Erv);
if(n->left->type == T || n->right->type == T)
goto error;
toslice(&n->left);
toslice(&n->right);
if(!isslice(n->left->type) || !isslice(n->right->type)) { if(!isslice(n->left->type) || !isslice(n->right->type)) {
yyerror("arguments to copy must be slices"); yyerror("arguments to copy must be slices or array pointers");
goto error; goto error;
} }
if(!eqtype(n->left->type, n->right->type)) { if(!eqtype(n->left->type, n->right->type)) {
yyerror("arguments to copy must be slices of the same type"); yyerror("arguments to copy must have the same type element type");
goto error; goto error;
} }
goto ret; goto ret;
...@@ -1120,6 +1125,25 @@ implicitstar(Node **nn) ...@@ -1120,6 +1125,25 @@ implicitstar(Node **nn)
*nn = n; *nn = n;
} }
static void
toslice(Node **nn)
{
Node *n;
Type *t;
n = *nn;
if(n->type == T)
return;
if(isptr[n->type->etype] && isfixedarray(n->type->type)) {
// convert to slice
t = typ(TARRAY);
t->bound = -1;
t->type = n->type->type->type;
n = typecheckconv(nil, n, t, 0, "conversion of array pointer to slice");
*nn = n;
}
}
static int static int
onearg(Node *n) onearg(Node *n)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment