Commit 1246ad83 authored by Ken Thompson's avatar Ken Thompson

code gen bug in len(nil) and cap(nil)

fixes #892

R=rsc
CC=golang-dev
https://golang.org/cl/1745042
parent 00ad47f9
...@@ -1137,6 +1137,8 @@ naddr(Node *n, Addr *a, int canemitcode) ...@@ -1137,6 +1137,8 @@ naddr(Node *n, Addr *a, int canemitcode)
case OLEN: case OLEN:
// len of string or slice // len of string or slice
naddr(n->left, a, canemitcode); naddr(n->left, a, canemitcode);
if(a->type == D_CONST && a->offset == 0)
break; // len(nil)
a->offset += Array_nel; a->offset += Array_nel;
if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero) if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero)
checkoffset(a, canemitcode); checkoffset(a, canemitcode);
...@@ -1145,6 +1147,8 @@ naddr(Node *n, Addr *a, int canemitcode) ...@@ -1145,6 +1147,8 @@ naddr(Node *n, Addr *a, int canemitcode)
case OCAP: case OCAP:
// cap of string or slice // cap of string or slice
naddr(n->left, a, canemitcode); naddr(n->left, a, canemitcode);
if(a->type == D_CONST && a->offset == 0)
break; // cap(nil)
a->offset += Array_cap; a->offset += Array_cap;
if(a->offset >= unmappedzero && a->offset-Array_cap < unmappedzero) if(a->offset >= unmappedzero && a->offset-Array_cap < unmappedzero)
checkoffset(a, canemitcode); checkoffset(a, canemitcode);
......
...@@ -1079,6 +1079,8 @@ naddr(Node *n, Addr *a, int canemitcode) ...@@ -1079,6 +1079,8 @@ naddr(Node *n, Addr *a, int canemitcode)
case OLEN: case OLEN:
// len of string or slice // len of string or slice
naddr(n->left, a, canemitcode); naddr(n->left, a, canemitcode);
if(a->type == D_CONST && a->offset == 0)
break; // len(nil)
a->etype = TUINT; a->etype = TUINT;
a->offset += Array_nel; a->offset += Array_nel;
if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero) if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero)
...@@ -1088,6 +1090,8 @@ naddr(Node *n, Addr *a, int canemitcode) ...@@ -1088,6 +1090,8 @@ naddr(Node *n, Addr *a, int canemitcode)
case OCAP: case OCAP:
// cap of string or slice // cap of string or slice
naddr(n->left, a, canemitcode); naddr(n->left, a, canemitcode);
if(a->type == D_CONST && a->offset == 0)
break; // cap(nil)
a->etype = TUINT; a->etype = TUINT;
a->offset += Array_cap; a->offset += Array_cap;
if(a->offset >= unmappedzero && a->offset-Array_cap < unmappedzero) if(a->offset >= unmappedzero && a->offset-Array_cap < unmappedzero)
......
...@@ -1789,6 +1789,8 @@ naddr(Node *n, Addr *a, int canemitcode) ...@@ -1789,6 +1789,8 @@ naddr(Node *n, Addr *a, int canemitcode)
case OLEN: case OLEN:
// len of string or slice // len of string or slice
naddr(n->left, a, canemitcode); naddr(n->left, a, canemitcode);
if(a->type == D_CONST && a->offset == 0)
break; // len(nil)
a->etype = TUINT; a->etype = TUINT;
a->offset += Array_nel; a->offset += Array_nel;
if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero) if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero)
...@@ -1798,6 +1800,8 @@ naddr(Node *n, Addr *a, int canemitcode) ...@@ -1798,6 +1800,8 @@ naddr(Node *n, Addr *a, int canemitcode)
case OCAP: case OCAP:
// cap of string or slice // cap of string or slice
naddr(n->left, a, canemitcode); naddr(n->left, a, canemitcode);
if(a->type == D_CONST && a->offset == 0)
break; // cap(nil)
a->etype = TUINT; a->etype = TUINT;
a->offset += Array_cap; a->offset += Array_cap;
if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero) if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero)
......
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