aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--decl.c6
-rw-r--r--qbe.c10
2 files changed, 5 insertions, 11 deletions
diff --git a/decl.c b/decl.c
index 4a0d319..324e5aa 100644
--- a/decl.c
+++ b/decl.c
@@ -69,6 +69,8 @@ mkdecl(enum declkind k, struct type *t, enum typequal tq, enum linkage linkage)
d->linkage = linkage;
d->type = t;
d->qual = tq;
+ if (k == DECLOBJECT)
+ d->u.obj.align = t->align;
return d;
}
@@ -944,9 +946,9 @@ decl(struct scope *s, struct func *f)
error(&tok.loc, "typedef '%s' redefined with different type", name);
break;
case DECLOBJECT:
- d = declcommon(s, kind, name, asmname, t, tq, sc, prior);
if (align && align < t->align)
- error(&tok.loc, "specified alignment of object '%s' is less strict than is required by type", name);
+ error(&tok.loc, "object '%s' requires alignment %d, which is stricter than specified alignment %d", name, t->align, align);
+ d = declcommon(s, kind, name, asmname, t, tq, sc, prior);
if (d->u.obj.align < align)
d->u.obj.align = align;
init = NULL;
diff --git a/qbe.c b/qbe.c
index 04cce00..cce245e 100644
--- a/qbe.c
+++ b/qbe.c
@@ -260,12 +260,8 @@ funcalloc(struct func *f, struct decl *d)
assert(!d->type->incomplete);
assert(d->type->size > 0);
- align = d->u.obj.align;
- if (!align)
- align = d->type->align;
- else if (align < d->type->align)
- error(&tok.loc, "object requires alignment %d, which is stricter than %d", d->type->align, align);
size = d->type->size;
+ align = d->u.obj.align;
switch (align) {
case 1:
case 2:
@@ -1326,10 +1322,6 @@ emitdata(struct decl *d, struct init *init)
int align;
align = d->u.obj.align;
- if (!align)
- align = d->type->align;
- else if (align < d->type->align)
- error(&tok.loc, "object requires alignment %d, which is stricter than %d", d->type->align, align);
for (cur = init; cur; cur = cur->next)
cur->expr = eval(cur->expr, EVALINIT);
if (d->linkage == LINKEXTERN)