]> git.draconx.ca Git - cdecl99.git/blobdiff - src/parse-decl.c
libcdecl: Fix output regression with multiple declarators.
[cdecl99.git] / src / parse-decl.c
index 8516a3acab732e26388cb6e40c1ff8fadab4dc69..1268fc387810cbd2c7a1ef380b01bc09097e3342 100644 (file)
@@ -220,7 +220,6 @@ static struct cdecl_declarator *reduce_function(struct cdecl *param)
        spec->u.declarator.type = CDECL_DECL_IDENT;
        *p = &spec->u.declarator;
 
-       free(d);
        d = param->declarators;
        free(param);
        return d;
@@ -262,7 +261,6 @@ simplify_functions(struct cdecl_declarator **p, struct cdecl_declarator *d)
        if (!new)
                return 0; /* e.g. int (foo bar) */
        *p = new;
-       free(d->child);
        free(d);
 
        return 1;
@@ -502,9 +500,9 @@ static int forall_declarators(struct cdecl *decl,
 
 static struct cdecl *do_parse(const char *str, int english_mode)
 {
+       struct cdecl *decl = NULL;
        YY_BUFFER_STATE state;
        yyscan_t scanner;
-       struct cdecl *decl;
 
 #if YYDEBUG
        extern int cdecl__yydebug;
@@ -516,8 +514,15 @@ static struct cdecl *do_parse(const char *str, int english_mode)
                return NULL;
 
        state = cdecl__yy_scan_string(str, scanner);
-       if (cdecl__yyparse(scanner, &decl) != 0)
+       if (cdecl__yyparse(scanner, &decl) != 0) {
+               /*
+                * If the input consists of a complete, valid declaration
+                * followed by some garbage, that parsed declaration will
+                * be output by the parser and we need to free it here.
+                */
+               cdecl__free(decl);
                decl = NULL;
+       }
        cdecl__yy_delete_buffer(state, scanner);
        cdecl__yylex_destroy(scanner);