summaryrefslogtreecommitdiff
path: root/src/cmd/gc/align.c
diff options
context:
space:
mode:
authorRobert Hencke <robert.hencke@gmail.com>2011-07-12 11:12:06 -0700
committerRobert Hencke <robert.hencke@gmail.com>2011-07-12 11:12:06 -0700
commit0f190c9038c80e1dcbc4ba9cafaa30a9c06c481f (patch)
tree960b7f3843112f8302771e18db790fe64e60ad74 /src/cmd/gc/align.c
parent5bb6dd604b29bc9d7e37cdad9a2d1e5d35977a07 (diff)
downloadgo-0f190c9038c80e1dcbc4ba9cafaa30a9c06c481f.tar.gz
gc: make size of struct{} and [0]byte 0 bytes
Fixes issue 1949. R=iant, rsc CC=golang-dev http://codereview.appspot.com/4634124 Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/cmd/gc/align.c')
-rw-r--r--src/cmd/gc/align.c27
1 files changed, 8 insertions, 19 deletions
diff --git a/src/cmd/gc/align.c b/src/cmd/gc/align.c
index 7fcac4833..6bb93ef17 100644
--- a/src/cmd/gc/align.c
+++ b/src/cmd/gc/align.c
@@ -225,20 +225,16 @@ dowidth(Type *t)
uint64 cap;
dowidth(t->type);
- if(t->type->width == 0)
- fatal("no width for type %T", 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);
+ if(t->type->width != 0) {
+ 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;
t->align = t->type->align;
- if(w == 0) {
- w = 1;
- t->align = 1;
- }
}
else if(t->bound == -1) {
w = sizeof_Array;
@@ -255,10 +251,6 @@ dowidth(Type *t)
if(t->funarg)
fatal("dowidth fn struct %T", t);
w = widstruct(t, 0, 1);
- if(w == 0) {
- w = 1;
- t->align = 1;
- }
break;
case TFUNC:
@@ -286,9 +278,6 @@ dowidth(Type *t)
break;
}
- // catch all for error cases; avoid divide by zero later
- if(w == 0)
- w = 1;
t->width = w;
if(t->align == 0) {
if(w > 8 || (w&(w-1)) != 0)