switch (x->type) {
case CDECL_DECL_NULL:
+ x = NULL;
case CDECL_DECL_IDENT:
case CDECL_DECL_ARRAY:
break;
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($$); } <item>
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 {
}
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,
}
null_decl: {
- ALLOC_STRUCT($$, struct cdecl_declarator,
- .type = CDECL_DECL_NULL);
+ $$ = NULLDECL;
}
/*