aboutsummaryrefslogtreecommitdiffstats
path: root/builtin.c
diff options
context:
space:
mode:
Diffstat (limited to 'builtin.c')
-rw-r--r--builtin.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/builtin.c b/builtin.c
index c27b5081..386b6ed4 100644
--- a/builtin.c
+++ b/builtin.c
@@ -4189,10 +4189,31 @@ do_typeof(int nargs)
}
break;
case Node_var_new:
- case Node_array_ref:
res = "untyped";
deref = false;
break;
+ case Node_array_ref:
+ /*
+ * function f(x) {
+ * print typeof(x)
+ * y = x
+ * print typeof(x)
+ * }
+ *
+ * BEGIN {
+ * print typeof(x)
+ * f(x)
+ * }
+ */
+ if (arg->orig_array->type == Node_var
+ && (arg->orig_array->var_value == Nnull_string
+ || (arg->orig_array->var_value->flags & NULL_FIELD) != 0)) {
+ res = "unassigned";
+ } else {
+ res = "untyped";
+ }
+ deref = false;
+ break;
case Node_var:
/*
* Note: this doesn't happen because the function calling code