diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-08-18 06:08:37 +0200 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-12-29 14:39:38 +0100 |
commit | 0c07b5979739336e07c60bf272b80cfe6b0b23fd (patch) | |
tree | 77006dc6f023f9ddb0a883e41d563b39a63eaf90 | |
parent | d9087a616640c02d39a8f5307ead92cf035f9d1a (diff) | |
download | sparse-0c07b5979739336e07c60bf272b80cfe6b0b23fd.tar.gz |
struct-attr: prepare to handle attributes at the end of struct definitions (3)
Type attributes for struct can be placed either just after the
keyword 'struct' or after the '}' ending its definition but this
later case is currently ignored.
Prepare the handling of this by having the 3 following cases in sequence:
1) a tag is present
2) no tag present but is followed by an opening brace
3) neither of these, so it's an error.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r-- | parse.c | 15 |
1 files changed, 6 insertions, 9 deletions
@@ -750,20 +750,17 @@ static struct token *struct_union_enum_specifier(enum type type, // Mark the structure as needing re-examination sym->examined = 0; - goto end; - } - - // private struct/union/enum type - if (!match_op(token, '{')) { + } else if (match_op(token, '{')) { + // private struct/union/enum type + sym = alloc_symbol(token->pos, type); + set_current_scope(sym); // used by dissect + ctx->ctype.base_type = sym; + } else { sparse_error(token->pos, "expected declaration"); ctx->ctype.base_type = &bad_ctype; return token; } - sym = alloc_symbol(token->pos, type); - set_current_scope(sym); // used by dissect - ctx->ctype.base_type = sym; -end: token = parse(token->next, sym); token = expect(token, '}', "at end of specifier"); |