X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Fdecl_arg.c;h=0423c9728fb4ab6355bb821a2a23f4e55b5323b3;hp=bec8ddc77f1132c87a140c4232aa326aac62e0d0;hb=9cb932e13dc98db9d72ac37f6ed11cd76634d37b;hpb=18ca609e4fa08a1c8fcdbb58e9aeb5fe55538b3c diff --git a/src/types/decl_arg.c b/src/types/decl_arg.c index bec8ddc..0423c97 100644 --- a/src/types/decl_arg.c +++ b/src/types/decl_arg.c @@ -95,11 +95,13 @@ void psi_decl_arg_dump(int fd, struct psi_decl_arg *arg, unsigned level) 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; } @@ -120,29 +122,27 @@ bool psi_decl_arg_validate_typedef(struct psi_data *data, "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; @@ -165,7 +165,7 @@ size_t psi_decl_arg_get_align(struct psi_decl_arg *darg) 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); @@ -180,7 +180,7 @@ size_t psi_decl_arg_get_size(struct psi_decl_arg *darg) struct psi_decl_type *real = psi_decl_type_get_real(darg->type); if (darg->var->array_size) { - if (darg->var->pointer_level > 2) { + if (darg->var->pointer_level > 1) { size = psi_t_size(PSI_T_POINTER) * darg->var->array_size; } else { size = psi_t_size(real->type) * darg->var->array_size;