bool psi_decl_arg_validate(struct psi_data *data, struct psi_decl_arg *arg,
struct psi_validate_stack *type_stack)
{
- if (!psi_decl_type_validate(data, arg->type, type_stack)) {
- data->error(data, arg->type->token, PSI_WARNING,
- "Cannot use '%s' as type for '%s': %s", arg->type->name,
- arg->var->name, data->last_error);
- return false;
+ if (!psi_decl_type_validate(data, arg->type, arg->var->pointer_level, type_stack)) {
+ if (!arg->var->pointer_level) {
+ data->error(data, arg->type->token, PSI_WARNING,
+ "Cannot use '%s' as type for '%s'%s%s", arg->type->name,
+ arg->var->name, *data->last_error ? ": " : "", data->last_error);
+ return false;
+ }
}
return true;
}
"Type '%s' cannot be aliased to 'void'", def->type->name);
return false;
}
- } else if (!def->var->pointer_level) {
- if (!psi_decl_type_validate(data, def->type, type_stack)) {
- 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;
+ } else if (!psi_decl_type_validate(data, def->type, def->var->pointer_level, type_stack)) {
+ 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%s", def->var->name, pre,
+ def->type->name, *data->last_error ? ": " : "", data->last_error);
+ return false;
}
return true;
size_t align;
if (darg->var->pointer_level
- && (!darg->var->array_size || darg->var->pointer_level > 2)) {
+ && (!darg->var->array_size || darg->var->pointer_level > 1)) {
align = psi_t_alignment(PSI_T_POINTER);
} else {
align = psi_decl_type_get_align(darg->type);
size_t size;
struct psi_decl_type *real = psi_decl_type_get_real(darg->type);
- if (darg->var->array_size) {
- if (darg->var->pointer_level > 2) {
- size = psi_t_size(PSI_T_POINTER) * darg->var->array_size;
- } else {
- size = psi_t_size(real->type) * darg->var->array_size;
- }
+ if (darg->var->array_size && darg->var->pointer_level > 1) {
+ size = psi_t_size(PSI_T_POINTER) * darg->var->array_size;
} else if (darg->var->pointer_level) {
size = psi_t_size(PSI_T_POINTER);
} else {
size = psi_t_size(real->type);
break;
}
+
+ if (darg->var->array_size) {
+ size *= darg->var->array_size;
+ }
}
return size;