fix size of array elements
[m6w6/ext-psi] / src / types / decl_arg.c
index bec8ddc77f1132c87a140c4232aa326aac62e0d0..0423c9728fb4ab6355bb821a2a23f4e55b5323b3 100644 (file)
@@ -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;