summaryrefslogtreecommitdiff
path: root/src/cmd/gc/align.c
diff options
context:
space:
mode:
authorMichael Stapelberg <stapelberg@debian.org>2013-03-04 21:27:36 +0100
committerMichael Stapelberg <michael@stapelberg.de>2013-03-04 21:27:36 +0100
commit04b08da9af0c450d645ab7389d1467308cfc2db8 (patch)
treedb247935fa4f2f94408edc3acd5d0d4f997aa0d8 /src/cmd/gc/align.c
parent917c5fb8ec48e22459d77e3849e6d388f93d3260 (diff)
downloadgolang-upstream/1.1_hg20130304.tar.gz
Imported Upstream version 1.1~hg20130304upstream/1.1_hg20130304
Diffstat (limited to 'src/cmd/gc/align.c')
-rw-r--r--src/cmd/gc/align.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/cmd/gc/align.c b/src/cmd/gc/align.c
index 6982bbe56..be9f552f6 100644
--- a/src/cmd/gc/align.c
+++ b/src/cmd/gc/align.c
@@ -15,8 +15,8 @@
static int defercalc;
-uint32
-rnd(uint32 o, uint32 r)
+vlong
+rnd(vlong o, vlong r)
{
if(r < 1 || r > 8 || (r&(r-1)) != 0)
fatal("rnd");
@@ -54,6 +54,11 @@ widstruct(Type *errtype, Type *t, vlong o, int flag)
for(f=t->type; f!=T; f=f->down) {
if(f->etype != TFIELD)
fatal("widstruct: not TFIELD: %lT", f);
+ if(f->type == T) {
+ // broken field, just skip it so that other valid fields
+ // get a width.
+ continue;
+ }
dowidth(f->type);
if(f->type->align > maxalign)
maxalign = f->type->align;
@@ -248,8 +253,12 @@ dowidth(Type *t)
checkwidth(t->type);
t->align = widthptr;
}
- else if(t->bound == -100)
- yyerror("use of [...] array outside of array literal");
+ else if(t->bound == -100) {
+ if(!t->broke) {
+ yyerror("use of [...] array outside of array literal");
+ t->broke = 1;
+ }
+ }
else
fatal("dowidth %T", t); // probably [...]T
break;
@@ -607,7 +616,7 @@ typeinit(void)
fatal("typeinit: %s already defined", s->name);
t = typ(etype);
- t->sym = s;
+ t->sym = s1;
dowidth(t);
types[etype] = t;
@@ -615,12 +624,12 @@ typeinit(void)
}
Array_array = rnd(0, widthptr);
- Array_nel = rnd(Array_array+widthptr, types[TUINT32]->width);
- Array_cap = rnd(Array_nel+types[TUINT32]->width, types[TUINT32]->width);
- sizeof_Array = rnd(Array_cap+types[TUINT32]->width, widthptr);
+ Array_nel = rnd(Array_array+widthptr, widthint);
+ Array_cap = rnd(Array_nel+widthint, widthint);
+ sizeof_Array = rnd(Array_cap+widthint, widthptr);
// string is same as slice wo the cap
- sizeof_String = rnd(Array_nel+types[TUINT32]->width, widthptr);
+ sizeof_String = rnd(Array_nel+widthint, widthptr);
dowidth(types[TSTRING]);
dowidth(idealstring);