- *len = sizeof_decl_arg(darg);
- *pos = psi_align(align, *pos);
+ 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%s",
+ def->var->name->val, pre,
+ def->type->name->val,
+ *data->last_error ? ": " : "", data->last_error);
+ return false;
+ }
+
+ return true;
+}
+
+bool psi_decl_arg_is_pointer(struct psi_decl_arg *darg)
+{
+ if (darg->var->pointer_level) {
+ if (darg->var->array_size) {
+ return darg->var->pointer_level > 1;
+ }
+ return true;
+ } else if (psi_decl_type_is_weak(darg->type) && darg->type->real.def) {
+ return psi_decl_arg_is_pointer(darg->type->real.def);
+ }
+ return false;
+}
+
+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);
+
+ if (align) {
+ *len = psi_decl_arg_get_size(darg);
+ *pos = psi_align(align, *pos);
+ }