blob: 24c8ddc753f38d2e90ff5b62d41e46a6a441f76a [file] [log] [blame]
// 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, "None");
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, "None");
// 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, 4);
testWarn(`
function f() {
var i = 0;
return
--i;
}
`, 5, 4);
// array
testWarn(`
function f() {
return
[1, 2, 3];
}
`, 4, 4);
// block (object)
testWarn(`
function f() {
return
{x: 10};
}
`, 4, 4);
testWarn(`
function f() {
return
{
method()
{
f();
}
};
}
`, 4, 2);
// expression in paren
testWarn(`
function f() {
return
(1 + 2);
}
`, 4, 4);
// name
testWarn(`
function f() {
return
f;
}
`, 4, 4);
// binary expression
testWarn(`
function f() {
return
1 + 2;
}
`, 4, 4);
testWarn(`
function f() {
return
.1 + .2;
}
`, 4, 4);
// string
testWarn(`
function f() {
return
"foo";
}
`, 4, 4);
testWarn(`
function f() {
return
"use struct";
}
`, 4, 4);
testWarn(`
function f() {
return
'foo';
}
`, 4, 4);
// template string
testWarn(`
function f() {
return
\`foo\${1 + 2}\`;
}
`, 4, 4);
testWarn(`
function f() {
return
\`foo\`;
}
`, 4, 4);
// RegExp
testWarn(`
function f() {
return
/foo/;
}
`, 4, 4);
// boolean
testWarn(`
function f() {
return
true;
}
`, 4, 4);
testWarn(`
function f() {
return
false;
}
`, 4, 4);
// null
testWarn(`
function f() {
return
null;
}
`, 4, 4);
// this
testWarn(`
function f() {
return
this;
}
`, 4, 4);
// new
testWarn(`
function f() {
return
new Array();
}
`, 4, 4);
// delete
testWarn(`
function f() {
var a = {x: 10};
return
delete a.x;
}
`, 5, 4);
// yield
testWarn(`
function* f() {
return
yield 1;
}
`, 4, 4);
// class
testWarn(`
function f() {
return
class A { constructor() {} };
}
`, 4, 4);
// unary expression
testWarn(`
function f() {
return
+1;
}
`, 4, 4);
testWarn(`
function f() {
return
-1;
}
`, 4, 4);
testWarn(`
function f() {
return
!1;
}
`, 4, 4);
testWarn(`
function f() {
return
~1;
}
`, 4, 4);
// 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, 2);
// else
testPass(`
function f() {
if (true)
return
else
1 + 2;
}
`);
// switch
testWarn(`
function f() {
return
switch (1) {
case 1:
break;
}
}
`, 4, 2);
// return in switch
testWarn(`
function f() {
switch (1) {
case 1:
return;
1 + 2;
break;
}
}
`, 6, 6);
// 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, 2);
testPass(`
function f() {
do
return
while (false);
}
`);
// do
testWarn(`
function f() {
return
do {
1 + 2;
} while (false);
}
`, 4, 2);
// for
testWarn(`
function f() {
return
for (;;) {
break;
}
}
`, 4, 2);
// break in for
testPass(`
function f() {
for (;;) {
return
break;
}
}
`, 5, 4);
// continue
testWarn(`
function f() {
for (;;) {
return
continue;
}
}
`, 5, 4);
// var (hosted)
testPass(`
function f() {
return
var a = 1;
}
`);
// const
testWarn(`
function f() {
return
const a = 1;
}
`, 4, 2);
// with
testWarn(`
function f() {
return
with ({}) {
1;
}
}
`, 4, 2);
// return
testWarn(`
function f() {
return
return;
}
`, 4, 2);
// try
testWarn(`
function f() {
return
try {
} catch (e) {
}
}
`, 4, 2);
// throw
testPass(`
function f() {
return
throw 1;
}
`);
// debugger
testWarn(`
function f() {
return
debugger;
}
`, 4, 2);
// let
testWarn(`
function f() {
return
let a = 1;
}
`, 4, 2);
// skip hoisted
testWarn(`
function f() {
return
var a = 0;
(1 + 2);
}
`, 5, 2);
testWarn(`
function f() {
return
function f() {}
var a = 0;
(1 + 2);
}
`, 6, 2);