]> Cypherpunks repositories - gostls13.git/commitdiff
gc: allow implicit conversion of *[10]int -> []int
authorRuss Cox <rsc@golang.org>
Wed, 18 Nov 2009 22:26:28 +0000 (14:26 -0800)
committerRuss Cox <rsc@golang.org>
Wed, 18 Nov 2009 22:26:28 +0000 (14:26 -0800)
when used as arg to copy.

R=ken2
https://golang.org/cl/157071

src/cmd/gc/typecheck.c

index 3e8823785925fd8254a81d1de6758d52b35fb417..6dab9d7614bd036275537e8785f61bcb17478ff4 100644 (file)
@@ -32,6 +32,7 @@ static void   checklvalue(Node*, char*);
 static void    checkassign(Node*);
 static void    checkassignlist(NodeList*);
 static int     islvalue(Node*);
+static void    toslice(Node**);
 
 void
 typechecklist(NodeList *l, int top)
@@ -777,12 +778,16 @@ reswitch:
                n->type = types[TINT];
                typecheck(&n->left, 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)) {
-                       yyerror("arguments to copy must be slices");
+                       yyerror("arguments to copy must be slices or array pointers");
                        goto error;
                }
                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 ret;
@@ -1120,6 +1125,25 @@ implicitstar(Node **nn)
        *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
 onearg(Node *n)
 {