constexpr auto ptr() const { return ptr_of(this->derived()); }
auto ptr() { return ptr_of(this->derived()); }
/* struct|union ... */ static bool tok_take_conglom(struct parse_state *ps, enum cdump_type_kind conglom_kind) { struct cdump_type *e; const char *name; size_t n; assert(conglom_kind == CDUMP_STRUCT || conglom_kind == CDUMP_UNION); name = tok_take_ident(ps->defs, &ps->toks); if (!name) { complain(ps, "Invalid struct/union name"); return false; } e = get_type(ps->defs, conglom_kind, name); if (type_defined(e)) { complain(ps, "Type already defined"); return false; } if (!tok_take_if(&ps->toks, "{")) { complain(ps, "Expected { for struct/union"); return false; } e->u.members = tal_arr(e, struct cdump_member, n = 0); while (!tok_is(&ps->toks, "}")) { struct cdump_type *basetype; const struct token *quals; unsigned int num_quals = 0; /* Anything can have these prepended. */ quals = ps->toks; while (tok_take_if(&ps->toks, "const") || tok_take_if(&ps->toks, "volatile")) num_quals++; /* eg. "struct foo" or "varint_t" */ if (!tok_take_type(ps, &basetype)) { complain(ps, "Expected typename inside struct/union"); return false; } do { struct cdump_member *m; tal_resize(&e->u.members, n+1); m = &e->u.members[n++]; m->type = basetype; if (num_quals) { m->qualifiers = string_of_toks(e, quals, quals + num_quals); } else m->qualifiers = NULL; /* May have multiple asterisks. */ while (tok_take_if(&ps->toks, "*")) m->type = ptr_of(ps, m->type); m->name = tok_take_ident(e, &ps->toks); if (!m->name) { complain(ps, "Expected name for member"); return false; } /* May be an array. */ while (tok_take_if(&ps->toks, "[")) { if (!tok_take_array(ps, &m->type)) return false; } } while (tok_take_if(&ps->toks, ",")); if (!tok_take_if(&ps->toks, ";")) { complain(ps, "Expected ; at end of member"); return false; } } if (tok_take_if(&ps->toks, "}") && tok_take_if(&ps->toks, ";")) return true; complain(ps, "Expected }; at end of struct/union"); return false; }