<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[245406] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/245406">245406</a></dd>
<dt>Author</dt> <dd>ross.kirsling@sony.com</dd>
<dt>Date</dt> <dd>2019-05-16 13:08:22 -0700 (Thu, 16 May 2019)</dd>
</dl>

<h3>Log Message</h3>
<pre>[JSC] Invalid AssignmentTargetType should be an early error.
https://bugs.webkit.org/show_bug.cgi?id=197603

Reviewed by Keith Miller.

JSTests:

* test262/expectations.yaml:
Update expectations to reflect new SyntaxErrors.
(Ideally, these should all be viewed as passing in the near future.)

* stress/async-await-basic.js:
* stress/big-int-literals.js:
Update tests to reflect new SyntaxErrors.

* ChakraCore.yaml:
* ChakraCore/test/EH/try6.baseline-jsc:
* ChakraCore/test/Error/variousErrors3.baseline-jsc: Added.
Update baselines to reflect new SyntaxErrors.

Source/JavaScriptCore:

Since ES6, expressions like 0++, ++0, 0 = 0, and 0 += 0 are all specified as early errors:
  https://tc39.github.io/ecma262/#sec-update-expressions-static-semantics-early-errors
  https://tc39.github.io/ecma262/#sec-assignment-operators-static-semantics-early-errors

