- return NULL;
-}
-static inline int validate_num_exp(PSI_Data *data, impl *impl, num_exp *exp) {
- switch (exp->t) {
- case PSI_T_NAME:
- if (!locate_decl_var_arg(exp->u.dvar, impl->decl->args)) {
- data->error(PSI_WARNING, "Unknown variable '%s' in numeric expression"
- " of implementation '%s'", exp->u.dvar->name, impl->func->name);
- return 0;
- }
- return 1;
- case PSI_T_NSNAME:
- if (!locate_num_exp_constant(exp, data->consts)) {
- data->error(PSI_WARNING, "Unknown constant '%s' in numeric expression"
- " of implementation '%s'", exp->u.numb, impl->func->name);
- return 0;
- }
- return 1;
- case PSI_T_NUMBER:
- return 1;
- default:
- return 0;
- }
-}
-static inline int validate_impl_let_stmts(PSI_Data *data, impl *impl) {
- size_t i, j;
- /* we can have multiple let stmts */
- /* check that we have a let stmt for every decl arg */
- if (impl->decl->args) for (i = 0; i < impl->decl->args->count; ++i) {
- decl_arg *darg = impl->decl->args->args[i];
- int check = 0;
-
- for (j = 0; j < impl->stmts->let.count; ++j) {
- let_stmt *let = impl->stmts->let.list[j];
-
- if (!strcmp(let->var->name, darg->var->name)) {
- darg->let = let;
- check = 1;
- break;
- }
- }
- if (!check) {
- data->error(PSI_WARNING, "Missing `let` statement for arg '%s %.*s%s'"
- " of declaration '%s' for implementation '%s'",
- darg->type->name, (int) darg->var->pointer_level, "*****",
- darg->var->name, impl->decl->func->var->name, impl->func->name);
- return 0;
- }
- }
- /* check that the let_value references a known variable or NULL */
- for (i = 0; i < impl->stmts->let.count; ++i) {
- let_stmt *let = impl->stmts->let.list[i];
- int check = 0;
-
- if (let->val && let->val->func && let->val->func->alloc) {
- if (!validate_num_exp(data, impl, let->val->func->alloc->nmemb)) {
- return 0;
- }
- if (!validate_num_exp(data, impl, let->val->func->alloc->size)) {
- return 0;
- }