summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2023-02-24 10:29:33 +0200
committerArnold D. Robbins <arnold@skeeve.com>2023-02-24 10:29:33 +0200
commitda883f8177a12293a395d77c31d7aeaa95c254aa (patch)
tree5a8d775e66f92781494c60438de4d1e19792e768
parent90da4e0a6fea0499b891bb3801fde88b99346367 (diff)
downloadgawk-da883f8177a12293a395d77c31d7aeaa95c254aa.tar.gz
Bug fix in typeof, add new test files.
-rw-r--r--ChangeLog3
-rw-r--r--builtin.c23
-rw-r--r--pc/ChangeLog4
-rw-r--r--pc/Makefile.tst12
-rw-r--r--test/ChangeLog2
-rw-r--r--test/Makefile.am4
-rw-r--r--test/Makefile.in9
-rw-r--r--test/Maketests5
-rw-r--r--test/elemnew2.awk15
-rw-r--r--test/elemnew2.ok3
-rw-r--r--test/elemnew3.awk9
-rw-r--r--test/elemnew3.ok1
12 files changed, 79 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index d9281cb3..488e7a49 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,9 @@
* awk.h (boolval): Handle Node_var. Thanks to
Daniel Pouzzner <douzzer@mega.nu> for the report, relayed
by Andrew Schorr.
+ * builtin.c (do_typeof): Handle Node_var, could come from a
+ converted Node_elem_new. Thanks to Andrew Schorr for the
+ report.
2023-02-23 Arnold D. Robbins <arnold@skeeve.com>
diff --git a/builtin.c b/builtin.c
index 43ae6afc..4dd22e27 100644
--- a/builtin.c
+++ b/builtin.c
@@ -4324,6 +4324,21 @@ do_typeof(int nargs)
}
}
break;
+ case Node_var:
+ /*
+ * This can happen when a Node_elem_new gets turned into a Node_var.
+ * BEGIN {
+ * f(a["b"])
+ * print typeof(a["b"])
+ * }
+ *
+ * function f(x)
+ * {
+ * return x
+ * }
+ */
+ arg = arg->var_value;
+ // fall through
case Node_val:
switch (fixtype(arg)->flags & (STRING|NUMBER|USER_INPUT|REGEX|BOOLVAL)) {
case NUMBER|BOOLVAL:
@@ -4386,14 +4401,6 @@ do_typeof(int nargs)
}
deref = false;
break;
- case Node_var:
- /*
- * Note: this doesn't happen because the function calling code
- * in interpret.h pushes Node_var->var_value.
- */
- fatal(_("typeof: invalid argument type `%s'"),
- nodetype2str(arg->type));
- break;
default:
fatal(_("typeof: unknown argument type `%s'"),
nodetype2str(arg->type));
diff --git a/pc/ChangeLog b/pc/ChangeLog
index d45600d5..fea82a7d 100644
--- a/pc/ChangeLog
+++ b/pc/ChangeLog
@@ -1,3 +1,7 @@
+2023-02-24 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.tst: Regenerated.
+
2023-01-31 Arnold D. Robbins <arnold@skeeve.com>
* Makefile.tst: Regenerated.
diff --git a/pc/Makefile.tst b/pc/Makefile.tst
index 1cb6f869..f9e9681b 100644
--- a/pc/Makefile.tst
+++ b/pc/Makefile.tst
@@ -193,7 +193,7 @@ GAWK_EXT_TESTS = \
clos1way5 clos1way6 colonwarn commas crlf dbugeval dbugeval2 \
dbugeval3 dbugeval4 dbugtypedre1 dbugtypedre2 delsub \
devfd devfd1 devfd2 dfacheck1 dumpvars \
- elemnew1 errno exit fieldwdth forcenum fpat1 fpat2 \
+ elemnew1 elemnew2 elemnew3 errno exit fieldwdth forcenum fpat1 fpat2 \
fpat3 fpat4 fpat5 fpat6 fpat7 fpat8 fpat9 fpatnull fsfwfs functab1 \
functab2 functab3 functab6 funlen fwtest fwtest2 fwtest3 fwtest4 \
fwtest5 fwtest6 fwtest7 fwtest8 genpot gensub gensub2 gensub3 \
@@ -2760,6 +2760,16 @@ elemnew1:
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+elemnew2:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+elemnew3:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
exit:
@echo $@
@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/ChangeLog b/test/ChangeLog
index 8fbe6b2f..ebf83d45 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -2,6 +2,8 @@
* Makefile.am (EXTRA_DIST): New test: elemnew2.
* elemnew2.awk, elemnew2.ok: New files.
+ * Makefile.am (EXTRA_DIST): New test: elemnew3.
+ * elemnew3.awk, elemnew3.ok: New files.
2023-02-09 Arnold D. Robbins <arnold@skeeve.com>
diff --git a/test/Makefile.am b/test/Makefile.am
index 15708a1f..b30d3d7a 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -291,6 +291,8 @@ EXTRA_DIST = \
elemnew1.ok \
elemnew2.awk \
elemnew2.ok \
+ elemnew3.awk \
+ elemnew3.ok \
escapebrace.awk \
escapebrace.in \
escapebrace.ok \
@@ -1504,7 +1506,7 @@ GAWK_EXT_TESTS = \
clos1way5 clos1way6 colonwarn commas crlf dbugeval dbugeval2 \
dbugeval3 dbugeval4 dbugtypedre1 dbugtypedre2 delsub \
devfd devfd1 devfd2 dfacheck1 dumpvars \
- elemnew1 elemnew2 errno exit fieldwdth forcenum fpat1 fpat2 \
+ elemnew1 elemnew2 elemnew3 errno exit fieldwdth forcenum fpat1 fpat2 \
fpat3 fpat4 fpat5 fpat6 fpat7 fpat8 fpat9 fpatnull fsfwfs functab1 \
functab2 functab3 functab6 funlen fwtest fwtest2 fwtest3 fwtest4 \
fwtest5 fwtest6 fwtest7 fwtest8 genpot gensub gensub2 gensub3 \
diff --git a/test/Makefile.in b/test/Makefile.in
index 9e9701fd..ed835ab6 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -559,6 +559,8 @@ EXTRA_DIST = \
elemnew1.ok \
elemnew2.awk \
elemnew2.ok \
+ elemnew3.awk \
+ elemnew3.ok \
escapebrace.awk \
escapebrace.in \
escapebrace.ok \
@@ -1772,7 +1774,7 @@ GAWK_EXT_TESTS = \
clos1way5 clos1way6 colonwarn commas crlf dbugeval dbugeval2 \
dbugeval3 dbugeval4 dbugtypedre1 dbugtypedre2 delsub \
devfd devfd1 devfd2 dfacheck1 dumpvars \
- elemnew1 elemnew2 errno exit fieldwdth forcenum fpat1 fpat2 \
+ elemnew1 elemnew2 elemnew3 errno exit fieldwdth forcenum fpat1 fpat2 \
fpat3 fpat4 fpat5 fpat6 fpat7 fpat8 fpat9 fpatnull fsfwfs functab1 \
functab2 functab3 functab6 funlen fwtest fwtest2 fwtest3 fwtest4 \
fwtest5 fwtest6 fwtest7 fwtest8 genpot gensub gensub2 gensub3 \
@@ -4526,6 +4528,11 @@ elemnew2:
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+elemnew3:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
exit:
@echo $@
@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/Maketests b/test/Maketests
index 331c501e..a4b215c6 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -1457,6 +1457,11 @@ elemnew2:
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+elemnew3:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
exit:
@echo $@
@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/elemnew2.awk b/test/elemnew2.awk
new file mode 100644
index 00000000..4f765032
--- /dev/null
+++ b/test/elemnew2.awk
@@ -0,0 +1,15 @@
+#!/usr/bin/gawk -f
+
+function f(x) {
+ return x;
+}
+
+BEGIN {
+ print "a[b] is " (a["b"] ? "true" : "false");
+
+ f(a["b"]);
+
+ print "a[b] is " (a["b"] ? "true" : "false");
+
+ print a["b"];
+}
diff --git a/test/elemnew2.ok b/test/elemnew2.ok
new file mode 100644
index 00000000..0de7b2d6
--- /dev/null
+++ b/test/elemnew2.ok
@@ -0,0 +1,3 @@
+a[b] is false
+a[b] is false
+
diff --git a/test/elemnew3.awk b/test/elemnew3.awk
new file mode 100644
index 00000000..4bb0d5d4
--- /dev/null
+++ b/test/elemnew3.awk
@@ -0,0 +1,9 @@
+BEGIN {
+ f(a["b"])
+ print typeof(a["b"])
+}
+
+function f(x)
+{
+ return x
+}
diff --git a/test/elemnew3.ok b/test/elemnew3.ok
new file mode 100644
index 00000000..3d17e76e
--- /dev/null
+++ b/test/elemnew3.ok
@@ -0,0 +1 @@
+unassigned