diff options
author | Russ Cox <rsc@golang.org> | 2010-05-01 13:15:42 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-05-01 13:15:42 -0700 |
commit | 7f880650f76417b4010da786f4c82009a987d4ab (patch) | |
tree | 2ff37f89bce27884dc59c851f1d2e97977ef487d /src/cmd/gc/align.c | |
parent | 93076f9a25e6470ea07d6459abd122c60398a1ec (diff) | |
download | golang-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.c | 10 |
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; |