decl_var: fix fqn
[m6w6/ext-psi] / src / types / decl_var.c
index 763ea1824bc29683efa346d2a9ac32cf6e03d5ab..680d7a172b8963b7ce89049f86acbca835e8741c 100644 (file)
@@ -32,8 +32,10 @@ struct psi_decl_var *psi_decl_var_init(const char *name, unsigned pl,
                unsigned as)
 {
        struct psi_decl_var *v = calloc(1, sizeof(*v));
-       v->name = strdup(name);
-       v->fqn = strdup(name);
+       if (name) {
+               v->name = strdup(name);
+               v->fqn = strdup(name);
+       }
        v->pointer_level = pl;
        v->array_size = as;
        return v;
@@ -44,8 +46,11 @@ struct psi_decl_var *psi_decl_var_copy(struct psi_decl_var *src)
        struct psi_decl_var *dest = calloc(1, sizeof(*dest));
 
        *dest = *src;
-       dest->name = strdup(dest->name);
-       dest->fqn = strdup(dest->fqn);
+
+       if (dest->name) {
+               dest->name = strdup(dest->name);
+               dest->fqn = strdup(dest->fqn);
+       }
 
        if (dest->token) {
                dest->token = psi_token_copy(dest->token);
@@ -62,8 +67,10 @@ void psi_decl_var_free(struct psi_decl_var **var_ptr)
                if (var->token) {
                        free(var->token);
                }
-               free(var->name);
-               free(var->fqn);
+               if (var->name) {
+                       free(var->name);
+                       free(var->fqn);
+               }
                free(var);
        }
 }
@@ -72,15 +79,15 @@ void psi_decl_var_dump(int fd, struct psi_decl_var *var)
 {
        dprintf(fd, "%s%s",
                        psi_t_indirection(var->pointer_level - !!var->array_size),
-                       var->name);
+                       var->name ? var->name : "/**/");
        if (var->array_size) {
                dprintf(fd, "[%u]", var->array_size);
        }
 }
 
 bool psi_decl_var_validate(struct psi_data *data, struct psi_decl_var *dvar,
-               struct psi_decl *decl, struct psi_let_exp *let_exp,
-               struct psi_set_exp *set_exp)
+               struct psi_impl *impl, struct psi_decl *decl,
+               struct psi_let_exp *let_exp, struct psi_set_exp *set_exp)
 {
        bool okay = false;
        struct psi_let_exp *current_let_exp = let_exp;
@@ -130,7 +137,10 @@ bool psi_decl_var_validate(struct psi_data *data, struct psi_decl_var *dvar,
                }
        }
 
-       if (decl && !okay && psi_decl_get_arg(decl, dvar)) {
+       if (!okay && impl && psi_impl_get_decl_arg(impl, dvar)) {
+               okay = true;
+       }
+       if (!okay && decl && psi_decl_get_arg(decl, dvar)) {
                okay = true;
        }