summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2010-06-29 12:48:24 -0700
committerKen Thompson <ken@golang.org>2010-06-29 12:48:24 -0700
commit5da72f11d564f6d03a558983000a9559c4334e51 (patch)
tree9e8bdf7944bb23a2dd2cfdeb53c933a97a772181
parentf5306cf39226b81350c3588a23c037140e2d3a9c (diff)
downloadgo-5da72f11d564f6d03a558983000a9559c4334e51.tar.gz
code gen bug in len(nil) and cap(nil)
fixes issue 892 R=rsc CC=golang-dev http://codereview.appspot.com/1745042
-rw-r--r--src/cmd/5g/gsubr.c4
-rw-r--r--src/cmd/6g/gsubr.c4
-rw-r--r--src/cmd/8g/gsubr.c4
3 files changed, 12 insertions, 0 deletions
diff --git a/src/cmd/5g/gsubr.c b/src/cmd/5g/gsubr.c
index ea6ab1d70..700602c35 100644
--- a/src/cmd/5g/gsubr.c
+++ b/src/cmd/5g/gsubr.c
@@ -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);
diff --git a/src/cmd/6g/gsubr.c b/src/cmd/6g/gsubr.c
index 1c11b14ae..52ff6fdea 100644
--- a/src/cmd/6g/gsubr.c
+++ b/src/cmd/6g/gsubr.c
@@ -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)
diff --git a/src/cmd/8g/gsubr.c b/src/cmd/8g/gsubr.c
index 3e85b7e30..6890c683e 100644
--- a/src/cmd/8g/gsubr.c
+++ b/src/cmd/8g/gsubr.c
@@ -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)