aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-08-18 06:08:37 +0200
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-12-29 14:39:38 +0100
commit0c07b5979739336e07c60bf272b80cfe6b0b23fd (patch)
tree77006dc6f023f9ddb0a883e41d563b39a63eaf90
parentd9087a616640c02d39a8f5307ead92cf035f9d1a (diff)
downloadsparse-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.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/parse.c b/parse.c
index 663f2141..69bfc2e0 100644
--- a/parse.c
+++ b/parse.c
@@ -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");