summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/basic/statement-after-return.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/basic/statement-after-return.js')
-rw-r--r--js/src/jit-test/tests/basic/statement-after-return.js496
1 files changed, 496 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/basic/statement-after-return.js b/js/src/jit-test/tests/basic/statement-after-return.js
new file mode 100644
index 0000000000..2a49c74577
--- /dev/null
+++ b/js/src/jit-test/tests/basic/statement-after-return.js
@@ -0,0 +1,496 @@
+// Warning should be shown for unreachable statement after return (bug 1151931).
+
+function testWarn(code, lineNumber, columnNumber) {
+ enableLastWarning();
+ eval(code);
+ var warning = getLastWarning();
+ assertEq(warning !== null, true, "warning should be caught for " + code);
+ assertEq(warning.name, "Warning");
+ assertEq(warning.lineNumber, lineNumber);
+ assertEq(warning.columnNumber, columnNumber);
+
+ clearLastWarning();
+ Reflect.parse(code);
+ warning = getLastWarning();
+ assertEq(warning !== null, true, "warning should be caught for " + code);
+ assertEq(warning.name, "Warning");
+ // Warning generated by Reflect.parse has line/column number for Reflect.parse
+ // itself, not parsed code.
+ disableLastWarning();
+}
+
+function testPass(code) {
+ enableLastWarning();
+ eval(code);
+ var warning = getLastWarning();
+ assertEq(warning, null, "warning should not be caught for " + code);
+
+ clearLastWarning();
+ Reflect.parse(code);
+ warning = getLastWarning();
+ assertEq(warning, null, "warning should not be caught for " + code);
+ disableLastWarning();
+}
+
+testPass(`
+function f() {
+ return (
+ 1 + 2
+ );
+}
+`);
+
+// unary expression
+testWarn(`
+function f() {
+ var i = 0;
+ return
+ ++i;
+}
+`, 5, 5);
+testWarn(`
+function f() {
+ var i = 0;
+ return
+ --i;
+}
+`, 5, 5);
+
+// array
+testWarn(`
+function f() {
+ return
+ [1, 2, 3];
+}
+`, 4, 5);
+
+// block (object)
+testWarn(`
+function f() {
+ return
+ {x: 10};
+}
+`, 4, 5);
+testWarn(`
+function f() {
+ return
+ {
+ method()
+ {
+ f();
+ }
+ };
+}
+`, 4, 3);
+
+// expression in paren
+testWarn(`
+function f() {
+ return
+ (1 + 2);
+}
+`, 4, 5);
+
+// name
+testWarn(`
+function f() {
+ return
+ f;
+}
+`, 4, 5);
+
+// binary expression
+testWarn(`
+function f() {
+ return
+ 1 + 2;
+}
+`, 4, 5);
+testWarn(`
+function f() {
+ return
+ .1 + .2;
+}
+`, 4, 5);
+
+// string
+testWarn(`
+function f() {
+ return
+ "foo";
+}
+`, 4, 5);
+testWarn(`
+function f() {
+ return
+ "use struct";
+}
+`, 4, 5);
+testWarn(`
+function f() {
+ return
+ 'foo';
+}
+`, 4, 5);
+
+// template string
+testWarn(`
+function f() {
+ return
+ \`foo\${1 + 2}\`;
+}
+`, 4, 5);
+testWarn(`
+function f() {
+ return
+ \`foo\`;
+}
+`, 4, 5);
+
+// RegExp
+testWarn(`
+function f() {
+ return
+ /foo/;
+}
+`, 4, 5);
+
+// boolean
+testWarn(`
+function f() {
+ return
+ true;
+}
+`, 4, 5);
+testWarn(`
+function f() {
+ return
+ false;
+}
+`, 4, 5);
+
+// null
+testWarn(`
+function f() {
+ return
+ null;
+}
+`, 4, 5);
+
+// this
+testWarn(`
+function f() {
+ return
+ this;
+}
+`, 4, 5);
+
+// new
+testWarn(`
+function f() {
+ return
+ new Array();
+}
+`, 4, 5);
+
+// delete
+testWarn(`
+function f() {
+ var a = {x: 10};
+ return
+ delete a.x;
+}
+`, 5, 5);
+
+// yield
+testWarn(`
+function* f() {
+ return
+ yield 1;
+}
+`, 4, 5);
+
+// class
+testWarn(`
+function f() {
+ return
+ class A { constructor() {} };
+}
+`, 4, 5);
+
+// unary expression
+testWarn(`
+function f() {
+ return
+ +1;
+}
+`, 4, 5);
+testWarn(`
+function f() {
+ return
+ -1;
+}
+`, 4, 5);
+testWarn(`
+function f() {
+ return
+ !1;
+}
+`, 4, 5);
+testWarn(`
+function f() {
+ return
+ ~1;
+}
+`, 4, 5);
+
+// eof
+testPass(`
+var f = new Function("return\\n");
+`);
+
+// empty statement
+testPass(`
+function f() {
+ return;
+ ; // empty statement
+}
+`);
+
+// end of block
+testPass(`
+function f() {
+ {
+ return
+ }
+}
+`);
+
+// function (hosted)
+testPass(`
+function f() {
+ g();
+ return
+ function g() {}
+}
+`);
+
+// if
+testWarn(`
+function f() {
+ return
+ if (true)
+ 1 + 2;
+}
+`, 4, 3);
+
+// else
+testPass(`
+function f() {
+ if (true)
+ return
+ else
+ 1 + 2;
+}
+`);
+
+// switch
+testWarn(`
+function f() {
+ return
+ switch (1) {
+ case 1:
+ break;
+ }
+}
+`, 4, 3);
+
+// return in switch
+testWarn(`
+function f() {
+ switch (1) {
+ case 1:
+ return;
+ 1 + 2;
+ break;
+ }
+}
+`, 6, 7);
+
+// break in switch
+testPass(`
+function f() {
+ switch (1) {
+ case 1:
+ return;
+ break;
+ }
+}
+`);
+
+// case
+testPass(`
+function f() {
+ switch (1) {
+ case 0:
+ return
+ case 1:
+ break;
+ }
+}
+`);
+
+// default
+testPass(`
+function f() {
+ switch (1) {
+ case 0:
+ return
+ default:
+ break;
+ }
+}
+`);
+
+// while
+testWarn(`
+function f() {
+ return
+ while (false)
+ 1 + 2;
+}
+`, 4, 3);
+testPass(`
+function f() {
+ do
+ return
+ while (false);
+}
+`);
+
+// do
+testWarn(`
+function f() {
+ return
+ do {
+ 1 + 2;
+ } while (false);
+}
+`, 4, 3);
+
+// for
+testWarn(`
+function f() {
+ return
+ for (;;) {
+ break;
+ }
+}
+`, 4, 3);
+
+// break in for
+testPass(`
+function f() {
+ for (;;) {
+ return
+ break;
+ }
+}
+`, 5, 5);
+
+// continue
+testWarn(`
+function f() {
+ for (;;) {
+ return
+ continue;
+ }
+}
+`, 5, 5);
+
+// var (hosted)
+testPass(`
+function f() {
+ return
+ var a = 1;
+}
+`);
+
+// const
+testWarn(`
+function f() {
+ return
+ const a = 1;
+}
+`, 4, 3);
+
+// with
+testWarn(`
+function f() {
+ return
+ with ({}) {
+ 1;
+ }
+}
+`, 4, 3);
+
+// return
+testWarn(`
+function f() {
+ return
+ return;
+}
+`, 4, 3);
+
+// try
+testWarn(`
+function f() {
+ return
+ try {
+ } catch (e) {
+ }
+}
+`, 4, 3);
+
+// throw
+testPass(`
+function f() {
+ return
+ throw 1;
+}
+`);
+
+// debugger
+testWarn(`
+function f() {
+ return
+ debugger;
+}
+`, 4, 3);
+
+// let
+testWarn(`
+function f() {
+ return
+ let a = 1;
+}
+`, 4, 3);
+
+// skip hoisted
+
+testWarn(`
+function f() {
+ return
+ var a = 0;
+ (1 + 2);
+}
+`, 5, 3);
+
+testWarn(`
+function f() {
+ return
+ function f() {}
+ var a = 0;
+ (1 + 2);
+}
+`, 6, 3);