+ item->u.m1.m2 = (void *)item->u.declarator.child; \
+ (ptr) = &item->u.m1; \
+} while (0)
+
+/* Wrappers for ALLOC_ITEM to allocate various kinds of parser structures. */
+#define ALLOC_ITEM_DECLARATOR(ptr) ALLOC_ITEM(ptr, declarator, child)
+#define ALLOC_ITEM_DECLSPEC(ptr) ALLOC_ITEM(ptr, declspec, next)
+#define ALLOC_ITEM_DECL(ptr) ALLOC_ITEM(ptr, decl, next)
+
+#define ALLOC_FUNCTION(ptr, parameters_, variadic_) do { \
+ ALLOC_ITEM_DECLARATOR(ptr); \
+ (ptr)->type = CDECL_DECL_FUNCTION; \
+ (ptr)->u.function.parameters = parameters_; \
+ (ptr)->u.function.variadic = variadic_; \
+} while (0)
+
+#define ALLOC_ARRAY(ptr, length_) do { \
+ ALLOC_ITEM_DECLARATOR(ptr); \
+ (ptr)->type = CDECL_DECL_ARRAY; \
+ (ptr)->u.array.vla = NULL; \
+ (ptr)->u.array.length = length_; \