We currently throw late ReferenceErrors for these -- let's turn them into early SyntaxErrors.
(This is based on the expectation that https://github.com/tc39/ecma262/pull/1527 will be accepted;
if that doesn't come to pass, we can subsequently introduce early ReferenceError and revise these.)

* bytecompiler/NodesCodegen.cpp:
(JSC::PostfixNode::emitBytecode): Add an assert for "function call LHS" case.
(JSC::PrefixNode::emitBytecode): Add an assert for "function call LHS" case.

* parser/ASTBuilder.h:
(JSC::ASTBuilder::isLocation): Added.
(JSC::ASTBuilder::isAssignmentLocation): Fix misleading parameter name.
(JSC::ASTBuilder::isFunctionCall): Added.
(JSC::ASTBuilder::makeAssignNode): Add an assert for "function call LHS" case.
* parser/SyntaxChecker.h:
(JSC::SyntaxChecker::isLocation): Added.
(JSC::SyntaxChecker::isAssignmentLocation): Fix incorrect definition and align with ASTBuilder.
(JSC::SyntaxChecker::isFunctionCall): Added.
* parser/Nodes.h:
(JSC::ExpressionNode::isFunctionCall const): Added.
Ensure that the parser can check whether an expression node is a function call.

* parser/Parser.cpp:
(JSC::Parser<LexerType>::isSimpleAssignmentTarget): Added.
(JSC::Parser<LexerType>::parseAssignmentExpression):
(JSC::Parser<LexerType>::parseUnaryExpression): See below.
* parser/Parser.h:
Throw SyntaxError whenever an assignment or update expression's target is invalid.
Unfortunately, it seems that web compatibility obliges us to exempt the "function call LHS" case in sloppy mode.
(https://github.com/tc39/ecma262/issues/257#issuecomment-195106880)

Additional cleanup items:
  - Make use of `semanticFailIfTrue` for `isMetaProperty` checks, as it's equivalent.
  - Rename `requiresLExpr` to `hasPrefixUpdateOp` since it's now confusing,
    and get rid of `modifiesExpr` since it refers to the exact same condition.
  - Stop setting `lastOperator` near the end -- one case was incorrect and regardless neither is used.

LayoutTests:

* fast/events/window-onerror4-expected.txt:
* ietestcenter/Javascript/11.13.1-1-1-expected.txt:
* ietestcenter/Javascript/11.13.1-1-2-expected.txt:
* ietestcenter/Javascript/11.13.1-1-3-expected.txt:
* ietestcenter/Javascript/11.13.1-1-4-expected.txt:
* js/basic-strict-mode-expected.txt:
* js/dom/assign-expected.txt:
* js/dom/line-column-numbers-expected.txt:
* js/dom/line-column-numbers.html:
* js/dom/postfix-syntax-expected.txt:
* js/dom/prefix-syntax-expected.txt:
* js/dom/script-tests/line-column-numbers.js:
* js/function-toString-parentheses-expected.txt:
* js/parser-syntax-check-expected.txt:
* js/parser-xml-close-comment-expected.txt:
* js/script-tests/function-toString-parentheses.js:
* js/script-tests/parser-syntax-check.js:
Update tests & expectations to reflect new SyntaxErrors.

* js/script-tests/toString-prefix-postfix-preserve-parens.js:
* js/toString-prefix-postfix-preserve-parens-expected.txt:
None of the prefix/postfix tests make sense here now that they're all SyntaxErrors;
remove them and just leave the typeof tests.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkJSTestsChakraCoretestEHtry6baselinejsc">trunk/JSTests/ChakraCore/test/EH/try6.baseline-jsc</a></li>
<li><a href="#trunkJSTestsChakraCoreyaml">trunk/JSTests/ChakraCore.yaml</a></li>
<li><a href="#trunkJSTestsChangeLog">trunk/JSTests/ChangeLog</a></li>
<li><a href="#trunkJSTestsstressasyncawaitbasicjs">trunk/JSTests/stress/async-await-basic.js</a></li>
<li><a href="#trunkJSTestsstressbigintliteralsjs">trunk/JSTests/stress/big-int-literals.js</a></li>
<li><a href="#trunkJSTeststest262expectationsyaml">trunk/JSTests/test262/expectations.yaml</a></li>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfasteventswindowonerror4expectedtxt">trunk/LayoutTests/fast/events/window-onerror4-expected.txt</a></li>
<li><a href="#trunkLayoutTestsietestcenterJavascript1113111expectedtxt">trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-1-expected.txt</a></li>
<li><a href="#trunkLayoutTestsietestcenterJavascript1113112expectedtxt">trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-2-expected.txt</a></li>
<li><a href="#trunkLayoutTestsietestcenterJavascript1113113expectedtxt">trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-3-expected.txt</a></li>
<li><a href="#trunkLayoutTestsietestcenterJavascript1113114expectedtxt">trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-4-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsbasicstrictmodeexpectedtxt">trunk/LayoutTests/js/basic-strict-mode-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomassignexpectedtxt">trunk/LayoutTests/js/dom/assign-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomlinecolumnnumbersexpectedtxt">trunk/LayoutTests/js/dom/line-column-numbers-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomlinecolumnnumbershtml">trunk/LayoutTests/js/dom/line-column-numbers.html</a></li>
<li><a href="#trunkLayoutTestsjsdompostfixsyntaxexpectedtxt">trunk/LayoutTests/js/dom/postfix-syntax-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomprefixsyntaxexpectedtxt">trunk/LayoutTests/js/dom/prefix-syntax-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomscripttestslinecolumnnumbersjs">trunk/LayoutTests/js/dom/script-tests/line-column-numbers.js</a></li>
<li><a href="#trunkLayoutTestsjsfunctiontoStringparenthesesexpectedtxt">trunk/LayoutTests/js/function-toString-parentheses-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsparsersyntaxcheckexpectedtxt">trunk/LayoutTests/js/parser-syntax-check-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsparserxmlclosecommentexpectedtxt">trunk/LayoutTests/js/parser-xml-close-comment-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsscripttestsfunctiontoStringparenthesesjs">trunk/LayoutTests/js/script-tests/function-toString-parentheses.js</a></li>
<li><a href="#trunkLayoutTestsjsscripttestsparsersyntaxcheckjs">trunk/LayoutTests/js/script-tests/parser-syntax-check.js</a></li>
<li><a href="#trunkLayoutTestsjsscriptteststoStringprefixpostfixpreserveparensjs">trunk/LayoutTests/js/script-tests/toString-prefix-postfix-preserve-parens.js</a></li>
<li><a href="#trunkLayoutTestsjstoStringprefixpostfixpreserveparensexpectedtxt">trunk/LayoutTests/js/toString-prefix-postfix-preserve-parens-expected.txt</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecompilerNodesCodegencpp">trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserASTBuilderh">trunk/Source/JavaScriptCore/parser/ASTBuilder.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserNodesh">trunk/Source/JavaScriptCore/parser/Nodes.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserParsercpp">trunk/Source/JavaScriptCore/parser/Parser.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserParserh">trunk/Source/JavaScriptCore/parser/Parser.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserSyntaxCheckerh">trunk/Source/JavaScriptCore/parser/SyntaxChecker.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkJSTestsChakraCoretestErrorvariousErrors3baselinejsc">trunk/JSTests/ChakraCore/test/Error/variousErrors3.baseline-jsc</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkJSTestsChakraCoretestEHtry6baselinejsc"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/ChakraCore/test/EH/try6.baseline-jsc (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/ChakraCore/test/EH/try6.baseline-jsc       2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/JSTests/ChakraCore/test/EH/try6.baseline-jsc  2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -16,4 +16,4 @@
</span><span class="cx">  Finally bar 2
</span><span class="cx"> Except foobaz 2 thrown
</span><span class="cx"> english (passed)
</span><del>-ReferenceError: Postfix ++ operator applied to value that is not a reference.
</del><ins>+SyntaxError: Postfix ++ operator applied to value that is not a reference.
</ins></span></pre></div>
<a id="trunkJSTestsChakraCoretestErrorvariousErrors3baselinejsc"></a>
<div class="addfile"><h4>Added: trunk/JSTests/ChakraCore/test/Error/variousErrors3.baseline-jsc (0 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/ChakraCore/test/Error/variousErrors3.baseline-jsc                          (rev 0)
+++ trunk/JSTests/ChakraCore/test/Error/variousErrors3.baseline-jsc     2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+42 = 42 :: SyntaxError
+'x' = 42 :: SyntaxError
+true = 42 :: SyntaxError
+null = 42 :: SyntaxError
+delete this .. true
+delete true .. true
+delete 10 .. true
+delete null .. true
</ins></span></pre></div>
<a id="trunkJSTestsChakraCoreyaml"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/ChakraCore.yaml (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/ChakraCore.yaml    2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/JSTests/ChakraCore.yaml       2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -551,7 +551,7 @@
</span><span class="cx"> - path: ChakraCore/test/Error/CallNonFunction.js
</span><span class="cx">   cmd: runChakra :baseline, "NoException", "CallNonFunction_3.baseline-jsc", []
</span><span class="cx"> - path: ChakraCore/test/Error/variousErrors.js
</span><del>-  cmd: runChakra :baseline, "NoException", "variousErrors3.baseline", []
</del><ins>+  cmd: runChakra :baseline, "NoException", "variousErrors3.baseline-jsc", []
</ins><span class="cx"> - path: ChakraCore/test/Error/bug560940.js
</span><span class="cx">   cmd: runChakra :pass, "NoException", "", []
</span><span class="cx"> - path: ChakraCore/test/Error/inlineSameFunc.js
</span></span></pre></div>
<a id="trunkJSTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/ChangeLog (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/ChangeLog  2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/JSTests/ChangeLog     2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2019-05-16  Ross Kirsling  <ross.kirsling@sony.com>
+
+        [JSC] Invalid AssignmentTargetType should be an early error.
+        https://bugs.webkit.org/show_bug.cgi?id=197603
+
+        Reviewed by Keith Miller.
+
+        * test262/expectations.yaml:
+        Update expectations to reflect new SyntaxErrors.
+        (Ideally, these should all be viewed as passing in the near future.)
+
+        * stress/async-await-basic.js:
+        * stress/big-int-literals.js:
+        Update tests to reflect new SyntaxErrors.
+
+        * ChakraCore.yaml:
+        * ChakraCore/test/EH/try6.baseline-jsc:
+        * ChakraCore/test/Error/variousErrors3.baseline-jsc: Added.
+        Update baselines to reflect new SyntaxErrors.
+
</ins><span class="cx"> 2019-05-15  Saam Barati  <sbarati@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Bound liveness of SetArgumentMaybe nodes when maximal flush insertion phase is enabled
</span></span></pre></div>
<a id="trunkJSTestsstressasyncawaitbasicjs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/stress/async-await-basic.js (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/stress/async-await-basic.js        2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/JSTests/stress/async-await-basic.js   2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -270,28 +270,15 @@
</span><span class="cx">     var t3 = !!!!!await Promise.resolve(true);
</span><span class="cx">     log.push('step 5 ' + t3);
</span><span class="cx"> 
</span><del>-    try {
-        var t4 = ++await 1;
-    } catch(e) {
-        if (e instanceof ReferenceError) {
-            log.push('step 6 ');
-        } 
-    }
</del><ins>+    shouldThrowSyntaxError("var t4 = ++await 1;");
+    shouldThrowSyntaxError("var t5 = --await 1;");
</ins><span class="cx"> 
</span><del>-    try {
-        var t5 = --await 1;
-    } catch(e) {
-        if (e instanceof ReferenceError) {
-            log.push('step 7');
-        } 
-    }
-
</del><span class="cx">     return void await 'test';
</span><span class="cx"> };
</span><span class="cx"> log = [];
</span><span class="cx"> 
</span><span class="cx"> shouldBeAsync(undefined, () => awaitEpression(5));
</span><del>-shouldBe("start:5 step 1 step 2 -2 step 3 12345 step 4 -54321 step 5 false step 6  step 7", log.join(" "));
</del><ins>+shouldBe("start:5 step 1 step 2 -2 step 3 12345 step 4 -54321 step 5 false", log.join(" "));
</ins><span class="cx"> 
</span><span class="cx"> // MethoodDefinition SyntaxErrors
</span><span class="cx"> shouldThrowSyntaxError("var obj = { async foo : true };", "Unexpected token ':'. Expected a parenthesis for argument list.");
</span></span></pre></div>
<a id="trunkJSTestsstressbigintliteralsjs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/stress/big-int-literals.js (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/stress/big-int-literals.js 2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/JSTests/stress/big-int-literals.js    2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -104,10 +104,4 @@
</span><span class="cx"> assertThrowSyntaxError("100nn");
</span><span class="cx"> assertThrowSyntaxError("1a0nn");
</span><span class="cx"> assertThrowSyntaxError("10E20n");
</span><del>-
-try {
-    eval("--10n");
-    assert(false);
-} catch(e) {
-    assert(e instanceof ReferenceError);
-}
</del><ins>+assertThrowSyntaxError("--10n");
</ins></span></pre></div>
<a id="trunkJSTeststest262expectationsyaml"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/test262/expectations.yaml (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/test262/expectations.yaml  2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/JSTests/test262/expectations.yaml     2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -1807,7 +1807,7 @@
</span><span class="cx"> test/language/arguments-object/mapped/nonconfigurable-nonwritable-descriptors-set-by-param.js:
</span><span class="cx">   default: 'Test262Error: Expected obj[0] to have configurable:false.'
</span><span class="cx"> test/language/asi/S7.9_A5.7_T1.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: The prefix-increment operator requires a reference expression.'
</ins><span class="cx">   strict mode: 'SyntaxError: The prefix-increment operator requires a reference expression.'
</span><span class="cx"> test/language/block-scope/syntax/redeclaration/async-function-name-redeclaration-attempt-with-async-function.js:
</span><span class="cx">   default: 'Test262: This statement should not be evaluated.'
</span><span class="lines">@@ -2060,29 +2060,29 @@
</span><span class="cx">   default: 'Test262Error: Expected SameValue(«true», Â«false») to be true'
</span><span class="cx">   strict mode: 'Test262Error: Expected SameValue(«true», Â«false») to be true'
</span><span class="cx"> test/language/expressions/assignment/non-simple-target.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/assignment/target-boolean.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/assignment/target-cover-newtarget.js:
</span><span class="cx">   default: "SyntaxError: new.target can't be the left hand side of an assignment expression."
</span><span class="cx">   strict mode: "SyntaxError: new.target can't be the left hand side of an assignment expression."
</span><span class="cx"> test/language/expressions/assignment/target-cover-yieldexpr.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/assignment/target-newtarget.js:
</span><span class="cx">   default: "SyntaxError: new.target can't be the left hand side of an assignment expression."
</span><span class="cx">   strict mode: "SyntaxError: new.target can't be the left hand side of an assignment expression."
</span><span class="cx"> test/language/expressions/assignment/target-null.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/assignment/target-number.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/assignment/target-string.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/async-arrow-function/await-as-param-ident-nested-arrow-parameter-position.js:
</span><span class="cx">   default: 'Test262: This statement should not be evaluated.'
</span><span class="cx">   strict mode: 'Test262: This statement should not be evaluated.'
</span><span class="lines">@@ -2090,11 +2090,11 @@
</span><span class="cx">   default: 'Test262: This statement should not be evaluated.'
</span><span class="cx">   strict mode: 'Test262: This statement should not be evaluated.'
</span><span class="cx"> test/language/expressions/async-function/early-errors-expression-not-simple-assignment-target.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/await/early-errors-await-not-simple-assignment-target.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/call/eval-realm-indirect.js:
</span><span class="cx">   default: 'Test262Error: Expected SameValue(«inside», Â«outside») to be true'
</span><span class="cx"> test/language/expressions/call/eval-spread-empty-leading.js:
</span><span class="lines">@@ -2300,92 +2300,92 @@
</span><span class="cx">   default: 'Test262Error: Expected true but got false'
</span><span class="cx">   strict mode: 'Test262Error: Expected true but got false'
</span><span class="cx"> test/language/expressions/compound-assignment/add-non-simple.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/compound-assignment/btws-and-non-simple.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/compound-assignment/btws-or-non-simple.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/compound-assignment/btws-xor-non-simple.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/compound-assignment/div-non-simple.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/compound-assignment/left-shift-non-simple.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/compound-assignment/mod-div-non-simple.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/compound-assignment/mult-non-simple.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/compound-assignment/right-shift-non-simple.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/compound-assignment/subtract-non-simple.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/compound-assignment/u-right-shift-non-simple.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/conditional/in-branch-1.js:
</span><span class="cx">   default: "SyntaxError: Unexpected keyword 'in'. Expected ':' in ternary operator."
</span><span class="cx">   strict mode: "SyntaxError: Unexpected keyword 'in'. Expected ':' in ternary operator."
</span><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-1-update-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.'
+  strict mode: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-10-lhs-assignment-operator-assignment-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-11-lhs-assignment-operator-assignment-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-12-lhs-assignment-operator-assignment-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-13-lhs-assignment-operator-assignment-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-14-lhs-assignment-operator-assignment-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-15-lhs-assignment-operator-assignment-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-16-lhs-assignment-operator-assignment-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-17-lhs-assignment-operator-assignment-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-2-update-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Postfix -- operator applied to value that is not a reference.'
+  strict mode: 'SyntaxError: Postfix -- operator applied to value that is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-3-update-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Prefix -- operator applied to value that is not a reference.'
+  strict mode: 'SyntaxError: Prefix -- operator applied to value that is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-4-update-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Prefix -- operator applied to value that is not a reference.'
+  strict mode: 'SyntaxError: Prefix -- operator applied to value that is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-5-lhs-equals-assignment-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-6-lhs-assignment-operator-assignment-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-7-lhs-assignment-operator-assignment-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-8-lhs-assignment-operator-assignment-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-9-lhs-assignment-operator-assignment-expression.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/function/name.js:
</span><span class="cx">   default: 'Test262Error: Expected SameValue(«true», Â«false») to be true'
</span><span class="cx">   strict mode: 'Test262Error: Expected SameValue(«true», Â«false») to be true'
</span><span class="lines">@@ -2477,8 +2477,8 @@
</span><span class="cx">   default: "SyntaxError: new.target can't come before a postfix operator."
</span><span class="cx">   strict mode: "SyntaxError: new.target can't come before a postfix operator."
</span><span class="cx"> test/language/expressions/postfix-decrement/target-cover-yieldexpr.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Postfix -- operator applied to value that is not a reference.'
+  strict mode: 'SyntaxError: Postfix -- operator applied to value that is not a reference.'
</ins><span class="cx"> test/language/expressions/postfix-decrement/target-newtarget.js:
</span><span class="cx">   default: "SyntaxError: new.target can't come before a postfix operator."
</span><span class="cx">   strict mode: "SyntaxError: new.target can't come before a postfix operator."
</span><span class="lines">@@ -2500,8 +2500,8 @@
</span><span class="cx">   default: "SyntaxError: new.target can't come before a postfix operator."
</span><span class="cx">   strict mode: "SyntaxError: new.target can't come before a postfix operator."
</span><span class="cx"> test/language/expressions/postfix-increment/target-cover-yieldexpr.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.'
+  strict mode: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.'
</ins><span class="cx"> test/language/expressions/postfix-increment/target-newtarget.js:
</span><span class="cx">   default: "SyntaxError: new.target can't come before a postfix operator."
</span><span class="cx">   strict mode: "SyntaxError: new.target can't come before a postfix operator."
</span><span class="lines">@@ -2523,8 +2523,8 @@
</span><span class="cx">   default: "SyntaxError: new.target can't come after a prefix operator."
</span><span class="cx">   strict mode: "SyntaxError: new.target can't come after a prefix operator."
</span><span class="cx"> test/language/expressions/prefix-decrement/target-cover-yieldexpr.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Prefix -- operator applied to value that is not a reference.'
+  strict mode: 'SyntaxError: Prefix -- operator applied to value that is not a reference.'
</ins><span class="cx"> test/language/expressions/prefix-decrement/target-newtarget.js:
</span><span class="cx">   default: "SyntaxError: new.target can't come after a prefix operator."
</span><span class="cx">   strict mode: "SyntaxError: new.target can't come after a prefix operator."
</span><span class="lines">@@ -2546,8 +2546,8 @@
</span><span class="cx">   default: "SyntaxError: new.target can't come after a prefix operator."
</span><span class="cx">   strict mode: "SyntaxError: new.target can't come after a prefix operator."
</span><span class="cx"> test/language/expressions/prefix-increment/target-cover-yieldexpr.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Prefix -- operator applied to value that is not a reference.'
+  strict mode: 'SyntaxError: Prefix -- operator applied to value that is not a reference.'
</ins><span class="cx"> test/language/expressions/prefix-increment/target-newtarget.js:
</span><span class="cx">   default: "SyntaxError: new.target can't come after a prefix operator."
</span><span class="cx">   strict mode: "SyntaxError: new.target can't come after a prefix operator."
</span><span class="lines">@@ -2555,8 +2555,8 @@
</span><span class="cx">   default: 'Test262Error: did not perform ArgumentsListEvaluation Expected SameValue(«true», Â«false») to be true'
</span><span class="cx">   strict mode: 'Test262Error: did not perform ArgumentsListEvaluation Expected SameValue(«true», Â«false») to be true'
</span><span class="cx"> test/language/expressions/this/S11.1.1_A1.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/expressions/yield/star-iterable.js:
</span><span class="cx">   default: 'Test262Error: First result `done` flag Expected SameValue(«false», Â«undefined») to be true'
</span><span class="cx">   strict mode: 'Test262Error: First result `done` flag Expected SameValue(«false», Â«undefined») to be true'
</span><span class="lines">@@ -2777,10 +2777,16 @@
</span><span class="cx">   module: "SyntaxError: Unexpected identifier 'as'. Expected 'from' before exported module name."
</span><span class="cx"> test/language/module-code/instn-once.js:
</span><span class="cx">   module: "SyntaxError: Unexpected identifier 'as'. Expected 'from' before exported module name."
</span><ins>+test/language/module-code/instn-resolve-empty-export.js:
+  module: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.'
+test/language/module-code/instn-resolve-empty-import.js:
+  module: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.'
+test/language/module-code/instn-resolve-err-reference.js:
+  module: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.'
</ins><span class="cx"> test/language/module-code/instn-resolve-order-depth.js:
</span><span class="cx">   module: "SyntaxError: 'break' is only valid inside a switch or loop statement."
</span><span class="cx"> test/language/module-code/instn-resolve-order-src.js:
</span><del>-  module: "SyntaxError: 'break' is only valid inside a switch or loop statement."
</del><ins>+  module: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.'
</ins><span class="cx"> test/language/module-code/instn-star-as-props-dflt-skip.js:
</span><span class="cx">   module: "SyntaxError: Unexpected identifier 'as'. Expected 'from' before exported module name."
</span><span class="cx"> test/language/module-code/instn-star-props-nrml.js:
</span><span class="lines">@@ -2800,7 +2806,7 @@
</span><span class="cx"> test/language/module-code/parse-err-hoist-lex-gen.js:
</span><span class="cx">   module: 'Test262: This statement should not be evaluated.'
</span><span class="cx"> test/language/module-code/parse-err-reference.js:
</span><del>-  module: 'Test262: This statement should not be evaluated.'
</del><ins>+  module: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.'
</ins><span class="cx"> test/language/statements/class/class-name-ident-await-escaped.js:
</span><span class="cx">   default: "SyntaxError: Unexpected escaped characters in keyword token: 'aw\\u0061it'"
</span><span class="cx">   strict mode: "SyntaxError: Unexpected escaped characters in keyword token: 'aw\\u0061it'"
</span><span class="lines">@@ -3174,17 +3180,17 @@
</span><span class="cx"> test/language/statements/with/let-array-with-newline.js:
</span><span class="cx">   default: 'Test262: This statement should not be evaluated.'
</span><span class="cx"> test/language/types/boolean/S8.3_A2.1.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/types/boolean/S8.3_A2.2.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/types/reference/S8.7.2_A1_T1.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/types/reference/S8.7.2_A1_T2.js:
</span><del>-  default: 'Test262: This statement should not be evaluated.'
-  strict mode: 'Test262: This statement should not be evaluated.'
</del><ins>+  default: 'SyntaxError: Left side of assignment is not a reference.'
+  strict mode: 'SyntaxError: Left side of assignment is not a reference.'
</ins><span class="cx"> test/language/types/reference/put-value-prop-base-primitive-realm.js:
</span><span class="cx">   default: 'Test262Error: number Expected SameValue(«0», Â«1») to be true'
</span><span class="cx">   strict mode: 'Test262Error: number Expected SameValue(«0», Â«1») to be true'
</span></span></pre></div>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/ChangeLog 2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2019-05-16  Ross Kirsling  <ross.kirsling@sony.com>
+
+        [JSC] Invalid AssignmentTargetType should be an early error.
+        https://bugs.webkit.org/show_bug.cgi?id=197603
+
+        Reviewed by Keith Miller.
+
+        * fast/events/window-onerror4-expected.txt:
+        * ietestcenter/Javascript/11.13.1-1-1-expected.txt:
+        * ietestcenter/Javascript/11.13.1-1-2-expected.txt:
+        * ietestcenter/Javascript/11.13.1-1-3-expected.txt:
+        * ietestcenter/Javascript/11.13.1-1-4-expected.txt:
+        * js/basic-strict-mode-expected.txt:
+        * js/dom/assign-expected.txt:
+        * js/dom/line-column-numbers-expected.txt:
+        * js/dom/line-column-numbers.html:
+        * js/dom/postfix-syntax-expected.txt:
+        * js/dom/prefix-syntax-expected.txt:
+        * js/dom/script-tests/line-column-numbers.js:
+        * js/function-toString-parentheses-expected.txt:
+        * js/parser-syntax-check-expected.txt:
+        * js/parser-xml-close-comment-expected.txt:
+        * js/script-tests/function-toString-parentheses.js:
+        * js/script-tests/parser-syntax-check.js:
+        Update tests & expectations to reflect new SyntaxErrors.
+
+        * js/script-tests/toString-prefix-postfix-preserve-parens.js:
+        * js/toString-prefix-postfix-preserve-parens-expected.txt:
+        None of the prefix/postfix tests make sense here now that they're all SyntaxErrors;
+        remove them and just leave the typeof tests.
+
</ins><span class="cx"> 2019-05-16  Youenn Fablet  <youenn@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Layout Test http/wpt/cache-storage/cache-quota-add.any.html is a flaky failure
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventswindowonerror4expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/events/window-onerror4-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/window-onerror4-expected.txt       2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/fast/events/window-onerror4-expected.txt  2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><span class="cx"> You should see a log record if window.onerror is working properly for this test.Bug 8519.
</span><span class="cx"> 
</span><del>-Error caught successfully: ReferenceError: Left side of assignment is not a reference. File: undefined Line: 1 Column: 3 Error: ReferenceError: Left side of assignment is not a reference.
</del><ins>+Error caught successfully: SyntaxError: Left side of assignment is not a reference. File: window-onerror4.html Line: 16 Column: 9 Error: SyntaxError: Left side of assignment is not a reference.
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsietestcenterJavascript1113111expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-1-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-1-expected.txt       2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-1-expected.txt  2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> PASS ES5Harness.preconditionPassed is true
</span><del>-PASS ES5Harness.testPassed is true
</del><ins>+FAIL ES5Harness.testPassed should be true (of type boolean). Was undefined (of type undefined).
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsietestcenterJavascript1113112expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-2-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-2-expected.txt       2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-2-expected.txt  2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> PASS ES5Harness.preconditionPassed is true
</span><del>-PASS ES5Harness.testPassed is true
</del><ins>+FAIL ES5Harness.testPassed should be true (of type boolean). Was undefined (of type undefined).
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsietestcenterJavascript1113113expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-3-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-3-expected.txt       2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-3-expected.txt  2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> PASS ES5Harness.preconditionPassed is true
</span><del>-PASS ES5Harness.testPassed is true
</del><ins>+FAIL ES5Harness.testPassed should be true (of type boolean). Was undefined (of type undefined).
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsietestcenterJavascript1113114expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-4-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-4-expected.txt       2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/ietestcenter/Javascript/11.13.1-1-4-expected.txt  2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> PASS ES5Harness.preconditionPassed is true
</span><del>-PASS ES5Harness.testPassed is true
</del><ins>+FAIL ES5Harness.testPassed should be true (of type boolean). Was undefined (of type undefined).
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsjsbasicstrictmodeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/basic-strict-mode-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/basic-strict-mode-expected.txt      2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/basic-strict-mode-expected.txt 2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -133,17 +133,17 @@
</span><span class="cx"> PASS 'use strict'; function f() { arguments-- } threw exception SyntaxError: 'arguments' cannot be modified in strict mode..
</span><span class="cx"> PASS (function(){'use strict'; function f() { arguments-- }}) threw exception SyntaxError: 'arguments' cannot be modified in strict mode..
</span><span class="cx"> PASS global.eval('"use strict"; if (0) ++arguments; true;') threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
</span><del>-PASS 'use strict'; ++(1, eval) threw exception ReferenceError: Prefix ++ operator applied to value that is not a reference..
</del><ins>+PASS 'use strict'; ++(1, eval) threw exception SyntaxError: Prefix ++ operator applied to value that is not a reference..
</ins><span class="cx"> PASS (function(){'use strict'; ++(1, eval)}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
</span><del>-PASS 'use strict'; ++(1, 2, 3, eval) threw exception ReferenceError: Prefix ++ operator applied to value that is not a reference..
</del><ins>+PASS 'use strict'; ++(1, 2, 3, eval) threw exception SyntaxError: Prefix ++ operator applied to value that is not a reference..
</ins><span class="cx"> PASS (function(){'use strict'; ++(1, 2, 3, eval)}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
</span><del>-PASS 'use strict'; (1, eval)++ threw exception ReferenceError: Postfix ++ operator applied to value that is not a reference..
</del><ins>+PASS 'use strict'; (1, eval)++ threw exception SyntaxError: Postfix ++ operator applied to value that is not a reference..
</ins><span class="cx"> PASS (function(){'use strict'; (1, eval)++}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
</span><del>-PASS 'use strict'; --(1, eval) threw exception ReferenceError: Prefix -- operator applied to value that is not a reference..
</del><ins>+PASS 'use strict'; --(1, eval) threw exception SyntaxError: Prefix -- operator applied to value that is not a reference..
</ins><span class="cx"> PASS (function(){'use strict'; --(1, eval)}) threw exception SyntaxError: Cannot modify 'eval' in strict mode..
</span><del>-PASS 'use strict'; (1, eval)-- threw exception ReferenceError: Postfix -- operator applied to value that is not a reference..
</del><ins>+PASS 'use strict'; (1, eval)-- threw exception SyntaxError: Postfix -- operator applied to value that is not a reference..
</ins><span class="cx"> PASS (function(){'use strict'; (1, eval)--}) threw exception SyntaxError: 'eval' cannot be modified in strict mode..
</span><del>-PASS 'use strict'; (1, 2, 3, eval)-- threw exception ReferenceError: Postfix -- operator applied to value that is not a reference..
</del><ins>+PASS 'use strict'; (1, 2, 3, eval)-- threw exception SyntaxError: Postfix -- operator applied to value that is not a reference..
</ins><span class="cx"> PASS (function(){'use strict'; (1, 2, 3, eval)--}) threw exception SyntaxError: 'eval' cannot be modified in strict mode..
</span><span class="cx"> PASS 'use strict'; function f() { ++(1, arguments) } threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
</span><span class="cx"> PASS (function(){'use strict'; function f() { ++(1, arguments) }}) threw exception SyntaxError: Cannot modify 'arguments' in strict mode..
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomassignexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/assign-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/assign-expected.txt     2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/dom/assign-expected.txt        2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -13,8 +13,8 @@
</span><span class="cx"> PASS ((x)) = 8; x is 8
</span><span class="cx"> PASS ((window.x)) = 9; x is 9
</span><span class="cx"> PASS ((window["x"])) = 10; x is 10
</span><del>-PASS (y, x) = "FAIL"; threw exception ReferenceError: Left side of assignment is not a reference..
-PASS (true ? x : y) = "FAIL"; threw exception ReferenceError: Left side of assignment is not a reference..
</del><ins>+PASS (y, x) = "FAIL"; threw exception SyntaxError: Left side of assignment is not a reference..
+PASS (true ? x : y) = "FAIL"; threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS x++ = "FAIL"; threw exception SyntaxError: Left hand side of operator '=' must be a reference..
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomlinecolumnnumbersexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/line-column-numbers-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/line-column-numbers-expected.txt        2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/dom/line-column-numbers-expected.txt   2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -138,12 +138,12 @@
</span><span class="cx">     19   g at line-column-numbers.html:190:30
</span><span class="cx"> 
</span><span class="cx"> --> Case 21 Stack Trace:
</span><del>-    0   toFuzz21 at line-column-numbers.html:206:26
-    1   global code at line-column-numbers.html:209:13
</del><ins>+    0   eval at [native code]
+    1   global code at line-column-numbers.html:205:9
</ins><span class="cx"> 
</span><span class="cx"> --> Case 22 Stack Trace:
</span><del>-    0   toFuzz22 at line-column-numbers.html:220:36
-    1   global code at line-column-numbers.html:224:13
</del><ins>+    0   toFuzz22 at line-column-numbers.html:221:36
+    1   global code at line-column-numbers.html:225:13
</ins><span class="cx"> 
</span><span class="cx"> --> Case 1 Stack Trace:
</span><span class="cx">     0   global code at line-column-numbers.js:3:26
</span><span class="lines">@@ -280,12 +280,12 @@
</span><span class="cx">     19   g at line-column-numbers.js:127:30
</span><span class="cx"> 
</span><span class="cx"> --> Case 21 Stack Trace:
</span><del>-    0   toFuzz21b at line-column-numbers.js:141:26
-    1   global code at line-column-numbers.js:144:14
</del><ins>+    0   eval at [native code]
+    1   global code at line-column-numbers.js:140:9
</ins><span class="cx"> 
</span><span class="cx"> --> Case 22 Stack Trace:
</span><del>-    0   toFuzz22b at line-column-numbers.js:153:36
-    1   global code at line-column-numbers.js:157:14
</del><ins>+    0   toFuzz22b at line-column-numbers.js:154:36
+    1   global code at line-column-numbers.js:158:14
</ins><span class="cx"> 
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomlinecolumnnumbershtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/line-column-numbers.html (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/line-column-numbers.html        2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/dom/line-column-numbers.html   2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -202,11 +202,12 @@
</span><span class="cx"> <script>testId++;</script>
</span><span class="cx"> <script>
</span><span class="cx"> try {
</span><del>-    function toFuzz21() {
-        if (PriorityQueue.prototype.doSort() instanceof (this ^= function() {
-        })) return 2; 
-    }
-    toFuzz21();
</del><ins>+    eval(
+        "function toFuzz21() {\n" +
+        "    if (PriorityQueue.prototype.doSort() instanceof (this ^= function () {})) return 2;\n" +
+        "}\n" +
+        "toFuzz21();"
+    );
</ins><span class="cx"> } catch(e) {
</span><span class="cx">     printStack(e.stack);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkLayoutTestsjsdompostfixsyntaxexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/postfix-syntax-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/postfix-syntax-expected.txt     2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/dom/postfix-syntax-expected.txt        2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -13,8 +13,8 @@
</span><span class="cx"> PASS ((x))++ is 7
</span><span class="cx"> PASS ((window.x))++ is 8
</span><span class="cx"> PASS ((window["x"]))++ is 9
</span><del>-PASS (y, x)++ threw exception ReferenceError: Postfix ++ operator applied to value that is not a reference..
-PASS (true ? x : y)++ threw exception ReferenceError: Postfix ++ operator applied to value that is not a reference..
</del><ins>+PASS (y, x)++ threw exception SyntaxError: Postfix ++ operator applied to value that is not a reference..
+PASS (true ? x : y)++ threw exception SyntaxError: Postfix ++ operator applied to value that is not a reference..
</ins><span class="cx"> PASS x++++ threw exception SyntaxError: Unexpected token '++'.
</span><span class="cx"> PASS x is 0
</span><span class="cx"> PASS y is 0
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomprefixsyntaxexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/prefix-syntax-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/prefix-syntax-expected.txt      2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/dom/prefix-syntax-expected.txt 2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -13,9 +13,9 @@
</span><span class="cx"> PASS ++((x)) is 8
</span><span class="cx"> PASS ++((window.x)) is 9
</span><span class="cx"> PASS ++((window["x"])) is 10
</span><del>-PASS ++(y, x) threw exception ReferenceError: Prefix ++ operator applied to value that is not a reference..
-PASS ++(true ? x : y) threw exception ReferenceError: Prefix ++ operator applied to value that is not a reference..
-PASS ++++x threw exception ReferenceError: Prefix ++ operator applied to value that is not a reference..
</del><ins>+PASS ++(y, x) threw exception SyntaxError: Prefix ++ operator applied to value that is not a reference..
+PASS ++(true ? x : y) threw exception SyntaxError: Prefix ++ operator applied to value that is not a reference..
+PASS ++++x threw exception SyntaxError: The prefix-increment operator requires a reference expression..
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomscripttestslinecolumnnumbersjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/script-tests/line-column-numbers.js (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/script-tests/line-column-numbers.js     2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/dom/script-tests/line-column-numbers.js        2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -137,11 +137,12 @@
</span><span class="cx"> // Case 21: Regression test from https://bugs.webkit.org/show_bug.cgi?id=118662
</span><span class="cx"> testId++;
</span><span class="cx"> try {
</span><del>-    function toFuzz21b() {
-        if (PriorityQueue.prototype.doSort() instanceof (this ^= function() {
-        })) return 2; 
-    }
-    toFuzz21b();
</del><ins>+    eval(
+        "function toFuzz21() {\n" +
+        "    if (PriorityQueue.prototype.doSort() instanceof (this ^= function () {})) return 2;\n" +
+        "}\n" +
+        "toFuzz21();"
+    );
</ins><span class="cx"> } catch(e) {
</span><span class="cx">     printStack(e.stack);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkLayoutTestsjsfunctiontoStringparenthesesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/function-toString-parentheses-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/function-toString-parentheses-expected.txt  2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/function-toString-parentheses-expected.txt     2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -217,7 +217,7 @@
</span><span class="cx"> PASS compileAndSerialize('(a = b) + c') is '(a = b) + c'
</span><span class="cx"> PASS compileAndSerialize('a = (b + c)') is 'a = (b + c)'
</span><span class="cx"> PASS compileAndSerialize('a + b = c') threw exception SyntaxError: Left hand side of operator '=' must be a reference..
</span><del>-PASS compileAndSerialize('(a + b) = c') is '(a + b) = c'
</del><ins>+PASS compileAndSerialize('(a + b) = c') threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('a + (b = c)') is 'a + (b = c)'
</span><span class="cx"> PASS compileAndSerialize('a *= b *= c') is 'a *= b *= c'
</span><span class="cx"> PASS compileAndSerialize('(a *= b) *= c') is '(a *= b) *= c'
</span><span class="lines">@@ -229,7 +229,7 @@
</span><span class="cx"> PASS compileAndSerialize('(a *= b) + c') is '(a *= b) + c'
</span><span class="cx"> PASS compileAndSerialize('a *= (b + c)') is 'a *= (b + c)'
</span><span class="cx"> PASS compileAndSerialize('a + b *= c') threw exception SyntaxError: Left hand side of operator '*=' must be a reference..
</span><del>-PASS compileAndSerialize('(a + b) *= c') is '(a + b) *= c'
</del><ins>+PASS compileAndSerialize('(a + b) *= c') threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('a + (b *= c)') is 'a + (b *= c)'
</span><span class="cx"> PASS compileAndSerialize('a /= b /= c') is 'a /= b /= c'
</span><span class="cx"> PASS compileAndSerialize('(a /= b) /= c') is '(a /= b) /= c'
</span><span class="lines">@@ -241,7 +241,7 @@
</span><span class="cx"> PASS compileAndSerialize('(a /= b) + c') is '(a /= b) + c'
</span><span class="cx"> PASS compileAndSerialize('a /= (b + c)') is 'a /= (b + c)'
</span><span class="cx"> PASS compileAndSerialize('a + b /= c') threw exception SyntaxError: Left hand side of operator '/=' must be a reference..
</span><del>-PASS compileAndSerialize('(a + b) /= c') is '(a + b) /= c'
</del><ins>+PASS compileAndSerialize('(a + b) /= c') threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('a + (b /= c)') is 'a + (b /= c)'
</span><span class="cx"> PASS compileAndSerialize('a %= b %= c') is 'a %= b %= c'
</span><span class="cx"> PASS compileAndSerialize('(a %= b) %= c') is '(a %= b) %= c'
</span><span class="lines">@@ -253,7 +253,7 @@
</span><span class="cx"> PASS compileAndSerialize('(a %= b) + c') is '(a %= b) + c'
</span><span class="cx"> PASS compileAndSerialize('a %= (b + c)') is 'a %= (b + c)'
</span><span class="cx"> PASS compileAndSerialize('a + b %= c') threw exception SyntaxError: Left hand side of operator '%=' must be a reference..
</span><del>-PASS compileAndSerialize('(a + b) %= c') is '(a + b) %= c'
</del><ins>+PASS compileAndSerialize('(a + b) %= c') threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('a + (b %= c)') is 'a + (b %= c)'
</span><span class="cx"> PASS compileAndSerialize('a += b += c') is 'a += b += c'
</span><span class="cx"> PASS compileAndSerialize('(a += b) += c') is '(a += b) += c'
</span><span class="lines">@@ -265,7 +265,7 @@
</span><span class="cx"> PASS compileAndSerialize('(a += b) + c') is '(a += b) + c'
</span><span class="cx"> PASS compileAndSerialize('a += (b + c)') is 'a += (b + c)'
</span><span class="cx"> PASS compileAndSerialize('a + b += c') threw exception SyntaxError: Left hand side of operator '+=' must be a reference..
</span><del>-PASS compileAndSerialize('(a + b) += c') is '(a + b) += c'
</del><ins>+PASS compileAndSerialize('(a + b) += c') threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('a + (b += c)') is 'a + (b += c)'
</span><span class="cx"> PASS compileAndSerialize('a -= b -= c') is 'a -= b -= c'
</span><span class="cx"> PASS compileAndSerialize('(a -= b) -= c') is '(a -= b) -= c'
</span><span class="lines">@@ -277,7 +277,7 @@
</span><span class="cx"> PASS compileAndSerialize('(a -= b) + c') is '(a -= b) + c'
</span><span class="cx"> PASS compileAndSerialize('a -= (b + c)') is 'a -= (b + c)'
</span><span class="cx"> PASS compileAndSerialize('a + b -= c') threw exception SyntaxError: Left hand side of operator '-=' must be a reference..
</span><del>-PASS compileAndSerialize('(a + b) -= c') is '(a + b) -= c'
</del><ins>+PASS compileAndSerialize('(a + b) -= c') threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('a + (b -= c)') is 'a + (b -= c)'
</span><span class="cx"> PASS compileAndSerialize('a <<= b <<= c') is 'a <<= b <<= c'
</span><span class="cx"> PASS compileAndSerialize('(a <<= b) <<= c') is '(a <<= b) <<= c'
</span><span class="lines">@@ -289,7 +289,7 @@
</span><span class="cx"> PASS compileAndSerialize('(a <<= b) + c') is '(a <<= b) + c'
</span><span class="cx"> PASS compileAndSerialize('a <<= (b + c)') is 'a <<= (b + c)'
</span><span class="cx"> PASS compileAndSerialize('a + b <<= c') threw exception SyntaxError: Left hand side of operator '<<=' must be a reference..
</span><del>-PASS compileAndSerialize('(a + b) <<= c') is '(a + b) <<= c'
</del><ins>+PASS compileAndSerialize('(a + b) <<= c') threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('a + (b <<= c)') is 'a + (b <<= c)'
</span><span class="cx"> PASS compileAndSerialize('a >>= b >>= c') is 'a >>= b >>= c'
</span><span class="cx"> PASS compileAndSerialize('(a >>= b) >>= c') is '(a >>= b) >>= c'
</span><span class="lines">@@ -301,7 +301,7 @@
</span><span class="cx"> PASS compileAndSerialize('(a >>= b) + c') is '(a >>= b) + c'
</span><span class="cx"> PASS compileAndSerialize('a >>= (b + c)') is 'a >>= (b + c)'
</span><span class="cx"> PASS compileAndSerialize('a + b >>= c') threw exception SyntaxError: Left hand side of operator '>>=' must be a reference..
</span><del>-PASS compileAndSerialize('(a + b) >>= c') is '(a + b) >>= c'
</del><ins>+PASS compileAndSerialize('(a + b) >>= c') threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('a + (b >>= c)') is 'a + (b >>= c)'
</span><span class="cx"> PASS compileAndSerialize('a >>>= b >>>= c') is 'a >>>= b >>>= c'
</span><span class="cx"> PASS compileAndSerialize('(a >>>= b) >>>= c') is '(a >>>= b) >>>= c'
</span><span class="lines">@@ -313,7 +313,7 @@
</span><span class="cx"> PASS compileAndSerialize('(a >>>= b) + c') is '(a >>>= b) + c'
</span><span class="cx"> PASS compileAndSerialize('a >>>= (b + c)') is 'a >>>= (b + c)'
</span><span class="cx"> PASS compileAndSerialize('a + b >>>= c') threw exception SyntaxError: Left hand side of operator '>>>=' must be a reference..
</span><del>-PASS compileAndSerialize('(a + b) >>>= c') is '(a + b) >>>= c'
</del><ins>+PASS compileAndSerialize('(a + b) >>>= c') threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('a + (b >>>= c)') is 'a + (b >>>= c)'
</span><span class="cx"> PASS compileAndSerialize('a &= b &= c') is 'a &= b &= c'
</span><span class="cx"> PASS compileAndSerialize('(a &= b) &= c') is '(a &= b) &= c'
</span><span class="lines">@@ -325,7 +325,7 @@
</span><span class="cx"> PASS compileAndSerialize('(a &= b) + c') is '(a &= b) + c'
</span><span class="cx"> PASS compileAndSerialize('a &= (b + c)') is 'a &= (b + c)'
</span><span class="cx"> PASS compileAndSerialize('a + b &= c') threw exception SyntaxError: Left hand side of operator '&=' must be a reference..
</span><del>-PASS compileAndSerialize('(a + b) &= c') is '(a + b) &= c'
</del><ins>+PASS compileAndSerialize('(a + b) &= c') threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('a + (b &= c)') is 'a + (b &= c)'
</span><span class="cx"> PASS compileAndSerialize('a ^= b ^= c') is 'a ^= b ^= c'
</span><span class="cx"> PASS compileAndSerialize('(a ^= b) ^= c') is '(a ^= b) ^= c'
</span><span class="lines">@@ -337,7 +337,7 @@
</span><span class="cx"> PASS compileAndSerialize('(a ^= b) + c') is '(a ^= b) + c'
</span><span class="cx"> PASS compileAndSerialize('a ^= (b + c)') is 'a ^= (b + c)'
</span><span class="cx"> PASS compileAndSerialize('a + b ^= c') threw exception SyntaxError: Left hand side of operator '^=' must be a reference..
</span><del>-PASS compileAndSerialize('(a + b) ^= c') is '(a + b) ^= c'
</del><ins>+PASS compileAndSerialize('(a + b) ^= c') threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('a + (b ^= c)') is 'a + (b ^= c)'
</span><span class="cx"> PASS compileAndSerialize('a |= b |= c') is 'a |= b |= c'
</span><span class="cx"> PASS compileAndSerialize('(a |= b) |= c') is '(a |= b) |= c'
</span><span class="lines">@@ -349,7 +349,7 @@
</span><span class="cx"> PASS compileAndSerialize('(a |= b) + c') is '(a |= b) + c'
</span><span class="cx"> PASS compileAndSerialize('a |= (b + c)') is 'a |= (b + c)'
</span><span class="cx"> PASS compileAndSerialize('a + b |= c') threw exception SyntaxError: Left hand side of operator '|=' must be a reference..
</span><del>-PASS compileAndSerialize('(a + b) |= c') is '(a + b) |= c'
</del><ins>+PASS compileAndSerialize('(a + b) |= c') threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('a + (b |= c)') is 'a + (b |= c)'
</span><span class="cx"> PASS compileAndSerialize('delete a + b') is 'delete a + b'
</span><span class="cx"> PASS compileAndSerialize('(delete a) + b') is '(delete a) + b'
</span><span class="lines">@@ -368,12 +368,12 @@
</span><span class="cx"> PASS compileAndSerialize('!(typeof a)') is '!(typeof a)'
</span><span class="cx"> PASS compileAndSerialize('++a + b') is '++a + b'
</span><span class="cx"> PASS compileAndSerialize('(++a) + b') is '(++a) + b'
</span><del>-PASS compileAndSerialize('++(a + b)') is '++(a + b)'
</del><ins>+PASS compileAndSerialize('++(a + b)') threw exception SyntaxError: Prefix ++ operator applied to value that is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('!++a') is '!++a'
</span><span class="cx"> PASS compileAndSerialize('!(++a)') is '!(++a)'
</span><span class="cx"> PASS compileAndSerialize('--a + b') is '--a + b'
</span><span class="cx"> PASS compileAndSerialize('(--a) + b') is '(--a) + b'
</span><del>-PASS compileAndSerialize('--(a + b)') is '--(a + b)'
</del><ins>+PASS compileAndSerialize('--(a + b)') threw exception SyntaxError: Prefix -- operator applied to value that is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('!--a') is '!--a'
</span><span class="cx"> PASS compileAndSerialize('!(--a)') is '!(--a)'
</span><span class="cx"> PASS compileAndSerialize('+ a + b') is '+ a + b'
</span><span class="lines">@@ -398,10 +398,10 @@
</span><span class="cx"> PASS compileAndSerialize('!(!a)') is '!(!a)'
</span><span class="cx"> PASS compileAndSerialize('!a++') is '!a++'
</span><span class="cx"> PASS compileAndSerialize('!(a++)') is '!(a++)'
</span><del>-PASS compileAndSerialize('(!a)++') is '(!a)++'
</del><ins>+PASS compileAndSerialize('(!a)++') threw exception SyntaxError: Postfix ++ operator applied to value that is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('!a--') is '!a--'
</span><span class="cx"> PASS compileAndSerialize('!(a--)') is '!(a--)'
</span><del>-PASS compileAndSerialize('(!a)--') is '(!a)--'
</del><ins>+PASS compileAndSerialize('(!a)--') threw exception SyntaxError: Postfix -- operator applied to value that is not a reference..
</ins><span class="cx"> PASS compileAndSerialize('(-1)[a]') is '(-1)[a]'
</span><span class="cx"> PASS compileAndSerialize('(-1)[a] = b') is '(-1)[a] = b'
</span><span class="cx"> PASS compileAndSerialize('(-1)[a] += b') is '(-1)[a] += b'
</span><span class="lines">@@ -441,42 +441,42 @@
</span><span class="cx"> PASS compileAndSerialize('(1).a++') is '(1).a++'
</span><span class="cx"> PASS compileAndSerialize('++(1).a') is '++(1).a'
</span><span class="cx"> PASS compileAndSerialize('(1).a()') is '(1).a()'
</span><del>-PASS compileAndSerialize('(-1) = a') is '(-1) = a'
-PASS compileAndSerialize('(- 0) = a') is '(- 0) = a'
-PASS compileAndSerialize('1 = a') is '1 = a'
-PASS compileAndSerialize('(-1) *= a') is '(-1) *= a'
-PASS compileAndSerialize('(- 0) *= a') is '(- 0) *= a'
-PASS compileAndSerialize('1 *= a') is '1 *= a'
-PASS compileAndSerialize('(-1) /= a') is '(-1) /= a'
-PASS compileAndSerialize('(- 0) /= a') is '(- 0) /= a'
-PASS compileAndSerialize('1 /= a') is '1 /= a'
-PASS compileAndSerialize('(-1) %= a') is '(-1) %= a'
-PASS compileAndSerialize('(- 0) %= a') is '(- 0) %= a'
-PASS compileAndSerialize('1 %= a') is '1 %= a'
-PASS compileAndSerialize('(-1) += a') is '(-1) += a'
-PASS compileAndSerialize('(- 0) += a') is '(- 0) += a'
-PASS compileAndSerialize('1 += a') is '1 += a'
-PASS compileAndSerialize('(-1) -= a') is '(-1) -= a'
-PASS compileAndSerialize('(- 0) -= a') is '(- 0) -= a'
-PASS compileAndSerialize('1 -= a') is '1 -= a'
-PASS compileAndSerialize('(-1) <<= a') is '(-1) <<= a'
-PASS compileAndSerialize('(- 0) <<= a') is '(- 0) <<= a'
-PASS compileAndSerialize('1 <<= a') is '1 <<= a'
-PASS compileAndSerialize('(-1) >>= a') is '(-1) >>= a'
-PASS compileAndSerialize('(- 0) >>= a') is '(- 0) >>= a'
-PASS compileAndSerialize('1 >>= a') is '1 >>= a'
-PASS compileAndSerialize('(-1) >>>= a') is '(-1) >>>= a'
-PASS compileAndSerialize('(- 0) >>>= a') is '(- 0) >>>= a'
-PASS compileAndSerialize('1 >>>= a') is '1 >>>= a'
-PASS compileAndSerialize('(-1) &= a') is '(-1) &= a'
-PASS compileAndSerialize('(- 0) &= a') is '(- 0) &= a'
-PASS compileAndSerialize('1 &= a') is '1 &= a'
-PASS compileAndSerialize('(-1) ^= a') is '(-1) ^= a'
-PASS compileAndSerialize('(- 0) ^= a') is '(- 0) ^= a'
-PASS compileAndSerialize('1 ^= a') is '1 ^= a'
-PASS compileAndSerialize('(-1) |= a') is '(-1) |= a'
-PASS compileAndSerialize('(- 0) |= a') is '(- 0) |= a'
-PASS compileAndSerialize('1 |= a') is '1 |= a'
</del><ins>+PASS compileAndSerialize('(-1) = a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(- 0) = a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('1 = a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(-1) *= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(- 0) *= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('1 *= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(-1) /= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(- 0) /= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('1 /= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(-1) %= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(- 0) %= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('1 %= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(-1) += a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(- 0) += a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('1 += a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(-1) -= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(- 0) -= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('1 -= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(-1) <<= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(- 0) <<= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('1 <<= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(-1) >>= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(- 0) >>= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('1 >>= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(-1) >>>= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(- 0) >>>= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('1 >>>= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(-1) &= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(- 0) &= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('1 &= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(-1) ^= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(- 0) ^= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('1 ^= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(-1) |= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('(- 0) |= a') threw exception SyntaxError: Left side of assignment is not a reference..
+PASS compileAndSerialize('1 |= a') threw exception SyntaxError: Left side of assignment is not a reference..
</ins><span class="cx"> PASS compileAndSerializeLeftmostTest('({ }).x') is '({ }).x'
</span><span class="cx"> PASS compileAndSerializeLeftmostTest('x = { }') is 'x = { }'
</span><span class="cx"> PASS compileAndSerializeLeftmostTest('(function () { })()') is '(function () { })()'
</span></span></pre></div>
<a id="trunkLayoutTestsjsparsersyntaxcheckexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/parser-syntax-check-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/parser-syntax-check-expected.txt    2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/parser-syntax-check-expected.txt       2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -24,20 +24,20 @@
</span><span class="cx"> PASS Invalid: "function f() { new -a }". Produced the following syntax error: "SyntaxError: Unexpected token '-'"
</span><span class="cx"> PASS Valid:   "new (-1)" with TypeError
</span><span class="cx"> PASS Valid:   "function f() { new (-1) }"
</span><del>-PASS Valid:   "a: b: c: new f(x++)++" with ReferenceError
-PASS Valid:   "function f() { a: b: c: new f(x++)++ }"
</del><ins>+PASS Invalid: "a: b: c: new f(x++)++". Produced the following syntax error: "SyntaxError: Postfix ++ operator applied to value that is not a reference."
+PASS Invalid: "function f() { a: b: c: new f(x++)++ }". Produced the following syntax error: "SyntaxError: Postfix ++ operator applied to value that is not a reference."
</ins><span class="cx"> PASS Valid:   "(a)++" with ReferenceError
</span><span class="cx"> PASS Valid:   "function f() { (a)++ }"
</span><del>-PASS Valid:   "(1--).x" with ReferenceError
-PASS Valid:   "function f() { (1--).x }"
</del><ins>+PASS Invalid: "(1--).x". Produced the following syntax error: "SyntaxError: Postfix -- operator applied to value that is not a reference."
+PASS Invalid: "function f() { (1--).x }". Produced the following syntax error: "SyntaxError: Postfix -- operator applied to value that is not a reference."
</ins><span class="cx"> PASS Invalid: "a-- ++". Produced the following syntax error: "SyntaxError: Unexpected token '++'"
</span><span class="cx"> PASS Invalid: "function f() { a-- ++ }". Produced the following syntax error: "SyntaxError: Unexpected token '++'"
</span><span class="cx"> PASS Invalid: "(a:) --b". Produced the following syntax error: "SyntaxError: Unexpected token ':'. Expected ')' to end a compound expression."
</span><span class="cx"> PASS Invalid: "function f() { (a:) --b }". Produced the following syntax error: "SyntaxError: Unexpected token ':'. Expected ')' to end a compound expression."
</span><del>-PASS Valid:   "++ -- ++ a" with ReferenceError
-PASS Valid:   "function f() { ++ -- ++ a }"
-PASS Valid:   "++ new new a ++" with ReferenceError
-PASS Valid:   "function f() { ++ new new a ++ }"
</del><ins>+PASS Invalid: "++ -- ++ a". Produced the following syntax error: "SyntaxError: The prefix-increment operator requires a reference expression."
+PASS Invalid: "function f() { ++ -- ++ a }". Produced the following syntax error: "SyntaxError: The prefix-increment operator requires a reference expression."
+PASS Invalid: "++ new new a ++". Produced the following syntax error: "SyntaxError: Prefix ++ operator applied to value that is not a reference."
+PASS Invalid: "function f() { ++ new new a ++ }". Produced the following syntax error: "SyntaxError: Prefix ++ operator applied to value that is not a reference."
</ins><span class="cx"> PASS Valid:   "delete void 0"
</span><span class="cx"> PASS Valid:   "function f() { delete void 0 }"
</span><span class="cx"> PASS Invalid: "delete the void". Produced the following syntax error: "SyntaxError: Unexpected keyword 'void'. Parse error."
</span><span class="lines">@@ -44,12 +44,12 @@
</span><span class="cx"> PASS Invalid: "function f() { delete the void }". Produced the following syntax error: "SyntaxError: Unexpected keyword 'void'. Parse error."
</span><span class="cx"> PASS Invalid: "(a++". Produced the following syntax error: "SyntaxError: Unexpected end of script"
</span><span class="cx"> PASS Invalid: "function f() { (a++ }". Produced the following syntax error: "SyntaxError: Unexpected token '}'. Expected ')' to end a compound expression."
</span><del>-PASS Valid:   "++a--" with ReferenceError
-PASS Valid:   "function f() { ++a-- }"
-PASS Valid:   "++((a))--" with ReferenceError
-PASS Valid:   "function f() { ++((a))-- }"
-PASS Valid:   "(a.x++)++" with ReferenceError
-PASS Valid:   "function f() { (a.x++)++ }"
</del><ins>+PASS Invalid: "++a--". Produced the following syntax error: "SyntaxError: The increment operator requires a reference expression."
+PASS Invalid: "function f() { ++a-- }". Produced the following syntax error: "SyntaxError: The increment operator requires a reference expression."
+PASS Invalid: "++((a))--". Produced the following syntax error: "SyntaxError: The increment operator requires a reference expression."
+PASS Invalid: "function f() { ++((a))-- }". Produced the following syntax error: "SyntaxError: The increment operator requires a reference expression."
+PASS Invalid: "(a.x++)++". Produced the following syntax error: "SyntaxError: Postfix ++ operator applied to value that is not a reference."
+PASS Invalid: "function f() { (a.x++)++ }". Produced the following syntax error: "SyntaxError: Postfix ++ operator applied to value that is not a reference."
</ins><span class="cx"> PASS Invalid: "1: null". Produced the following syntax error: "SyntaxError: Unexpected token ':'. Parse error."
</span><span class="cx"> PASS Invalid: "function f() { 1: null }". Produced the following syntax error: "SyntaxError: Unexpected token ':'. Parse error."
</span><span class="cx"> PASS Invalid: "+-!~". Produced the following syntax error: "SyntaxError: Unexpected end of script"
</span><span class="lines">@@ -110,8 +110,8 @@
</span><span class="cx"> PASS Valid:   "function f() { - - true % 5 }"
</span><span class="cx"> PASS Invalid: "- false = 3". Produced the following syntax error: "SyntaxError: Left hand side of operator '=' must be a reference."
</span><span class="cx"> PASS Invalid: "function f() { - false = 3 }". Produced the following syntax error: "SyntaxError: Left hand side of operator '=' must be a reference."
</span><del>-PASS Valid:   "a: b: c: (1 + null) = 3" with ReferenceError
-PASS Valid:   "function f() { a: b: c: (1 + null) = 3 }"
</del><ins>+PASS Invalid: "a: b: c: (1 + null) = 3". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
+PASS Invalid: "function f() { a: b: c: (1 + null) = 3 }". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
</ins><span class="cx"> PASS Valid:   "a[2] = b.l += c /= 4 * 7 ^ !6" with ReferenceError
</span><span class="cx"> PASS Valid:   "function f() { a[2] = b.l += c /= 4 * 7 ^ !6 }"
</span><span class="cx"> PASS Invalid: "a + typeof b += c in d". Produced the following syntax error: "SyntaxError: Left hand side of operator '+=' must be a reference."
</span><span class="lines">@@ -118,8 +118,8 @@
</span><span class="cx"> PASS Invalid: "function f() { a + typeof b += c in d }". Produced the following syntax error: "SyntaxError: Left hand side of operator '+=' must be a reference."
</span><span class="cx"> PASS Invalid: "typeof a &= typeof b". Produced the following syntax error: "SyntaxError: Left hand side of operator '&=' must be a reference."
</span><span class="cx"> PASS Invalid: "function f() { typeof a &= typeof b }". Produced the following syntax error: "SyntaxError: Left hand side of operator '&=' must be a reference."
</span><del>-PASS Valid:   "a: ((typeof (a))) >>>= a || b.l && c" with ReferenceError
-PASS Valid:   "function f() { a: ((typeof (a))) >>>= a || b.l && c }"
</del><ins>+PASS Invalid: "a: ((typeof (a))) >>>= a || b.l && c". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
+PASS Invalid: "function f() { a: ((typeof (a))) >>>= a || b.l && c }". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
</ins><span class="cx"> PASS Valid:   "a: b: c[a /= f[a %= b]].l[c[x] = 7] -= a ? b <<= f : g" with ReferenceError
</span><span class="cx"> PASS Valid:   "function f() { a: b: c[a /= f[a %= b]].l[c[x] = 7] -= a ? b <<= f : g }"
</span><span class="cx"> PASS Valid:   "-void+x['y'].l == x.l != 5 - f[7]" with ReferenceError
</span><span class="lines">@@ -127,8 +127,8 @@
</span><span class="cx"> Function calls (and new with arguments)
</span><span class="cx"> PASS Valid:   "a()()()" with ReferenceError
</span><span class="cx"> PASS Valid:   "function f() { a()()() }"
</span><del>-PASS Valid:   "s: l: a[2](4 == 6, 5 = 6)(f[4], 6)" with ReferenceError
-PASS Valid:   "function f() { s: l: a[2](4 == 6, 5 = 6)(f[4], 6) }"
</del><ins>+PASS Invalid: "s: l: a[2](4 == 6, 5 = 6)(f[4], 6)". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
+PASS Invalid: "function f() { s: l: a[2](4 == 6, 5 = 6)(f[4], 6) }". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
</ins><span class="cx"> PASS Valid:   "s: eval(a.apply(), b.call(c[5] - f[7]))" with ReferenceError
</span><span class="cx"> PASS Valid:   "function f() { s: eval(a.apply(), b.call(c[5] - f[7])) }"
</span><span class="cx"> PASS Invalid: "a(". Produced the following syntax error: "SyntaxError: Unexpected end of script"
</span><span class="lines">@@ -357,8 +357,8 @@
</span><span class="cx"> PASS Valid:   "function f() { const  a = void 7 - typeof 8, b = 8 }"
</span><span class="cx"> PASS Invalid: "const a, a, a = void 7 - typeof 8, a = 8". Produced the following syntax error: "SyntaxError: Unexpected token ','. const declared variable 'a' must have an initializer."
</span><span class="cx"> PASS Invalid: "function f() { const a, a, a = void 7 - typeof 8, a = 8 }". Produced the following syntax error: "SyntaxError: Unexpected token ','. const declared variable 'a' must have an initializer."
</span><del>-PASS Valid:   "const x_x = 6 /= 7 ? e : f" with ReferenceError
-PASS Valid:   "function f() { const x_x = 6 /= 7 ? e : f }"
</del><ins>+PASS Invalid: "const x_x = 6 /= 7 ? e : f". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
+PASS Invalid: "function f() { const x_x = 6 /= 7 ? e : f }". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
</ins><span class="cx"> PASS Invalid: "var a = ?". Produced the following syntax error: "SyntaxError: Unexpected token '?'"
</span><span class="cx"> PASS Invalid: "function f() { var a = ? }". Produced the following syntax error: "SyntaxError: Unexpected token '?'"
</span><span class="cx"> PASS Invalid: "const a = *7". Produced the following syntax error: "SyntaxError: Unexpected token '*'"
</span><span class="lines">@@ -504,8 +504,8 @@
</span><span class="cx"> PASS Valid:   "function f() { for ((a ? b : c) in c) break }"
</span><span class="cx"> PASS Valid:   "for (var a in b in c) break" with ReferenceError
</span><span class="cx"> PASS Valid:   "function f() { for (var a in b in c) break }"
</span><del>-PASS Valid:   "for (var a = 5 += 6 in b) break" with ReferenceError
-PASS Valid:   "function f() { for (var a = 5 += 6 in b) break }"
</del><ins>+PASS Invalid: "for (var a = 5 += 6 in b) break". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
+PASS Invalid: "function f() { for (var a = 5 += 6 in b) break }". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
</ins><span class="cx"> PASS Valid:   "for (var a = foo('should be hit') in b) break" with ReferenceError
</span><span class="cx"> PASS Valid:   "function f() { for (var a = foo('should be hit') in b) break }"
</span><span class="cx"> PASS Invalid: "for (var a += 5 in b) break". Produced the following syntax error: "SyntaxError: Unexpected token '+='. Expected either 'in' or 'of' in enumeration syntax."
</span><span class="lines">@@ -524,8 +524,8 @@
</span><span class="cx"> PASS Invalid: "function f() { for (var a = (b in c in d) break }". Produced the following syntax error: "SyntaxError: Unexpected keyword 'break'. Expected either 'in' or 'of' in enumeration syntax."
</span><span class="cx"> PASS Invalid: "for (var (a) in b) { }". Produced the following syntax error: "SyntaxError: Unexpected token '('. Expected a parameter pattern or a ')' in parameter list."
</span><span class="cx"> PASS Invalid: "function f() { for (var (a) in b) { } }". Produced the following syntax error: "SyntaxError: Unexpected token '('. Expected a parameter pattern or a ')' in parameter list."
</span><del>-PASS Valid:   "for (var a = 7, b = c < d >= d ; f()[6]++ ; --i()[1]++ ) {}" with ReferenceError
-PASS Valid:   "function f() { for (var a = 7, b = c < d >= d ; f()[6]++ ; --i()[1]++ ) {} }"
</del><ins>+PASS Invalid: "for (var a = 7, b = c < d >= d ; f()[6]++ ; --i()[1]++ ) {}". Produced the following syntax error: "SyntaxError: The decrement operator requires a reference expression."
+PASS Invalid: "function f() { for (var a = 7, b = c < d >= d ; f()[6]++ ; --i()[1]++ ) {} }". Produced the following syntax error: "SyntaxError: The decrement operator requires a reference expression."
</ins><span class="cx"> PASS Invalid: "for (var {a} = 20 in b) { }". Produced the following syntax error: "SyntaxError: Cannot assign to the loop variable inside a for-in loop header."
</span><span class="cx"> PASS Invalid: "function f() { for (var {a} = 20 in b) { } }". Produced the following syntax error: "SyntaxError: Cannot assign to the loop variable inside a for-in loop header."
</span><span class="cx"> PASS Invalid: "for (var {a} = 20 of b) { }". Produced the following syntax error: "SyntaxError: Cannot assign to the loop variable inside a for-of loop header."
</span><span class="lines">@@ -878,8 +878,8 @@
</span><span class="cx"> PASS Valid:   "function f() { if (0) obj.foo\u03bb;  }"
</span><span class="cx"> PASS Valid:   "if (0) new a(b+c).d = 5"
</span><span class="cx"> PASS Valid:   "function f() { if (0) new a(b+c).d = 5 }"
</span><del>-PASS Valid:   "if (0) new a(b+c) = 5"
-PASS Valid:   "function f() { if (0) new a(b+c) = 5 }"
</del><ins>+PASS Invalid: "if (0) new a(b+c) = 5". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
+PASS Invalid: "function f() { if (0) new a(b+c) = 5 }". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
</ins><span class="cx"> PASS Valid:   "([1 || 1].a = 1)"
</span><span class="cx"> PASS Valid:   "function f() { ([1 || 1].a = 1) }"
</span><span class="cx"> PASS Valid:   "({a: 1 || 1}.a = 1)"
</span><span class="lines">@@ -1043,14 +1043,14 @@
</span><span class="cx"> PASS Valid:   "function f() { ({a}=1)() }"
</span><span class="cx"> PASS Valid:   "({a:a}=1)()" with TypeError
</span><span class="cx"> PASS Valid:   "function f() { ({a:a}=1)() }"
</span><del>-PASS Valid:   "({a}=1)=1" with ReferenceError
-PASS Valid:   "function f() { ({a}=1)=1 }"
-PASS Valid:   "({a:a}=1)=1" with ReferenceError
-PASS Valid:   "function f() { ({a:a}=1)=1 }"
-PASS Valid:   "({a}=1=1)" with ReferenceError
-PASS Valid:   "function f() { ({a}=1=1) }"
-PASS Valid:   "({a:a}=1=1)" with ReferenceError
-PASS Valid:   "function f() { ({a:a}=1=1) }"
</del><ins>+PASS Invalid: "({a}=1)=1". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
+PASS Invalid: "function f() { ({a}=1)=1 }". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
+PASS Invalid: "({a:a}=1)=1". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
+PASS Invalid: "function f() { ({a:a}=1)=1 }". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
+PASS Invalid: "({a}=1=1)". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
+PASS Invalid: "function f() { ({a}=1=1) }". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
+PASS Invalid: "({a:a}=1=1)". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
+PASS Invalid: "function f() { ({a:a}=1=1) }". Produced the following syntax error: "SyntaxError: Left side of assignment is not a reference."
</ins><span class="cx"> PASS Invalid: "var {x}". Produced the following syntax error: "SyntaxError: Unexpected end of script"
</span><span class="cx"> PASS Invalid: "function f() { var {x} }". Produced the following syntax error: "SyntaxError: Unexpected token '}'. Expected an initializer in destructuring variable declaration."
</span><span class="cx"> PASS Invalid: "var {x, y}". Produced the following syntax error: "SyntaxError: Unexpected end of script"
</span></span></pre></div>
<a id="trunkLayoutTestsjsparserxmlclosecommentexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/parser-xml-close-comment-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/parser-xml-close-comment-expected.txt       2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/parser-xml-close-comment-expected.txt  2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -3,11 +3,11 @@
</span><span class="cx"> On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-PASS 'should be a syntax error' --> threw exception SyntaxError: Unexpected end of script.
-PASS /**/ 1--> threw exception SyntaxError: Unexpected end of script.
-PASS /**/ 1 --> threw exception SyntaxError: Unexpected end of script.
-PASS 1 /**/--> threw exception SyntaxError: Unexpected end of script.
-PASS 1 /**/ --> threw exception SyntaxError: Unexpected end of script.
</del><ins>+PASS 'should be a syntax error' --> threw exception SyntaxError: Postfix -- operator applied to value that is not a reference..
+PASS /**/ 1--> threw exception SyntaxError: Postfix -- operator applied to value that is not a reference..
+PASS /**/ 1 --> threw exception SyntaxError: Postfix -- operator applied to value that is not a reference..
+PASS 1 /**/--> threw exception SyntaxError: Postfix -- operator applied to value that is not a reference..
+PASS 1 /**/ --> threw exception SyntaxError: Postfix -- operator applied to value that is not a reference..
</ins><span class="cx"> PASS 1/*
</span><span class="cx"> */--> is 1
</span><span class="cx"> PASS 1/*
</span></span></pre></div>
<a id="trunkLayoutTestsjsscripttestsfunctiontoStringparenthesesjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/script-tests/function-toString-parentheses.js (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/script-tests/function-toString-parentheses.js       2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/script-tests/function-toString-parentheses.js  2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -104,7 +104,7 @@
</span><span class="cx">         testRightAssociativeSame("=", op);
</span><span class="cx">     testLowerFirst(op, "+");
</span><span class="cx">     shouldThrow("compileAndSerialize('a + b " + op + " c')");
</span><del>-    testKeepParentheses("(a + b) " + op + " c");
</del><ins>+    shouldThrow("compileAndSerialize('(a + b) " + op + " c')");
</ins><span class="cx">     testKeepParentheses("a + (b " + op + " c)");
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -115,7 +115,10 @@
</span><span class="cx">     var op = prefixOperators[i] + prefixOperatorSpace[i];
</span><span class="cx">     testKeepParentheses("" + op + "a + b");
</span><span class="cx">     testOptionalParentheses("(" + op + "a) + b");
</span><del>-    testKeepParentheses("" + op + "(a + b)");
</del><ins>+    if (prefixOperators[i] !== "++" && prefixOperators[i] !== "--")
+        testKeepParentheses("" + op + "(a + b)");
+    else
+        shouldThrow("compileAndSerialize('" + op + "(a + b)')");
</ins><span class="cx">     testKeepParentheses("!" + op + "a");
</span><span class="cx">     testOptionalParentheses("!(" + op + "a)");
</span><span class="cx"> }
</span><span class="lines">@@ -123,11 +126,11 @@
</span><span class="cx"> 
</span><span class="cx"> testKeepParentheses("!a++");
</span><span class="cx"> testOptionalParentheses("!(a++)");
</span><del>-testKeepParentheses("(!a)++");
</del><ins>+shouldThrow("compileAndSerialize('(!a)++')");
</ins><span class="cx"> 
</span><span class="cx"> testKeepParentheses("!a--");
</span><span class="cx"> testOptionalParentheses("!(a--)");
</span><del>-testKeepParentheses("(!a)--");
</del><ins>+shouldThrow("compileAndSerialize('(!a)--')");
</ins><span class="cx"> 
</span><span class="cx"> testKeepParentheses("(-1)[a]");
</span><span class="cx"> testKeepParentheses("(-1)[a] = b");
</span><span class="lines">@@ -182,9 +185,9 @@
</span><span class="cx"> 
</span><span class="cx"> for (i = 0; i < assignmentOperators.length; ++i) {
</span><span class="cx">     var op = assignmentOperators[i];
</span><del>-    testKeepParentheses("(-1) " + op + " a");
-    testKeepParentheses("(- 0) " + op + " a");
-    testKeepParentheses("1 " + op + " a");
</del><ins>+    shouldThrow("compileAndSerialize('(-1) " + op + " a')");
+    shouldThrow("compileAndSerialize('(- 0) " + op + " a')");
+    shouldThrow("compileAndSerialize('1 " + op + " a')");
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> shouldBe("compileAndSerializeLeftmostTest('({ }).x')", "'({ }).x'");
</span></span></pre></div>
<a id="trunkLayoutTestsjsscripttestsparsersyntaxcheckjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/script-tests/parser-syntax-check.js (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/script-tests/parser-syntax-check.js 2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/script-tests/parser-syntax-check.js    2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -83,19 +83,19 @@
</span><span class="cx"> valid  ("a: +~!new a");
</span><span class="cx"> invalid("new -a");
</span><span class="cx"> valid  ("new (-1)")
</span><del>-valid  ("a: b: c: new f(x++)++")
</del><ins>+invalid("a: b: c: new f(x++)++")
</ins><span class="cx"> valid  ("(a)++");
</span><del>-valid  ("(1--).x");
</del><ins>+invalid("(1--).x");
</ins><span class="cx"> invalid("a-- ++");
</span><span class="cx"> invalid("(a:) --b");
</span><del>-valid  ("++ -- ++ a");
-valid  ("++ new new a ++");
</del><ins>+invalid("++ -- ++ a");
+invalid("++ new new a ++");
</ins><span class="cx"> valid  ("delete void 0");
</span><span class="cx"> invalid("delete the void");
</span><span class="cx"> invalid("(a++");
</span><del>-valid  ("++a--");
-valid  ("++((a))--");
-valid  ("(a.x++)++");
</del><ins>+invalid("++a--");
+invalid("++((a))--");
+invalid("(a.x++)++");
</ins><span class="cx"> invalid("1: null");
</span><span class="cx"> invalid("+-!~");
</span><span class="cx"> invalid("+-!~((");
</span><span class="lines">@@ -131,11 +131,11 @@
</span><span class="cx"> invalid("a in instanceof b.l");
</span><span class="cx"> valid  ("- - true % 5");
</span><span class="cx"> invalid("- false = 3");
</span><del>-valid  ("a: b: c: (1 + null) = 3");
</del><ins>+invalid("a: b: c: (1 + null) = 3");
</ins><span class="cx"> valid  ("a[2] = b.l += c /= 4 * 7 ^ !6");
</span><span class="cx"> invalid("a + typeof b += c in d");
</span><span class="cx"> invalid("typeof a &= typeof b");
</span><del>-valid  ("a: ((typeof (a))) >>>= a || b.l && c");
</del><ins>+invalid("a: ((typeof (a))) >>>= a || b.l && c");
</ins><span class="cx"> valid  ("a: b: c[a /= f[a %= b]].l[c[x] = 7] -= a ? b <<= f : g");
</span><span class="cx"> valid  ("-void+x['y'].l == x.l != 5 - f[7]");
</span><span class="cx"> 
</span><span class="lines">@@ -142,7 +142,7 @@
</span><span class="cx"> debug  ("Function calls (and new with arguments)");
</span><span class="cx"> 
</span><span class="cx"> valid  ("a()()()");
</span><del>-valid  ("s: l: a[2](4 == 6, 5 = 6)(f[4], 6)");
</del><ins>+invalid("s: l: a[2](4 == 6, 5 = 6)(f[4], 6)");
</ins><span class="cx"> valid  ("s: eval(a.apply(), b.call(c[5] - f[7]))");
</span><span class="cx"> invalid("a(");
</span><span class="cx"> invalid("a(5");
</span><span class="lines">@@ -268,7 +268,7 @@
</span><span class="cx"> valid  ("var varr = 3 in 1");
</span><span class="cx"> valid  ("const  a = void 7 - typeof 8, b = 8");
</span><span class="cx"> invalid("const a, a, a = void 7 - typeof 8, a = 8");
</span><del>-valid  ("const x_x = 6 /= 7 ? e : f");
</del><ins>+invalid("const x_x = 6 /= 7 ? e : f");
</ins><span class="cx"> invalid("var a = ?");
</span><span class="cx"> invalid("const a = *7");
</span><span class="cx"> invalid("var a = :)");
</span><span class="lines">@@ -345,7 +345,7 @@
</span><span class="cx"> invalid("for (a ? b : c in c) break");
</span><span class="cx"> valid  ("for ((a ? b : c) in c) break");
</span><span class="cx"> valid  ("for (var a in b in c) break");
</span><del>-valid("for (var a = 5 += 6 in b) break");
</del><ins>+invalid("for (var a = 5 += 6 in b) break");
</ins><span class="cx"> valid("for (var a = foo('should be hit') in b) break");
</span><span class="cx"> invalid("for (var a += 5 in b) break");
</span><span class="cx"> invalid("for (var a = in b) break");
</span><span class="lines">@@ -355,7 +355,7 @@
</span><span class="cx"> valid("for (var a = (b in c) in d) break");
</span><span class="cx"> invalid("for (var a = (b in c in d) break");
</span><span class="cx"> invalid("for (var (a) in b) { }");
</span><del>-valid  ("for (var a = 7, b = c < d >= d ; f()[6]++ ; --i()[1]++ ) {}");
</del><ins>+invalid("for (var a = 7, b = c < d >= d ; f()[6]++ ; --i()[1]++ ) {}");
</ins><span class="cx"> invalid("for (var {a} = 20 in b) { }");
</span><span class="cx"> invalid("for (var {a} = 20 of b) { }");
</span><span class="cx"> invalid("for (var {a} = 20 in b) { }");
</span><span class="lines">@@ -543,7 +543,7 @@
</span><span class="cx"> valid("if (0) obj.foo_; ")
</span><span class="cx"> valid("if (0) obj.foo\\u03bb; ")
</span><span class="cx"> valid("if (0) new a(b+c).d = 5");
</span><del>-valid("if (0) new a(b+c) = 5");
</del><ins>+invalid("if (0) new a(b+c) = 5");
</ins><span class="cx"> valid("([1 || 1].a = 1)");
</span><span class="cx"> valid("({a: 1 || 1}.a = 1)");
</span><span class="cx"> 
</span><span class="lines">@@ -631,10 +631,10 @@
</span><span class="cx"> valid("delete ({a:a}=1)")
</span><span class="cx"> valid("({a}=1)()")
</span><span class="cx"> valid("({a:a}=1)()")
</span><del>-valid("({a}=1)=1")
-valid("({a:a}=1)=1")
-valid("({a}=1=1)")
-valid("({a:a}=1=1)")
</del><ins>+invalid("({a}=1)=1")
+invalid("({a:a}=1)=1")
+invalid("({a}=1=1)")
+invalid("({a:a}=1=1)")
</ins><span class="cx"> invalid("var {x}")
</span><span class="cx"> invalid("var {x, y}")
</span><span class="cx"> invalid("var {x} = 20, {x, y}")
</span></span></pre></div>
<a id="trunkLayoutTestsjsscriptteststoStringprefixpostfixpreserveparensjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/script-tests/toString-prefix-postfix-preserve-parens.js (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/script-tests/toString-prefix-postfix-preserve-parens.js     2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/script-tests/toString-prefix-postfix-preserve-parens.js        2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -1,61 +1,7 @@
</span><span class="cx"> description(
</span><del>-"This test checks that toString() round-trip on a function that has prefix, postfix and typeof operators applied to group expression will not remove the grouping. Also checks that evaluation of such a expression produces run-time exception"
</del><ins>+"This test checks that toString() round-trip on a function that has a typeof operator applied to a group expression will not remove the grouping."
</ins><span class="cx"> );
</span><span class="cx"> 
</span><del>-function postfix_should_preserve_parens(x, y, z) {
-    (x, y)++;
-    return y;
-}
-
-function prefix_should_preserve_parens(x, y, z) {
-    ++(x, y);
-    return x;
-
-}
-
-function both_should_preserve_parens(x, y, z) {
-    ++(x, y)--;
-    return x;
-
-}
-
-function postfix_should_preserve_parens_multi(x, y, z) {
-    (((x, y)))--;
-    return x;
-}
-
-function prefix_should_preserve_parens_multi(x, y, z) {
-    --(((x, y)));
-    return x;
-}
-
-function both_should_preserve_parens_multi(x, y, z) {
-    ++(((x, y)))--;
-    return x;
-}
-
-function postfix_should_preserve_parens_multi1(x, y, z) {
-    (((x)), y)--;
-    return x;
-}
-
-function prefix_should_preserve_parens_multi1(x, y, z) {
-    --(((x)), y);
-    return x;
-}
-
-function prefix_should_preserve_parens_multi2(x, y, z) {
-    var z = 0;
-    --(((x), y), z);
-    return x;
-}
-
-function postfix_should_preserve_parens_multi2(x, y, z) {
-    var z = 0;
-    (((x), y) ,z)++;
-    return x;
-}
-
</del><span class="cx"> // if these return a variable (such as y) instead of
</span><span class="cx"> // the result of typeof, this means that the parenthesis
</span><span class="cx"> // got lost somewhere.
</span><span class="lines">@@ -91,17 +37,6 @@
</span><span class="cx"> 
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function testToStringAndRTFailure(fn)
-{
-    testToString(fn);
-
-    // check that function call produces run-time exception
-    shouldThrow(""+fn+ "(1, 2, 3);");
-
-    // check that function call produces run-time exception after eval(unevalf)
-    shouldThrow("eval(unevalf("+fn+ "))(1, 2, 3);");
-}
-
</del><span class="cx"> function testToStringAndReturn(fn, p1, p2, retval)
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -114,17 +49,6 @@
</span><span class="cx">     shouldBe("eval(unevalf("+fn+ "))" + "(" + p1 + ", " + p2 +");", retval);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
-testToStringAndRTFailure("prefix_should_preserve_parens");
-testToStringAndRTFailure("postfix_should_preserve_parens");
-testToStringAndRTFailure("both_should_preserve_parens");
-testToStringAndRTFailure("prefix_should_preserve_parens_multi");
-testToStringAndRTFailure("postfix_should_preserve_parens_multi");
-testToStringAndRTFailure("prefix_should_preserve_parens_multi1");
-testToStringAndRTFailure("postfix_should_preserve_parens_multi1");
-testToStringAndRTFailure("prefix_should_preserve_parens_multi2");
-testToStringAndRTFailure("postfix_should_preserve_parens_multi2");
-
</del><span class="cx"> testToStringAndReturn("typeof_should_preserve_parens", "'a'", 1, "'number'");
</span><span class="cx"> testToStringAndReturn("typeof_should_preserve_parens1", "'a'", 1, "'number'");
</span><span class="cx"> testToStringAndReturn("typeof_should_preserve_parens2", "'a'", 1, "'number'");
</span></span></pre></div>
<a id="trunkLayoutTestsjstoStringprefixpostfixpreserveparensexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/toString-prefix-postfix-preserve-parens-expected.txt (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/toString-prefix-postfix-preserve-parens-expected.txt        2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/LayoutTests/js/toString-prefix-postfix-preserve-parens-expected.txt   2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -1,44 +1,8 @@
</span><del>-This test checks that toString() round-trip on a function that has prefix, postfix and typeof operators applied to group expression will not remove the grouping. Also checks that evaluation of such a expression produces run-time exception
</del><ins>+This test checks that toString() round-trip on a function that has a typeof operator applied to a group expression will not remove the grouping.
</ins><span class="cx"> 
</span><span class="cx"> On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-PASS unevalf(eval(unevalf(prefix_should_preserve_parens))) is unevalf(prefix_should_preserve_parens)
-PASS /.*\(+x\)*, y\)/.test(unevalf(prefix_should_preserve_parens)) is true
-PASS prefix_should_preserve_parens(1, 2, 3); threw exception ReferenceError: Prefix ++ operator applied to value that is not a reference..
-PASS eval(unevalf(prefix_should_preserve_parens))(1, 2, 3); threw exception ReferenceError: Prefix ++ operator applied to value that is not a reference..
-PASS unevalf(eval(unevalf(postfix_should_preserve_parens))) is unevalf(postfix_should_preserve_parens)
-PASS /.*\(+x\)*, y\)/.test(unevalf(postfix_should_preserve_parens)) is true
-PASS postfix_should_preserve_parens(1, 2, 3); threw exception ReferenceError: Postfix ++ operator applied to value that is not a reference..
-PASS eval(unevalf(postfix_should_preserve_parens))(1, 2, 3); threw exception ReferenceError: Postfix ++ operator applied to value that is not a reference..
-PASS unevalf(eval(unevalf(both_should_preserve_parens))) is unevalf(both_should_preserve_parens)
-PASS /.*\(+x\)*, y\)/.test(unevalf(both_should_preserve_parens)) is true
-PASS both_should_preserve_parens(1, 2, 3); threw exception ReferenceError: Prefix ++ operator applied to value that is not a reference..
-PASS eval(unevalf(both_should_preserve_parens))(1, 2, 3); threw exception ReferenceError: Prefix ++ operator applied to value that is not a reference..
-PASS unevalf(eval(unevalf(prefix_should_preserve_parens_multi))) is unevalf(prefix_should_preserve_parens_multi)
-PASS /.*\(+x\)*, y\)/.test(unevalf(prefix_should_preserve_parens_multi)) is true
-PASS prefix_should_preserve_parens_multi(1, 2, 3); threw exception ReferenceError: Prefix -- operator applied to value that is not a reference..
-PASS eval(unevalf(prefix_should_preserve_parens_multi))(1, 2, 3); threw exception ReferenceError: Prefix -- operator applied to value that is not a reference..
-PASS unevalf(eval(unevalf(postfix_should_preserve_parens_multi))) is unevalf(postfix_should_preserve_parens_multi)
-PASS /.*\(+x\)*, y\)/.test(unevalf(postfix_should_preserve_parens_multi)) is true
-PASS postfix_should_preserve_parens_multi(1, 2, 3); threw exception ReferenceError: Postfix -- operator applied to value that is not a reference..
-PASS eval(unevalf(postfix_should_preserve_parens_multi))(1, 2, 3); threw exception ReferenceError: Postfix -- operator applied to value that is not a reference..
-PASS unevalf(eval(unevalf(prefix_should_preserve_parens_multi1))) is unevalf(prefix_should_preserve_parens_multi1)
-PASS /.*\(+x\)*, y\)/.test(unevalf(prefix_should_preserve_parens_multi1)) is true
-PASS prefix_should_preserve_parens_multi1(1, 2, 3); threw exception ReferenceError: Prefix -- operator applied to value that is not a reference..
-PASS eval(unevalf(prefix_should_preserve_parens_multi1))(1, 2, 3); threw exception ReferenceError: Prefix -- operator applied to value that is not a reference..
-PASS unevalf(eval(unevalf(postfix_should_preserve_parens_multi1))) is unevalf(postfix_should_preserve_parens_multi1)
-PASS /.*\(+x\)*, y\)/.test(unevalf(postfix_should_preserve_parens_multi1)) is true
-PASS postfix_should_preserve_parens_multi1(1, 2, 3); threw exception ReferenceError: Postfix -- operator applied to value that is not a reference..
-PASS eval(unevalf(postfix_should_preserve_parens_multi1))(1, 2, 3); threw exception ReferenceError: Postfix -- operator applied to value that is not a reference..
-PASS unevalf(eval(unevalf(prefix_should_preserve_parens_multi2))) is unevalf(prefix_should_preserve_parens_multi2)
-PASS /.*\(+x\)*, y\)/.test(unevalf(prefix_should_preserve_parens_multi2)) is true
-PASS prefix_should_preserve_parens_multi2(1, 2, 3); threw exception ReferenceError: Prefix -- operator applied to value that is not a reference..
-PASS eval(unevalf(prefix_should_preserve_parens_multi2))(1, 2, 3); threw exception ReferenceError: Prefix -- operator applied to value that is not a reference..
-PASS unevalf(eval(unevalf(postfix_should_preserve_parens_multi2))) is unevalf(postfix_should_preserve_parens_multi2)
-PASS /.*\(+x\)*, y\)/.test(unevalf(postfix_should_preserve_parens_multi2)) is true
-PASS postfix_should_preserve_parens_multi2(1, 2, 3); threw exception ReferenceError: Postfix ++ operator applied to value that is not a reference..
-PASS eval(unevalf(postfix_should_preserve_parens_multi2))(1, 2, 3); threw exception ReferenceError: Postfix ++ operator applied to value that is not a reference..
</del><span class="cx"> PASS unevalf(eval(unevalf(typeof_should_preserve_parens))) is unevalf(typeof_should_preserve_parens)
</span><span class="cx"> PASS /.*\(+x\)*, y\)/.test(unevalf(typeof_should_preserve_parens)) is true
</span><span class="cx"> PASS typeof_should_preserve_parens('a', 1); is 'number'
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog    2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/Source/JavaScriptCore/ChangeLog       2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -1,3 +1,50 @@
</span><ins>+2019-05-16  Ross Kirsling  <ross.kirsling@sony.com>
+
+        [JSC] Invalid AssignmentTargetType should be an early error.
+        https://bugs.webkit.org/show_bug.cgi?id=197603
+
+        Reviewed by Keith Miller.
+
+        Since ES6, expressions like 0++, ++0, 0 = 0, and 0 += 0 are all specified as early errors:
+          https://tc39.github.io/ecma262/#sec-update-expressions-static-semantics-early-errors
+          https://tc39.github.io/ecma262/#sec-assignment-operators-static-semantics-early-errors
+
+        We currently throw late ReferenceErrors for these -- let's turn them into early SyntaxErrors.
+        (This is based on the expectation that https://github.com/tc39/ecma262/pull/1527 will be accepted;
+        if that doesn't come to pass, we can subsequently introduce early ReferenceError and revise these.)
+
+        * bytecompiler/NodesCodegen.cpp:
+        (JSC::PostfixNode::emitBytecode): Add an assert for "function call LHS" case.
+        (JSC::PrefixNode::emitBytecode): Add an assert for "function call LHS" case.
+
+        * parser/ASTBuilder.h:
+        (JSC::ASTBuilder::isLocation): Added.
+        (JSC::ASTBuilder::isAssignmentLocation): Fix misleading parameter name.
+        (JSC::ASTBuilder::isFunctionCall): Added.
+        (JSC::ASTBuilder::makeAssignNode): Add an assert for "function call LHS" case.
+        * parser/SyntaxChecker.h:
+        (JSC::SyntaxChecker::isLocation): Added.
+        (JSC::SyntaxChecker::isAssignmentLocation): Fix incorrect definition and align with ASTBuilder.
+        (JSC::SyntaxChecker::isFunctionCall): Added.
+        * parser/Nodes.h:
+        (JSC::ExpressionNode::isFunctionCall const): Added.
+        Ensure that the parser can check whether an expression node is a function call.
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::isSimpleAssignmentTarget): Added.
+        (JSC::Parser<LexerType>::parseAssignmentExpression):
+        (JSC::Parser<LexerType>::parseUnaryExpression): See below.
+        * parser/Parser.h:
+        Throw SyntaxError whenever an assignment or update expression's target is invalid.
+        Unfortunately, it seems that web compatibility obliges us to exempt the "function call LHS" case in sloppy mode.
+        (https://github.com/tc39/ecma262/issues/257#issuecomment-195106880)
+
+        Additional cleanup items:
+          - Make use of `semanticFailIfTrue` for `isMetaProperty` checks, as it's equivalent.
+          - Rename `requiresLExpr` to `hasPrefixUpdateOp` since it's now confusing,
+            and get rid of `modifiesExpr` since it refers to the exact same condition.
+          - Stop setting `lastOperator` near the end -- one case was incorrect and regardless neither is used.
+
</ins><span class="cx"> 2019-05-15  Saam Barati  <sbarati@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Bound liveness of SetArgumentMaybe nodes when maximal flush insertion phase is enabled
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerNodesCodegencpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp        2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp   2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -1666,6 +1666,7 @@
</span><span class="cx">     if (m_expr->isDotAccessorNode())
</span><span class="cx">         return emitDot(generator, dst);
</span><span class="cx"> 
</span><ins>+    ASSERT(m_expr->isFunctionCall());
</ins><span class="cx">     return emitThrowReferenceError(generator, m_operator == OpPlusPlus
</span><span class="cx">         ? "Postfix ++ operator applied to value that is not a reference."_s
</span><span class="cx">         : "Postfix -- operator applied to value that is not a reference."_s);
</span><span class="lines">@@ -1879,6 +1880,7 @@
</span><span class="cx">     if (m_expr->isDotAccessorNode())
</span><span class="cx">         return emitDot(generator, dst);
</span><span class="cx"> 
</span><ins>+    ASSERT(m_expr->isFunctionCall());
</ins><span class="cx">     return emitThrowReferenceError(generator, m_operator == OpPlusPlus
</span><span class="cx">         ? "Prefix ++ operator applied to value that is not a reference."_s
</span><span class="cx">         : "Prefix -- operator applied to value that is not a reference."_s);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserASTBuilderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/ASTBuilder.h (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/ASTBuilder.h  2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/Source/JavaScriptCore/parser/ASTBuilder.h     2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -627,11 +627,16 @@
</span><span class="cx">         return pattern->isBindingNode();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool isAssignmentLocation(const Expression& pattern)
</del><ins>+    bool isLocation(const Expression& node)
</ins><span class="cx">     {
</span><del>-        return pattern->isAssignmentLocation();
</del><ins>+        return node->isLocation();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool isAssignmentLocation(const Expression& node)
+    {
+        return node->isAssignmentLocation();
+    }
+
</ins><span class="cx">     bool isObjectLiteral(const Expression& node)
</span><span class="cx">     {
</span><span class="cx">         return node->isObjectLiteral();
</span><span class="lines">@@ -647,6 +652,11 @@
</span><span class="cx">         return isObjectLiteral(node) || isArrayLiteral(node);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool isFunctionCall(const Expression& node)
+    {
+        return node->isFunctionCall();
+    }
+
</ins><span class="cx">     bool shouldSkipPauseLocation(StatementNode* statement) const
</span><span class="cx">     {
</span><span class="cx">         return !statement || statement->isLabel();
</span><span class="lines">@@ -1467,8 +1477,10 @@
</span><span class="cx"> 
</span><span class="cx"> ExpressionNode* ASTBuilder::makeAssignNode(const JSTokenLocation& location, ExpressionNode* loc, Operator op, ExpressionNode* expr, bool locHasAssignments, bool exprHasAssignments, const JSTextPosition& start, const JSTextPosition& divot, const JSTextPosition& end)
</span><span class="cx"> {
</span><del>-    if (!loc->isLocation())
</del><ins>+    if (!loc->isLocation()) {
+        ASSERT(loc->isFunctionCall());
</ins><span class="cx">         return new (m_parserArena) AssignErrorNode(location, divot, start, end);
</span><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     if (loc->isResolveNode()) {
</span><span class="cx">         ResolveNode* resolve = static_cast<ResolveNode*>(loc);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserNodesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Nodes.h (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Nodes.h       2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/Source/JavaScriptCore/parser/Nodes.h  2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -204,6 +204,7 @@
</span><span class="cx">         virtual bool isImportMeta() const { return false; }
</span><span class="cx">         virtual bool isBytecodeIntrinsicNode() const { return false; }
</span><span class="cx">         virtual bool isBinaryOpNode() const { return false; }
</span><ins>+        virtual bool isFunctionCall() const { return false; }
</ins><span class="cx"> 
</span><span class="cx">         virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label&, Label&, FallThroughMode);
</span><span class="cx"> 
</span><span class="lines">@@ -869,6 +870,8 @@
</span><span class="cx">     private:
</span><span class="cx">         RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
</span><span class="cx"> 
</span><ins>+        bool isFunctionCall() const override { return true; }
+
</ins><span class="cx">         ArgumentsNode* m_args;
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="lines">@@ -879,6 +882,8 @@
</span><span class="cx">     private:
</span><span class="cx">         RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
</span><span class="cx"> 
</span><ins>+        bool isFunctionCall() const override { return true; }
+
</ins><span class="cx">         ExpressionNode* m_expr;
</span><span class="cx">         ArgumentsNode* m_args;
</span><span class="cx">     };
</span><span class="lines">@@ -890,6 +895,8 @@
</span><span class="cx">     private:
</span><span class="cx">         RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
</span><span class="cx"> 
</span><ins>+        bool isFunctionCall() const override { return true; }
+
</ins><span class="cx">         const Identifier& m_ident;
</span><span class="cx">         ArgumentsNode* m_args;
</span><span class="cx">     };
</span><span class="lines">@@ -901,6 +908,8 @@
</span><span class="cx">     private:
</span><span class="cx">         RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
</span><span class="cx"> 
</span><ins>+        bool isFunctionCall() const override { return true; }
+
</ins><span class="cx">         ExpressionNode* m_base;
</span><span class="cx">         ExpressionNode* m_subscript;
</span><span class="cx">         ArgumentsNode* m_args;
</span><span class="lines">@@ -915,6 +924,8 @@
</span><span class="cx">         RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
</span><span class="cx"> 
</span><span class="cx">     protected:
</span><ins>+        bool isFunctionCall() const override { return true; }
+
</ins><span class="cx">         ExpressionNode* m_base;
</span><span class="cx">         const Identifier& m_ident;
</span><span class="cx">         ArgumentsNode* m_args;
</span><span class="lines">@@ -945,6 +956,8 @@
</span><span class="cx">     private:
</span><span class="cx">         RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
</span><span class="cx"> 
</span><ins>+        bool isFunctionCall() const override { return m_type == Type::Function; }
+
</ins><span class="cx">         EmitterType m_emitter;
</span><span class="cx">         const Identifier& m_ident;
</span><span class="cx">         ArgumentsNode* m_args;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.cpp (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.cpp    2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/Source/JavaScriptCore/parser/Parser.cpp       2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -3631,6 +3631,14 @@
</span><span class="cx">     RELEASE_ASSERT_NOT_REACHED();
</span><span class="cx">     return "error";
</span><span class="cx"> }
</span><ins>+
+template <typename LexerType>
+template <typename TreeBuilder> bool Parser<LexerType>::isSimpleAssignmentTarget(TreeBuilder& context, TreeExpression expr)
+{
+    // Web compatibility concerns prevent us from handling a function call LHS as an early error in sloppy mode.
+    // This behavior is currently unspecified, but see: https://github.com/tc39/ecma262/issues/257#issuecomment-195106880
+    return context.isLocation(expr) || (!strictMode() && context.isFunctionCall(expr));
+}
</ins><span class="cx">     
</span><span class="cx"> template <typename LexerType>
</span><span class="cx"> template <typename TreeBuilder> TreeExpression Parser<LexerType>::parseAssignmentExpression(TreeBuilder& context, ExpressionErrorClassifier& classifier)
</span><span class="lines">@@ -3737,8 +3745,8 @@
</span><span class="cx">         }
</span><span class="cx">         m_parserState.nonTrivialExpressionCount++;
</span><span class="cx">         hadAssignment = true;
</span><del>-        if (UNLIKELY(context.isMetaProperty(lhs)))
-            internalFailWithMessage(false, metaPropertyName(context, lhs), " can't be the left hand side of an assignment expression");
</del><ins>+        semanticFailIfTrue(context.isMetaProperty(lhs), metaPropertyName(context, lhs), " can't be the left hand side of an assignment expression");
+        semanticFailIfFalse(isSimpleAssignmentTarget(context, lhs), "Left side of assignment is not a reference");
</ins><span class="cx">         context.assignmentStackAppend(assignmentStack, lhs, start, tokenStartPosition(), m_parserState.assignmentCount, op);
</span><span class="cx">         start = tokenStartPosition();
</span><span class="cx">         m_parserState.assignmentCount++;
</span><span class="lines">@@ -4929,8 +4937,7 @@
</span><span class="cx">     typename TreeBuilder::UnaryExprContext unaryExprContext(context);
</span><span class="cx">     AllowInOverride allowInOverride(this);
</span><span class="cx">     int tokenStackDepth = 0;
</span><del>-    bool modifiesExpr = false;
-    bool requiresLExpr = false;
</del><ins>+    bool hasPrefixUpdateOp = false;
</ins><span class="cx">     unsigned lastOperator = 0;
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(match(AWAIT) && currentFunctionScope()->isAsyncFunctionBoundary()))
</span><span class="lines">@@ -4939,20 +4946,17 @@
</span><span class="cx">     JSTokenLocation location(tokenLocation());
</span><span class="cx"> 
</span><span class="cx">     while (isUnaryOp(m_token.m_type)) {
</span><del>-        if (strictMode()) {
-            switch (m_token.m_type) {
-            case PLUSPLUS:
-            case MINUSMINUS:
-            case AUTOPLUSPLUS:
-            case AUTOMINUSMINUS:
-                semanticFailIfTrue(requiresLExpr, "The ", operatorString(true, lastOperator), " operator requires a reference expression");
-                modifiesExpr = true;
-                requiresLExpr = true;
-                break;
-            default:
-                semanticFailIfTrue(requiresLExpr, "The ", operatorString(true, lastOperator), " operator requires a reference expression");
-                break;
-            }
</del><ins>+        switch (m_token.m_type) {
+        case PLUSPLUS:
+        case MINUSMINUS:
+        case AUTOPLUSPLUS:
+        case AUTOMINUSMINUS:
+            semanticFailIfTrue(hasPrefixUpdateOp, "The ", operatorString(true, lastOperator), " operator requires a reference expression");
+            hasPrefixUpdateOp = true;
+            break;
+        default:
+            semanticFailIfTrue(hasPrefixUpdateOp, "The ", operatorString(true, lastOperator), " operator requires a reference expression");
+            break;
</ins><span class="cx">         }
</span><span class="cx">         lastOperator = m_token.m_type;
</span><span class="cx">         m_parserState.nonLHSCount++;
</span><span class="lines">@@ -4968,37 +4972,37 @@
</span><span class="cx">             failWithMessage("Cannot parse subexpression of ", operatorString(true, lastOperator), "operator");
</span><span class="cx">         failWithMessage("Cannot parse member expression");
</span><span class="cx">     }
</span><del>-    if (UNLIKELY(isUpdateOp(static_cast<JSTokenType>(lastOperator)) && context.isMetaProperty(expr)))
-        internalFailWithMessage(false, metaPropertyName(context, expr), " can't come after a prefix operator");
</del><ins>+    if (isUpdateOp(static_cast<JSTokenType>(lastOperator))) {
+        semanticFailIfTrue(context.isMetaProperty(expr), metaPropertyName(context, expr), " can't come after a prefix operator");
+        semanticFailIfFalse(isSimpleAssignmentTarget(context, expr), "Prefix ", lastOperator == PLUSPLUS ? "++" : "--", " operator applied to value that is not a reference");
+    }
</ins><span class="cx">     bool isEvalOrArguments = false;
</span><span class="cx">     if (strictMode()) {
</span><span class="cx">         if (context.isResolve(expr))
</span><span class="cx">             isEvalOrArguments = *m_parserState.lastIdentifier == m_vm->propertyNames->eval || *m_parserState.lastIdentifier == m_vm->propertyNames->arguments;
</span><span class="cx">     }
</span><del>-    failIfTrueIfStrict(isEvalOrArguments && modifiesExpr, "Cannot modify '", m_parserState.lastIdentifier->impl(), "' in strict mode");
</del><ins>+    failIfTrueIfStrict(isEvalOrArguments && hasPrefixUpdateOp, "Cannot modify '", m_parserState.lastIdentifier->impl(), "' in strict mode");
</ins><span class="cx">     switch (m_token.m_type) {
</span><span class="cx">     case PLUSPLUS:
</span><del>-        if (UNLIKELY(context.isMetaProperty(expr)))
-            internalFailWithMessage(false, metaPropertyName(context, expr), " can't come before a postfix operator");
</del><ins>+        semanticFailIfTrue(context.isMetaProperty(expr), metaPropertyName(context, expr), " can't come before a postfix operator");
+        semanticFailIfFalse(isSimpleAssignmentTarget(context, expr), "Postfix ++ operator applied to value that is not a reference");
</ins><span class="cx">         m_parserState.nonTrivialExpressionCount++;
</span><span class="cx">         m_parserState.nonLHSCount++;
</span><span class="cx">         expr = context.makePostfixNode(location, expr, OpPlusPlus, subExprStart, lastTokenEndPosition(), tokenEndPosition());
</span><span class="cx">         m_parserState.assignmentCount++;
</span><span class="cx">         failIfTrueIfStrict(isEvalOrArguments, "Cannot modify '", m_parserState.lastIdentifier->impl(), "' in strict mode");
</span><del>-        semanticFailIfTrue(requiresLExpr, "The ", operatorString(false, lastOperator), " operator requires a reference expression");
-        lastOperator = PLUSPLUS;
</del><ins>+        semanticFailIfTrue(hasPrefixUpdateOp, "The ", operatorString(false, lastOperator), " operator requires a reference expression");
</ins><span class="cx">         next();
</span><span class="cx">         break;
</span><span class="cx">     case MINUSMINUS:
</span><del>-        if (UNLIKELY(context.isMetaProperty(expr)))
-            internalFailWithMessage(false, metaPropertyName(context, expr), " can't come before a postfix operator");
</del><ins>+        semanticFailIfTrue(context.isMetaProperty(expr), metaPropertyName(context, expr), " can't come before a postfix operator");
+        semanticFailIfFalse(isSimpleAssignmentTarget(context, expr), "Postfix -- operator applied to value that is not a reference");
</ins><span class="cx">         m_parserState.nonTrivialExpressionCount++;
</span><span class="cx">         m_parserState.nonLHSCount++;
</span><span class="cx">         expr = context.makePostfixNode(location, expr, OpMinusMinus, subExprStart, lastTokenEndPosition(), tokenEndPosition());
</span><span class="cx">         m_parserState.assignmentCount++;
</span><span class="cx">         failIfTrueIfStrict(isEvalOrArguments, "'", m_parserState.lastIdentifier->impl(), "' cannot be modified in strict mode");
</span><del>-        semanticFailIfTrue(requiresLExpr, "The ", operatorString(false, lastOperator), " operator requires a reference expression");
-        lastOperator = PLUSPLUS;
</del><ins>+        semanticFailIfTrue(hasPrefixUpdateOp, "The ", operatorString(false, lastOperator), " operator requires a reference expression");
</ins><span class="cx">         next();
</span><span class="cx">         break;
</span><span class="cx">     default:
</span><span class="lines">@@ -5006,10 +5010,6 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     JSTextPosition end = lastTokenEndPosition();
</span><del>-
-    if (!TreeBuilder::CreatesAST && (!strictMode()))
-        return expr;
-
</del><span class="cx">     while (tokenStackDepth) {
</span><span class="cx">         switch (context.unaryTokenStackLastType(tokenStackDepth)) {
</span><span class="cx">         case EXCLAMATION:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.h (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.h      2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/Source/JavaScriptCore/parser/Parser.h 2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -1665,6 +1665,8 @@
</span><span class="cx"> 
</span><span class="cx">     template <class TreeBuilder> NEVER_INLINE const char* metaPropertyName(TreeBuilder&, TreeExpression);
</span><span class="cx"> 
</span><ins>+    template <class TreeBuilder> ALWAYS_INLINE bool isSimpleAssignmentTarget(TreeBuilder&, TreeExpression);
+
</ins><span class="cx">     ALWAYS_INLINE int isBinaryOperator(JSTokenType);
</span><span class="cx">     bool allowAutomaticSemicolon();
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserSyntaxCheckerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/SyntaxChecker.h (245405 => 245406)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/SyntaxChecker.h       2019-05-16 19:51:13 UTC (rev 245405)
+++ trunk/Source/JavaScriptCore/parser/SyntaxChecker.h  2019-05-16 20:08:22 UTC (rev 245406)
</span><span class="lines">@@ -393,11 +393,16 @@
</span><span class="cx">         return pattern == BindingDestructuring;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool isAssignmentLocation(ExpressionType type)
</del><ins>+    bool isLocation(ExpressionType type)
</ins><span class="cx">     {
</span><span class="cx">         return type == ResolveExpr || type == DotExpr || type == BracketExpr;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool isAssignmentLocation(ExpressionType type)
+    {
+        return isLocation(type) || type == DestructuringAssignment;
+    }
+
</ins><span class="cx">     bool isObjectLiteral(ExpressionType type)
</span><span class="cx">     {
</span><span class="cx">         return type == ObjectLiteralExpr;
</span><span class="lines">@@ -413,6 +418,11 @@
</span><span class="cx">         return isObjectLiteral(type) || isArrayLiteral(type);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool isFunctionCall(ExpressionType type)
+    {
+        return type == CallExpr;
+    }
+
</ins><span class="cx">     bool shouldSkipPauseLocation(int) const { return true; }
</span><span class="cx"> 
</span><span class="cx">     void setEndOffset(int, int) { }
</span></span></pre>
</div>
</div>

</body>
</html>