-size_t align_decl_arg(decl_arg *darg, size_t *pos, size_t *len) {
- size_t align = alignof_decl_arg(darg);
+bool psi_decl_arg_validate_typedef(struct psi_data *data, struct psi_decl_arg *def)
+{
+ if (!psi_decl_type_validate(data, def->type, def)) {
+ const char *pre;
+
+ switch (def->type->type) {
+ case PSI_T_STRUCT:
+ pre = "struct ";
+ break;
+ case PSI_T_UNION:
+ pre = "union ";
+ break;
+ case PSI_T_ENUM:
+ pre = "enum ";
+ break;
+ default:
+ pre = "";
+ break;
+ }
+ data->error(data, def->token, PSI_WARNING,
+ "Type '%s' cannot be aliased to '%s%s': %s", def->var->name, pre,
+ def->type->name, data->last_error);
+ return false;
+ }
+ if (def->type->type == PSI_T_VOID) {
+ if (def->var->pointer_level) {
+ def->type->type = PSI_T_POINTER;
+ } else {
+ data->error(data, def->token, PSI_WARNING,
+ "Type '%s' cannot be aliased to 'void'", def->type->name);
+ return false;
+ }
+ }
+
+ return true;
+}
+
+size_t psi_decl_arg_align(struct psi_decl_arg *darg, size_t *pos, size_t *len)
+{
+ size_t align = psi_decl_arg_get_align(darg);