From 9be56adf3c6339543a59a208c2cd354b0e81b95c Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 18 Nov 2009 14:26:28 -0800 Subject: [PATCH] gc: allow implicit conversion of *[10]int -> []int when used as arg to copy. R=ken2 https://golang.org/cl/157071 --- src/cmd/gc/typecheck.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c index 3e88237859..6dab9d7614 100644 --- a/src/cmd/gc/typecheck.c +++ b/src/cmd/gc/typecheck.c @@ -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) { -- 2.50.0