text: load("fcfbc86708bc3a4062c2091a062e13b6.js");
  load("bcb77b03ed13784489484535627fca54.js");
  // |reftest| skip-if(!xulRuntime.shell) -- needs evaluate, parseModule
  /*
   * Any copyright is dedicated to the Public Domain.
   * http://creativecommons.org/licenses/publicdomain/
   */
  
  //-----------------------------------------------------------------------------
  var BUGNUMBER = 1288459;
  var summary =
    "Properly implement the spec's distinctions between StatementListItem and " +
    "Statement grammar productions and their uses";
  
  print(BUGNUMBER + ": " + summary);
  
  /**************
   * BEGIN TEST *
   **************/
  
  var counter = 0;
  
  // Test all the different contexts that expect a Statement.
  
  function contextAcceptsStatement(pat)
  {
    var goodCode =
  `function f${counter++}()
  {
    ${pat.replace("@@@", "let \n {} \n ;")}
  }
  `;
  
    evaluate(goodCode);
  
    var badCode =
  `function f${counter++}()
  {
    ${pat.replace("@@@", "let {} \n ;")}
  }
  `;
  
    try
    {
      evaluate(badCode);
      throw new Error("didn't throw");
    }
    catch (e)
    {
      assertEq(e instanceof SyntaxError, true,
               "didn't get a syntax error, instead got: " + e);
    }
  }
  
  contextAcceptsStatement("if (0) @@@");
  contextAcceptsStatement("if (0) ; else @@@");
  contextAcceptsStatement("if (0) ; else if (0) @@@");
  contextAcceptsStatement("if (0) ; else if (0) ; else @@@");
  // Can't test do-while loops this way because the Statement isn't in trailing
  // position, so 'let' followed by newline *must* be followed by 'while'.
  contextAcceptsStatement("while (1) @@@");
  contextAcceptsStatement("for (1; 1; 0) @@@");
  contextAcceptsStatement("for (var x; 1; 0) @@@");
  contextAcceptsStatement("for (let x; 1; 0) @@@");
  contextAcceptsStatement("for (const x = 1; 1; 0) @@@");
  contextAcceptsStatement("for (x in 0) @@@");
  contextAcceptsStatement("for (var x in 0) @@@");
  contextAcceptsStatement("for (let x in 0) @@@");
  contextAcceptsStatement("for (const x in 0) @@@");
  contextAcceptsStatement("for (x of []) @@@");
  contextAcceptsStatement("for (var x of []) @@@");
  contextAcceptsStatement("for (let x of []) @@@");
  contextAcceptsStatement("for (const x of []) @@@");
  contextAcceptsStatement("with (1) @@@");
  contextAcceptsStatement("foo: @@@");
  
  // Test all the different contexts that expect a StatementListItem.
  
  function contextAcceptsStatementListItem(pat)
  {
    var goodCode =
  `function f${counter++}()
  {
    ${pat.replace("@@@", "let \n [] = [] ;")}
  }
  `;
  
    evaluate(goodCode);
  
    var moarGoodCode = pat.replace("@@@", "let \n [] = [] ;");
    evaluate(moarGoodCode);
  
    var goodModuleCode = pat.replace("@@@", "let \n [] = [] ;");
    parseModule(goodModuleCode);
  
    var badCode =
  `function f${counter++}()
  {
    ${pat.replace("@@@", "let \n let = 3 ;")}
  }
  `;
  
    try
    {
      evaluate(badCode);
      throw new Error("didn't throw");
    }
    catch (e)
    {
      assertEq(e instanceof SyntaxError, true,
               "didn't get a syntax error, instead got: " + e);
    }
  }
  
  contextAcceptsStatementListItem("{ @@@ }");
  contextAcceptsStatementListItem("switch (1) { case 1: @@@ }");
  contextAcceptsStatementListItem("switch (1) { default: @@@ }");
  contextAcceptsStatementListItem("switch (1) { case 0: case 1: @@@ }");
  contextAcceptsStatementListItem("switch (1) { case 0: break; case 1: @@@ }");
  contextAcceptsStatementListItem("switch (1) { default: @@@ case 2: }");
  contextAcceptsStatementListItem("try { @@@ } catch (e) { }");
  contextAcceptsStatementListItem("try { @@@ } finally { }");
  contextAcceptsStatementListItem("try { @@@ } catch (e) { } finally { }");
  contextAcceptsStatementListItem("try { } catch (e) { @@@ }");
  contextAcceptsStatementListItem("try { } finally { @@@ }");
  contextAcceptsStatementListItem("try { } catch (e) { @@@ } finally { }");
  contextAcceptsStatementListItem("try { } catch (e) { } finally { @@@ }");
  contextAcceptsStatementListItem("_ => { @@@ }");
  contextAcceptsStatementListItem("function q() { @@@ }");
  contextAcceptsStatementListItem("function* q() { @@@ }");
  contextAcceptsStatementListItem("(function() { @@@ })");
  contextAcceptsStatementListItem("(function*() { @@@ })");
  contextAcceptsStatementListItem("({ *q() { @@@ } })");
  contextAcceptsStatementListItem("({ q() { @@@ } })");
  contextAcceptsStatementListItem("({ get q() { @@@ } })");
  contextAcceptsStatementListItem("({ set q(v) { @@@ } })");
  contextAcceptsStatementListItem("(class { f() { @@@ } })");
  contextAcceptsStatementListItem("(class { static f() { @@@ } })");
  contextAcceptsStatementListItem("(class { static *f() { @@@ } })");
  contextAcceptsStatementListItem("(class { static get f() { @@@ } })");
  contextAcceptsStatementListItem("(class { static set f(v) { @@@ } })");
  contextAcceptsStatementListItem("(class { static() { @@@ } })");
  contextAcceptsStatementListItem("@@@");
  
  /******************************************************************************/
  
  if (typeof reportCompare === "function")
    reportCompare(true, true);
  
  print("Tests complete");
  