- if (!sub_args) {
- data->error(data, let_var->token, PSI_WARNING,
- "Inner let statement's values must refer to a structure type,"
- " got '%s' for '%s'",
- var_typ->name, let_var->name);
- return 0;
- }
-
- for (i = 0; i < func->inner->count; ++i) {
- let_val *inner = func->inner->vals[i];
- let_val *outer = func->outer;
- const char *name = locate_let_val_varname(inner);
- decl_arg *sub_arg;
-
- if (name) {
- sub_arg = locate_decl_arg(sub_args, name);
+ if (func->type == PSI_T_ARRVAL && sub_args) {
+ /* struct = arrval($array,
+ * member = strval($member) ...)
+ */
+ size_t i;
+
+ for (i = 0; i < func->inner->count; ++i) {
+ let_val *inner = func->inner->vals[i];
+ const char *name = locate_let_val_varname(inner);
+ let_func *fn = locate_let_val_func(inner);
+ decl_arg *sub_arg;
+
+ if (name) {
+ sub_arg = locate_decl_arg(sub_args, name);
+ }
+ if (!name || !sub_arg) {
+ data->error(data, let_var->token, PSI_WARNING,
+ "Unknown variable '%s'", name);
+ return 0;
+ }
+
+ fn->outer = val;
+ fn->ref = sub_arg;
+
+ if (!validate_let_val(data, inner, sub_arg->var, impl)) {
+ return 0;
+ }