aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--builtin.c23
-rw-r--r--pc/ChangeLog4
-rw-r--r--pc/Makefile.tst7
-rw-r--r--test/ChangeLog6
-rw-r--r--test/Makefile.am4
-rw-r--r--test/Makefile.in9
-rw-r--r--test/Maketests5
-rw-r--r--test/stupid3.ok2
-rw-r--r--test/stupid4.ok2
-rw-r--r--test/stupid5.awk9
-rw-r--r--test/stupid5.ok2
12 files changed, 72 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 26eb7cd0..6dd52582 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2021-11-21 Arnold D. Robbins <arnold@skeeve.com>
+
+ * builtin.c (do_typeof): Make Node_array_ref handling smarter.
+ See test/stupid5.awk.
+
2021-11-18 Arnold D. Robbins <arnold@skeeve.com>
* gawkapi.c (awk_value_to_node): Fix handling of MPFR values
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
diff --git a/pc/ChangeLog b/pc/ChangeLog
index e3ffdeab..ba9334fd 100644
--- a/pc/ChangeLog
+++ b/pc/ChangeLog
@@ -1,3 +1,7 @@
+2021-11-21 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.tst: Regenerated.
+
2021-11-08 Arnold D. Robbins <arnold@skeeve.com>
* Makefile.tst: Regenerated.
diff --git a/pc/Makefile.tst b/pc/Makefile.tst
index bb707042..97be2756 100644
--- a/pc/Makefile.tst
+++ b/pc/Makefile.tst
@@ -210,7 +210,7 @@ GAWK_EXT_TESTS = \
regx8bit reginttrad reint reint2 rsgetline rsglstdin rsstart1 \
rsstart2 rsstart3 rstest6 sandbox1 shadow shadowbuiltin sortfor \
sortfor2 sortu sourcesplit split_after_fpat splitarg4 strftfld \
- strftime strtonum strtonum1 stupid1 stupid2 stupid3 stupid4 \
+ strftime strtonum strtonum1 stupid1 stupid2 stupid3 stupid4 stupid5 \
switch2 symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 \
symtab8 symtab9 symtab10 symtab11 timeout typedregex1 typedregex2 \
typedregex3 typedregex4 typedregex5 typedregex6 typeof1 typeof2 \
@@ -3284,6 +3284,11 @@ stupid4:
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+stupid5:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
switch2:
@echo $@
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/ChangeLog b/test/ChangeLog
index 275f487b..3f368170 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,9 @@
+2021-11-21 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.am (EXTRA_DIST): stupid5, new test.
+ * stupid5.awk, stupid5.ok: New files.
+ * stupid3.ok, stupid4.ok: Updated after code changes.
+
2021-11-18 Arnold D. Robbins <arnold@skeeve.com>
* rwarray.awk: Improve test, add string and numbers.
diff --git a/test/Makefile.am b/test/Makefile.am
index a82c2791..b74056ec 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1241,6 +1241,8 @@ EXTRA_DIST = \
stupid3.ok \
stupid4.awk \
stupid4.ok \
+ stupid5.awk \
+ stupid5.ok \
subamp.awk \
subamp.in \
subamp.ok \
@@ -1459,7 +1461,7 @@ GAWK_EXT_TESTS = \
regx8bit reginttrad reint reint2 rsgetline rsglstdin rsstart1 \
rsstart2 rsstart3 rstest6 sandbox1 shadow shadowbuiltin sortfor \
sortfor2 sortu sourcesplit split_after_fpat splitarg4 strftfld \
- strftime strtonum strtonum1 stupid1 stupid2 stupid3 stupid4 \
+ strftime strtonum strtonum1 stupid1 stupid2 stupid3 stupid4 stupid5 \
switch2 symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 \
symtab8 symtab9 symtab10 symtab11 timeout typedregex1 typedregex2 \
typedregex3 typedregex4 typedregex5 typedregex6 typeof1 typeof2 \
diff --git a/test/Makefile.in b/test/Makefile.in
index 1f4e0edd..d56e90d1 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -1507,6 +1507,8 @@ EXTRA_DIST = \
stupid3.ok \
stupid4.awk \
stupid4.ok \
+ stupid5.awk \
+ stupid5.ok \
subamp.awk \
subamp.in \
subamp.ok \
@@ -1725,7 +1727,7 @@ GAWK_EXT_TESTS = \
regx8bit reginttrad reint reint2 rsgetline rsglstdin rsstart1 \
rsstart2 rsstart3 rstest6 sandbox1 shadow shadowbuiltin sortfor \
sortfor2 sortu sourcesplit split_after_fpat splitarg4 strftfld \
- strftime strtonum strtonum1 stupid1 stupid2 stupid3 stupid4 \
+ strftime strtonum strtonum1 stupid1 stupid2 stupid3 stupid4 stupid5 \
switch2 symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 \
symtab8 symtab9 symtab10 symtab11 timeout typedregex1 typedregex2 \
typedregex3 typedregex4 typedregex5 typedregex6 typeof1 typeof2 \
@@ -4957,6 +4959,11 @@ stupid4:
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+stupid5:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
switch2:
@echo $@
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/Maketests b/test/Maketests
index 5133c676..9e00cd57 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -2022,6 +2022,11 @@ stupid4:
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+stupid5:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
switch2:
@echo $@
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/stupid3.ok b/test/stupid3.ok
index 11beb6c9..b647c089 100644
--- a/test/stupid3.ok
+++ b/test/stupid3.ok
@@ -1,2 +1,2 @@
TYPEOF: untyped
-TYPEOF: untyped
+TYPEOF: unassigned
diff --git a/test/stupid4.ok b/test/stupid4.ok
index 1271dad1..42380a42 100644
--- a/test/stupid4.ok
+++ b/test/stupid4.ok
@@ -1,2 +1,2 @@
untyped
-untyped
+unassigned
diff --git a/test/stupid5.awk b/test/stupid5.awk
new file mode 100644
index 00000000..e4c0187a
--- /dev/null
+++ b/test/stupid5.awk
@@ -0,0 +1,9 @@
+BEGIN {
+ print typeof(x)
+ f(x)
+}
+
+function f(x) {
+ y = x
+ print typeof(x)
+}
diff --git a/test/stupid5.ok b/test/stupid5.ok
new file mode 100644
index 00000000..42380a42
--- /dev/null
+++ b/test/stupid5.ok
@@ -0,0 +1,2 @@
+untyped
+unassigned