From b4f89ba90b6ca3233cc80aef9d42055266fac8df Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Thu, 1 Jul 2021 01:51:42 -0700 Subject: decl: Check that the flexible array member (if present) is last --- decl.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'decl.c') diff --git a/decl.c b/decl.c index 8912c6a..7460d04 100644 --- a/decl.c +++ b/decl.c @@ -685,11 +685,17 @@ addmember(struct structbuilder *b, struct qualtype mt, char *name, int align, ui struct member *m; size_t end; - /* XXX: flexible array member must be last */ - if (mt.type->incomplete && mt.type->kind != TYPEARRAY) - error(&tok.loc, "struct member '%s' has incomplete type", name); + if (t->flexible) + error(&tok.loc, "struct member '%s' is after flexible array member", name); + if (mt.type->incomplete) { + if (mt.type->kind != TYPEARRAY) + error(&tok.loc, "struct member '%s' has incomplete type", name); + t->flexible = true; + } if (mt.type->kind == TYPEFUNC) error(&tok.loc, "struct member '%s' has function type", name); + if (mt.type->flexible) + error(&tok.loc, "struct member '%s' contains flexible array member", name); assert(mt.type->align > 0); if (name || width == -1) { m = xmalloc(sizeof(*m)); -- cgit v1.2.3