tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

statement-after-return.js (5353B)


      1 // Warning should be shown for unreachable statement after return (bug 1151931).
      2 
      3 function testWarn(code, lineNumber, columnNumber) {
      4  enableLastWarning();
      5  eval(code);
      6  var warning = getLastWarning();
      7  assertEq(warning !== null, true, "warning should be caught for " + code);
      8  assertEq(warning.name, "Warning");
      9  assertEq(warning.lineNumber, lineNumber);
     10  assertEq(warning.columnNumber, columnNumber);
     11 
     12  clearLastWarning();
     13  Reflect.parse(code);
     14  warning = getLastWarning();
     15  assertEq(warning !== null, true, "warning should be caught for " + code);
     16  assertEq(warning.name, "Warning");
     17  // Warning generated by Reflect.parse has line/column number for Reflect.parse
     18  // itself, not parsed code.
     19  disableLastWarning();
     20 }
     21 
     22 function testPass(code) {
     23  enableLastWarning();
     24  eval(code);
     25  var warning = getLastWarning();
     26  assertEq(warning, null, "warning should not be caught for " + code);
     27 
     28  clearLastWarning();
     29  Reflect.parse(code);
     30  warning = getLastWarning();
     31  assertEq(warning, null, "warning should not be caught for " + code);
     32  disableLastWarning();
     33 }
     34 
     35 testPass(`
     36 function f() {
     37  return (
     38    1 + 2
     39  );
     40 }
     41 `);
     42 
     43 // unary expression
     44 testWarn(`
     45 function f() {
     46  var i = 0;
     47  return
     48    ++i;
     49 }
     50 `, 5, 5);
     51 testWarn(`
     52 function f() {
     53  var i = 0;
     54  return
     55    --i;
     56 }
     57 `, 5, 5);
     58 
     59 // array
     60 testWarn(`
     61 function f() {
     62  return
     63    [1, 2, 3];
     64 }
     65 `, 4, 5);
     66 
     67 // block (object)
     68 testWarn(`
     69 function f() {
     70  return
     71    {x: 10};
     72 }
     73 `, 4, 5);
     74 testWarn(`
     75 function f() {
     76  return
     77  {
     78    method()
     79    {
     80      f();
     81    }
     82  };
     83 }
     84 `, 4, 3);
     85 
     86 // expression in paren
     87 testWarn(`
     88 function f() {
     89  return
     90    (1 + 2);
     91 }
     92 `, 4, 5);
     93 
     94 // name
     95 testWarn(`
     96 function f() {
     97  return
     98    f;
     99 }
    100 `, 4, 5);
    101 
    102 // binary expression
    103 testWarn(`
    104 function f() {
    105  return
    106    1 + 2;
    107 }
    108 `, 4, 5);
    109 testWarn(`
    110 function f() {
    111  return
    112    .1 + .2;
    113 }
    114 `, 4, 5);
    115 
    116 // string
    117 testWarn(`
    118 function f() {
    119  return
    120    "foo";
    121 }
    122 `, 4, 5);
    123 testWarn(`
    124 function f() {
    125  return
    126    "use struct";
    127 }
    128 `, 4, 5);
    129 testWarn(`
    130 function f() {
    131  return
    132    'foo';
    133 }
    134 `, 4, 5);
    135 
    136 // template string
    137 testWarn(`
    138 function f() {
    139  return
    140    \`foo\${1 + 2}\`;
    141 }
    142 `, 4, 5);
    143 testWarn(`
    144 function f() {
    145  return
    146    \`foo\`;
    147 }
    148 `, 4, 5);
    149 
    150 // RegExp
    151 testWarn(`
    152 function f() {
    153  return
    154    /foo/;
    155 }
    156 `, 4, 5);
    157 
    158 // boolean
    159 testWarn(`
    160 function f() {
    161  return
    162    true;
    163 }
    164 `, 4, 5);
    165 testWarn(`
    166 function f() {
    167  return
    168    false;
    169 }
    170 `, 4, 5);
    171 
    172 // null
    173 testWarn(`
    174 function f() {
    175  return
    176    null;
    177 }
    178 `, 4, 5);
    179 
    180 // this
    181 testWarn(`
    182 function f() {
    183  return
    184    this;
    185 }
    186 `, 4, 5);
    187 
    188 // new
    189 testWarn(`
    190 function f() {
    191  return
    192    new Array();
    193 }
    194 `, 4, 5);
    195 
    196 // delete
    197 testWarn(`
    198 function f() {
    199  var a = {x: 10};
    200  return
    201    delete a.x;
    202 }
    203 `, 5, 5);
    204 
    205 // yield
    206 testWarn(`
    207 function* f() {
    208  return
    209    yield 1;
    210 }
    211 `, 4, 5);
    212 
    213 // class
    214 testWarn(`
    215 function f() {
    216  return
    217    class A { constructor() {} };
    218 }
    219 `, 4, 5);
    220 
    221 // unary expression
    222 testWarn(`
    223 function f() {
    224  return
    225    +1;
    226 }
    227 `, 4, 5);
    228 testWarn(`
    229 function f() {
    230  return
    231    -1;
    232 }
    233 `, 4, 5);
    234 testWarn(`
    235 function f() {
    236  return
    237    !1;
    238 }
    239 `, 4, 5);
    240 testWarn(`
    241 function f() {
    242  return
    243    ~1;
    244 }
    245 `, 4, 5);
    246 
    247 // eof
    248 testPass(`
    249 var f = new Function("return\\n");
    250 `);
    251 
    252 // empty statement
    253 testPass(`
    254 function f() {
    255  return;
    256  ; // empty statement
    257 }
    258 `);
    259 
    260 // end of block
    261 testPass(`
    262 function f() {
    263  {
    264    return
    265  }
    266 }
    267 `);
    268 
    269 // function (hosted)
    270 testPass(`
    271 function f() {
    272  g();
    273  return
    274  function g() {}
    275 }
    276 `);
    277 
    278 // if
    279 testWarn(`
    280 function f() {
    281  return
    282  if (true)
    283    1 + 2;
    284 }
    285 `, 4, 3);
    286 
    287 // else
    288 testPass(`
    289 function f() {
    290  if (true)
    291    return
    292  else
    293    1 + 2;
    294 }
    295 `);
    296 
    297 // switch
    298 testWarn(`
    299 function f() {
    300  return
    301  switch (1) {
    302    case 1:
    303      break;
    304  }
    305 }
    306 `, 4, 3);
    307 
    308 // return in switch
    309 testWarn(`
    310 function f() {
    311  switch (1) {
    312    case 1:
    313      return;
    314      1 + 2;
    315      break;
    316  }
    317 }
    318 `, 6, 7);
    319 
    320 // break in switch
    321 testPass(`
    322 function f() {
    323  switch (1) {
    324    case 1:
    325      return;
    326      break;
    327  }
    328 }
    329 `);
    330 
    331 // case
    332 testPass(`
    333 function f() {
    334  switch (1) {
    335    case 0:
    336      return
    337    case 1:
    338      break;
    339  }
    340 }
    341 `);
    342 
    343 // default
    344 testPass(`
    345 function f() {
    346  switch (1) {
    347    case 0:
    348      return
    349    default:
    350      break;
    351  }
    352 }
    353 `);
    354 
    355 // while
    356 testWarn(`
    357 function f() {
    358  return
    359  while (false)
    360    1 + 2;
    361 }
    362 `, 4, 3);
    363 testPass(`
    364 function f() {
    365  do
    366    return
    367  while (false);
    368 }
    369 `);
    370 
    371 // do
    372 testWarn(`
    373 function f() {
    374  return
    375  do {
    376    1 + 2;
    377  } while (false);
    378 }
    379 `, 4, 3);
    380 
    381 // for
    382 testWarn(`
    383 function f() {
    384  return
    385  for (;;) {
    386    break;
    387  }
    388 }
    389 `, 4, 3);
    390 
    391 // break in for
    392 testPass(`
    393 function f() {
    394  for (;;) {
    395    return
    396    break;
    397  }
    398 }
    399 `, 5, 5);
    400 
    401 // continue
    402 testWarn(`
    403 function f() {
    404  for (;;) {
    405    return
    406    continue;
    407  }
    408 }
    409 `, 5, 5);
    410 
    411 // var (hosted)
    412 testPass(`
    413 function f() {
    414  return
    415  var a = 1;
    416 }
    417 `);
    418 
    419 // const
    420 testWarn(`
    421 function f() {
    422  return
    423  const a = 1;
    424 }
    425 `, 4, 3);
    426 
    427 // with
    428 testWarn(`
    429 function f() {
    430  return
    431  with ({}) {
    432    1;
    433  }
    434 }
    435 `, 4, 3);
    436 
    437 // return
    438 testWarn(`
    439 function f() {
    440  return
    441  return;
    442 }
    443 `, 4, 3);
    444 
    445 // try
    446 testWarn(`
    447 function f() {
    448  return
    449  try {
    450  } catch (e) {
    451  }
    452 }
    453 `, 4, 3);
    454 
    455 // throw
    456 testPass(`
    457 function f() {
    458  return
    459  throw 1;
    460 }
    461 `);
    462 
    463 // debugger
    464 testWarn(`
    465 function f() {
    466  return
    467  debugger;
    468 }
    469 `, 4, 3);
    470 
    471 // let
    472 testWarn(`
    473 function f() {
    474  return
    475  let a = 1;
    476 }
    477 `, 4, 3);
    478 
    479 // skip hoisted
    480 
    481 testWarn(`
    482 function f() {
    483  return
    484  var a = 0;
    485  (1 + 2);
    486 }
    487 `, 5, 3);
    488 
    489 testWarn(`
    490 function f() {
    491  return
    492  function f() {}
    493  var a = 0;
    494  (1 + 2);
    495 }
    496 `, 6, 3);