summaryrefslogtreecommitdiff
path: root/src/cmd/gc/align.c
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-05-01 13:15:42 -0700
committerRuss Cox <rsc@golang.org>2010-05-01 13:15:42 -0700
commit7f880650f76417b4010da786f4c82009a987d4ab (patch)
tree2ff37f89bce27884dc59c851f1d2e97977ef487d /src/cmd/gc/align.c
parent93076f9a25e6470ea07d6459abd122c60398a1ec (diff)
downloadgolang-7f880650f76417b4010da786f4c82009a987d4ab.tar.gz
gc: be pickier about slice, chan, array, and map sizes
Fixes issue 589. R=ken2 CC=golang-dev http://codereview.appspot.com/1032044
Diffstat (limited to 'src/cmd/gc/align.c')
-rw-r--r--src/cmd/gc/align.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/cmd/gc/align.c b/src/cmd/gc/align.c
index c4facf1be..460358df1 100644
--- a/src/cmd/gc/align.c
+++ b/src/cmd/gc/align.c
@@ -96,7 +96,7 @@ void
dowidth(Type *t)
{
int32 et;
- uint32 w;
+ int64 w;
int lno;
Type *t1;
@@ -222,7 +222,15 @@ dowidth(Type *t)
if(t->type == T)
break;
if(t->bound >= 0) {
+ uint64 cap;
+
dowidth(t->type);
+ if(tptr == TPTR32)
+ cap = ((uint32)-1) / t->type->width;
+ else
+ cap = ((uint64)-1) / t->type->width;
+ if(t->bound > cap)
+ yyerror("type %lT larger than address space", t);
w = t->bound * t->type->width;
if(w == 0)
w = maxround;