X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/1ef30936f5fdb253b397347b91521455d0c39172..96b00735351dd8e39fc5d71ff31afbdddd83ecba:/src/parse.y diff --git a/src/parse.y b/src/parse.y index 8631f3b..ba9bf22 100644 --- a/src/parse.y +++ b/src/parse.y @@ -105,6 +105,7 @@ static void free_declarator(struct cdecl_declarator *x) switch (x->type) { case CDECL_DECL_NULL: + x = NULL; case CDECL_DECL_IDENT: case CDECL_DECL_ARRAY: break; @@ -168,11 +169,18 @@ static struct cdecl *insert_identifier(struct cdecl *decl, struct parse_item *id while ((d = *p)->child) p = &d->child; - free(d); - *p = d = &ident->u.declarator; + *p = &ident->u.declarator; return decl; } + +static struct cdecl_declarator *nulldecl(void) +{ + static const struct cdecl_declarator nulldecl = {0}; + return (void *)&nulldecl; +} +#define NULLDECL (nulldecl()) + %} %destructor { free($$); } @@ -431,16 +439,14 @@ declarator_ish: direct_declarator_ish | pointer postfix: array | parens direct_declarator_ish: { - ALLOC_STRUCT($$, struct cdecl_declarator, - .type = CDECL_DECL_NULL); + $$ = NULLDECL; } | direct_declarator_ish postfix { $$ = $2; $$->child = $1; } direct_declarator: { - ALLOC_STRUCT($$, struct cdecl_declarator, - .type = CDECL_DECL_NULL); + $$ = NULLDECL; } | T_IDENT { $$ = &$1->u.declarator; } | direct_declarator postfix { @@ -491,8 +497,7 @@ english_declaration: storage_func_specs english_declarator post_specs { } english_declarator: { - ALLOC_STRUCT($$, struct cdecl_declarator, - .type = CDECL_DECL_NULL); + $$ = NULLDECL; } | english_declarator qualifiers T_POINTER T_TO { ALLOC_STRUCT($$, struct cdecl_declarator, .type = CDECL_DECL_POINTER, @@ -535,8 +540,7 @@ typedef_name_qual: T_IDENT qualifiers { } null_decl: { - ALLOC_STRUCT($$, struct cdecl_declarator, - .type = CDECL_DECL_NULL); + $$ = NULLDECL; } /*