summaryrefslogtreecommitdiff
path: root/builtin.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2021-11-21 20:13:48 +0200
committerArnold D. Robbins <arnold@skeeve.com>2021-11-21 20:13:48 +0200
commit4a7a1509991bfa9b79816a04fbee3398e3be6841 (patch)
tree6313ec27fa13555778c7c7f415028d435e6890ea /builtin.c
parent5403687cb350d91f81991ad82721648e70651eb9 (diff)
downloadgawk-4a7a1509991bfa9b79816a04fbee3398e3be6841.tar.gz
Fix subtle typeof case.
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 d7ba82c9..266bf74a 100644
--- a/builtin.c
+++ b/builtin.c
@@ -4186,10 +4186,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