]> Cypherpunks repositories - gostls13.git/commitdiff
code gen bug in len(nil) and cap(nil)
authorKen Thompson <ken@golang.org>
Tue, 29 Jun 2010 19:48:24 +0000 (12:48 -0700)
committerKen Thompson <ken@golang.org>
Tue, 29 Jun 2010 19:48:24 +0000 (12:48 -0700)
fixes #892

R=rsc
CC=golang-dev
https://golang.org/cl/1745042

src/cmd/5g/gsubr.c
src/cmd/6g/gsubr.c
src/cmd/8g/gsubr.c

index ea6ab1d70bccab811339920e4fa7c79d9594fcd6..700602c3501d8512b9637dc9a226bbc03210d433 100644 (file)
@@ -1137,6 +1137,8 @@ naddr(Node *n, Addr *a, int canemitcode)
        case OLEN:
                // len of string or slice
                naddr(n->left, a, canemitcode);
+               if(a->type == D_CONST && a->offset == 0)
+                       break;  // len(nil)
                a->offset += Array_nel;
                if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero)
                        checkoffset(a, canemitcode);
@@ -1145,6 +1147,8 @@ naddr(Node *n, Addr *a, int canemitcode)
        case OCAP:
                // cap of string or slice
                naddr(n->left, a, canemitcode);
+               if(a->type == D_CONST && a->offset == 0)
+                       break;  // cap(nil)
                a->offset += Array_cap;
                if(a->offset >= unmappedzero && a->offset-Array_cap < unmappedzero)
                        checkoffset(a, canemitcode);
index 1c11b14aebba0bbcc2639f1162238d6283516620..52ff6fdea2d347a546ad8b5c9fa807ea97c19140 100644 (file)
@@ -1079,6 +1079,8 @@ naddr(Node *n, Addr *a, int canemitcode)
        case OLEN:
                // len of string or slice
                naddr(n->left, a, canemitcode);
+               if(a->type == D_CONST && a->offset == 0)
+                       break;  // len(nil)
                a->etype = TUINT;
                a->offset += Array_nel;
                if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero)
@@ -1088,6 +1090,8 @@ naddr(Node *n, Addr *a, int canemitcode)
        case OCAP:
                // cap of string or slice
                naddr(n->left, a, canemitcode);
+               if(a->type == D_CONST && a->offset == 0)
+                       break;  // cap(nil)
                a->etype = TUINT;
                a->offset += Array_cap;
                if(a->offset >= unmappedzero && a->offset-Array_cap < unmappedzero)
index 3e85b7e30e857bf5050cb2d6d898fdd8d2c37a22..6890c683e6fd9df063ca3168e4b9a535f0f4ad94 100644 (file)
@@ -1789,6 +1789,8 @@ naddr(Node *n, Addr *a, int canemitcode)
        case OLEN:
                // len of string or slice
                naddr(n->left, a, canemitcode);
+               if(a->type == D_CONST && a->offset == 0)
+                       break;  // len(nil)
                a->etype = TUINT;
                a->offset += Array_nel;
                if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero)
@@ -1798,6 +1800,8 @@ naddr(Node *n, Addr *a, int canemitcode)
        case OCAP:
                // cap of string or slice
                naddr(n->left, a, canemitcode);
+               if(a->type == D_CONST && a->offset == 0)
+                       break;  // cap(nil)
                a->etype = TUINT;
                a->offset += Array_cap;
                if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero)