]> Cypherpunks repositories - gostls13.git/commitdiff
gc: implement new slice spec
authorScott Lawrence <bytbox@gmail.com>
Thu, 9 Sep 2010 02:20:29 +0000 (22:20 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 9 Sep 2010 02:20:29 +0000 (22:20 -0400)
Fixes #382.

R=gri, cw, r, rsc
CC=golang-dev
https://golang.org/cl/1957045

src/cmd/gc/go.y
src/cmd/gc/typecheck.c
src/cmd/gc/walk.c

index 99ff40724bb200d752d38a2321784f074f1b128c..48b8c711e1e3170c3b38d57ec486bdbda7027322 100644 (file)
@@ -845,10 +845,6 @@ pexpr_no_paren:
        }
 |      pexpr '[' oexpr ':' oexpr ']'
        {
-               if($3 == N) {
-                       yyerror("missing lower bound in slice expression");
-                       $3 = nodintconst(0);
-               }
                $$ = nod(OSLICE, $1, nod(OKEY, $3, $5));
        }
 |      pseudocall
index 4adbcabe41e11a96d43e9670869dfa61ba264830..dcf862a0feb6d6d1a0e331404b5dd7faeacc24a4 100644 (file)
@@ -654,15 +654,13 @@ reswitch:
                        typecheck(&n->left, top);
                }
                implicitstar(&n->left);
-               if(n->right->left == N) {
-                       yyerror("missing slice bounds?");
-                       goto error;
+               if(n->right->left != N) {
+                       if((t = n->right->left->type) == T)
+                               goto error;
+                       if(!isint[t->etype]) {
+                               yyerror("invalid slice index %#N (type %T)", n->right->left, t);
+                               goto error;
                }
-               if((t = n->right->left->type) == T)
-                       goto error;
-               if(!isint[t->etype]) {
-                       yyerror("invalid slice index %#N (type %T)", n->right->left, t);
-                       goto error;
                }
                if(n->right->right != N) {
                        if((t = n->right->right->type) == T)
index 775bcec9c6816b449e5f0bc344f4ab79f8a0f586..c22781c42642d655a38a43bb813748d046ea044e 100644 (file)
@@ -1095,13 +1095,17 @@ walkexpr(Node **np, NodeList **init)
                // sliceslice(old []any, lb uint64, hb uint64, width uint64) (ary []any)
                // sliceslice1(old []any, lb uint64, width uint64) (ary []any)
                t = n->type;
+               if(n->right->left == N)
+                       l = nodintconst(0);
+               else
+                       l = conv(n->right->left, types[TUINT64]);
                if(n->right->right != N) {
                        fn = syslook("sliceslice", 1);
                        argtype(fn, t->type);                   // any-1
                        argtype(fn, t->type);                   // any-2
                        n = mkcall1(fn, t, init,
                                n->left,
-                               conv(n->right->left, types[TUINT64]),
+                               l,
                                conv(n->right->right, types[TUINT64]),
                                nodintconst(t->type->width));
                } else {
@@ -1110,7 +1114,7 @@ walkexpr(Node **np, NodeList **init)
                        argtype(fn, t->type);                   // any-2
                        n = mkcall1(fn, t, init,
                                n->left,
-                               conv(n->right->left, types[TUINT64]),
+                               l,
                                nodintconst(t->type->width));
                }
                goto ret;
@@ -1122,13 +1126,17 @@ walkexpr(Node **np, NodeList **init)
                fn = syslook("slicearray", 1);
                argtype(fn, n->left->type);     // any-1
                argtype(fn, t->type);                   // any-2
+               if(n->right->left == N)
+                       l = nodintconst(0);
+               else
+                       l = conv(n->right->left, types[TUINT64]);
                if(n->right->right == N)
                        r = nodintconst(n->left->type->bound);
                else
                        r = conv(n->right->right, types[TUINT64]);
                n = mkcall1(fn, t, init,
                        nod(OADDR, n->left, N), nodintconst(n->left->type->bound),
-                       conv(n->right->left, types[TUINT64]),
+                       l,
                        r,
                        nodintconst(t->type->width));
                goto ret;
@@ -1213,15 +1221,19 @@ walkexpr(Node **np, NodeList **init)
 
        case OSLICESTR:
                // sys_slicestring(s, lb, hb)
+               if(n->right->left == N)
+                       l = nodintconst(0);
+               else
+                       l = conv(n->right->left, types[TINT]);
                if(n->right->right) {
                        n = mkcall("slicestring", n->type, init,
                                conv(n->left, types[TSTRING]),
-                               conv(n->right->left, types[TINT]),
+                               l,
                                conv(n->right->right, types[TINT]));
                } else {
                        n = mkcall("slicestring1", n->type, init,
                                conv(n->left, types[TSTRING]),
-                               conv(n->right->left, types[TINT]));
+                               l);
                }
                goto ret;