summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 17:32:43 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 17:32:43 +0000
commit6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch)
treea68f146d7fa01f0134297619fbe7e33db084e0aa /js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js
parentInitial commit. (diff)
downloadthunderbird-upstream.tar.xz
thunderbird-upstream.zip
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js')
-rw-r--r--js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js114
1 files changed, 114 insertions, 0 deletions
diff --git a/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js
new file mode 100644
index 0000000000..6e6a24f213
--- /dev/null
+++ b/js/src/tests/non262/lexical-environment/var-in-catch-body-annex-b.js
@@ -0,0 +1,114 @@
+// Tests annex B.3.5.
+
+assertThrowsInstanceOf(function () {
+ eval(`
+ function f() {
+ let x;
+ try {} catch (x) {
+ var x;
+ }
+ }
+ `);
+}, SyntaxError);
+
+assertThrowsInstanceOf(function () {
+ eval(`
+ function f() {
+ try {} catch (x) {
+ let y;
+ var y;
+ }
+ }
+ `);
+}, SyntaxError);
+
+assertThrowsInstanceOf(function () {
+ eval(`
+ function f() {
+ try {} catch (x) {
+ let x;
+ }
+ }
+ `);
+}, SyntaxError);
+
+assertThrowsInstanceOf(function () {
+ eval(`
+ function f() {
+ try {} catch (x) {
+ const x;
+ }
+ }
+ `);
+}, SyntaxError);
+
+// Tests that redeclaring a var inside the catch is not allowed if there's a
+// body-level lexical.
+assertThrowsInstanceOf(function () {
+ eval(`
+ let x;
+ try {} catch (x) {
+ var x;
+ }
+ `);
+}, SyntaxError);
+
+var log = '';
+var x = 'global-x';
+
+function g() {
+ x = 'g';
+ try { throw 8; } catch (x) {
+ var x = 42;
+ log += x;
+ }
+ log += x;
+}
+g();
+
+// Tests that var declaration is allowed in for-in head.
+function h0() {
+ try {} catch (e) {
+ for (var e in {});
+ }
+}
+h0();
+
+// Tests that var declaration is allowed in C-for head.
+function h1() {
+ try {} catch (e) {
+ for (var e;;);
+ }
+}
+h1();
+
+// Tests that var declaration is allowed in for-of head.
+function h2() {
+ try {} catch (e) {
+ for (var e of {});
+ }
+}
+h2();
+
+// Tests that redeclaring a var inside the catch is allowed.
+function h3() {
+ var e;
+ try {} catch (e) {
+ var e;
+ }
+}
+h3();
+
+if (typeof evaluate === "function") {
+ assertThrowsInstanceOf(function () {
+ evaluate(`
+ let y;
+ try {} catch (y) { var y; }
+ `);
+ }, SyntaxError);
+}
+
+assertEq(log, "42g");
+
+if ("reportCompare" in this)
+ reportCompare(true, true)