<!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>[205969] 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/205969">205969</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2016-09-15 08:40:55 -0700 (Thu, 15 Sep 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>test262: Should be a SyntaxError for duplicate parameter names in function with default parameters
https://bugs.webkit.org/show_bug.cgi?id=162013

Patch by Joseph Pecoraro &lt;pecoraro@apple.com&gt; on 2016-09-15
Reviewed by Saam Barati.

JSTests:

* stress/es6-default-parameters.js:
* test262.yaml:

Source/JavaScriptCore:

https://tc39.github.io/ecma262/#sec-function-definitions-static-semantics-early-errors
It is a Syntax Error if IsSimpleParameterList of FormalParameterList is
false and BoundNames of FormalParameterList contains any duplicate elements.

Non-simple parameter lists include rest parameters, destructuring,
and default parameters.

* parser/Parser.cpp:
(JSC::Parser&lt;LexerType&gt;::parseFormalParameters):
Previously, we were not failing if there were default parameters
early in the parameter list that were not yet identified as duplicates
and simple parameters later were duplicates. Now, we fail if there
are default parameters anywhere in the parameter list with a duplicate.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkJSTestsChangeLog">trunk/JSTests/ChangeLog</a></li>
<li><a href="#trunkJSTestsstresses6defaultparametersjs">trunk/JSTests/stress/es6-default-parameters.js</a></li>
<li><a href="#trunkJSTeststest262yaml">trunk/JSTests/test262.yaml</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserParsercpp">trunk/Source/JavaScriptCore/parser/Parser.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkJSTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/ChangeLog (205968 => 205969)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/ChangeLog        2016-09-15 15:30:00 UTC (rev 205968)
+++ trunk/JSTests/ChangeLog        2016-09-15 15:40:55 UTC (rev 205969)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-09-15  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        test262: Should be a SyntaxError for duplicate parameter names in function with default parameters
+        https://bugs.webkit.org/show_bug.cgi?id=162013
+
+        Reviewed by Saam Barati.
+
+        * stress/es6-default-parameters.js:
+        * test262.yaml:
+
</ins><span class="cx"> 2016-09-14  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         ASSERT_NOT_REACHED when using spread inside an array literal with Function.prototype.apply
</span></span></pre></div>
<a id="trunkJSTestsstresses6defaultparametersjs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/stress/es6-default-parameters.js (205968 => 205969)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/stress/es6-default-parameters.js        2016-09-15 15:30:00 UTC (rev 205968)
+++ trunk/JSTests/stress/es6-default-parameters.js        2016-09-15 15:40:55 UTC (rev 205969)
</span><span class="lines">@@ -277,5 +277,8 @@
</span><span class="cx"> shouldThrowSyntaxError(&quot;function b(a = 20, a = 40) {}&quot;);
</span><span class="cx"> shouldThrowSyntaxError(&quot;function b(aaaaa = 20,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v, aaaaa = 40) {}&quot;);
</span><span class="cx"> shouldThrowSyntaxError(&quot;function b(a = 20, {a}) {}&quot;);
</span><ins>+shouldThrowSyntaxError(&quot;function b(a = 20, a) {}&quot;);
+shouldThrowSyntaxError(&quot;function b(a, a = 20) {}&quot;);
+shouldThrowSyntaxError(&quot;function b(a, a, b = 20) {}&quot;);
</ins><span class="cx"> shouldThrowSyntaxError(&quot;function b({a, a} = 20) {}&quot;);
</span><span class="cx"> shouldThrowSyntaxError(&quot;function b({a, a} = 20) {}&quot;);
</span></span></pre></div>
<a id="trunkJSTeststest262yaml"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/test262.yaml (205968 => 205969)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/test262.yaml        2016-09-15 15:30:00 UTC (rev 205968)
+++ trunk/JSTests/test262.yaml        2016-09-15 15:40:55 UTC (rev 205969)
</span><span class="lines">@@ -54068,7 +54068,7 @@
</span><span class="cx"> - path: test262/test/language/expressions/arrow-function/params-dflt-arg-val-undefined.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/language/expressions/arrow-function/params-dflt-duplicates.js
</span><del>-  cmd: runTest262 :fail, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</del><ins>+  cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</ins><span class="cx"> - path: test262/test/language/expressions/arrow-function/params-dflt-duplicates.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/language/expressions/arrow-function/params-dflt-ref-later.js
</span><span class="lines">@@ -62176,7 +62176,7 @@
</span><span class="cx"> - path: test262/test/language/expressions/function/params-dflt-args-unmapped.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/language/expressions/function/params-dflt-duplicates.js
</span><del>-  cmd: runTest262 :fail, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</del><ins>+  cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</ins><span class="cx"> - path: test262/test/language/expressions/function/params-dflt-duplicates.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/language/expressions/function/params-dflt-ref-arguments.js
</span><span class="lines">@@ -62998,7 +62998,7 @@
</span><span class="cx"> - path: test262/test/language/expressions/generators/params-dflt-args-unmapped.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/language/expressions/generators/params-dflt-duplicates.js
</span><del>-  cmd: runTest262 :fail, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</del><ins>+  cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</ins><span class="cx"> - path: test262/test/language/expressions/generators/params-dflt-duplicates.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/language/expressions/generators/params-dflt-ref-arguments.js
</span><span class="lines">@@ -83352,7 +83352,7 @@
</span><span class="cx"> - path: test262/test/language/statements/function/params-dflt-args-unmapped.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/language/statements/function/params-dflt-duplicates.js
</span><del>-  cmd: runTest262 :fail, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</del><ins>+  cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</ins><span class="cx"> - path: test262/test/language/statements/function/params-dflt-duplicates.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/language/statements/function/params-dflt-ref-arguments.js
</span><span class="lines">@@ -84162,7 +84162,7 @@
</span><span class="cx"> - path: test262/test/language/statements/generators/params-dflt-args-unmapped.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/language/statements/generators/params-dflt-duplicates.js
</span><del>-  cmd: runTest262 :fail, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</del><ins>+  cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</ins><span class="cx"> - path: test262/test/language/statements/generators/params-dflt-duplicates.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/language/statements/generators/params-dflt-ref-arguments.js
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (205968 => 205969)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-09-15 15:30:00 UTC (rev 205968)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-09-15 15:40:55 UTC (rev 205969)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2016-09-15  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        test262: Should be a SyntaxError for duplicate parameter names in function with default parameters
+        https://bugs.webkit.org/show_bug.cgi?id=162013
+
+        Reviewed by Saam Barati.
+
+        https://tc39.github.io/ecma262/#sec-function-definitions-static-semantics-early-errors
+        It is a Syntax Error if IsSimpleParameterList of FormalParameterList is
+        false and BoundNames of FormalParameterList contains any duplicate elements.
+
+        Non-simple parameter lists include rest parameters, destructuring,
+        and default parameters.
+
+        * parser/Parser.cpp:
+        (JSC::Parser&lt;LexerType&gt;::parseFormalParameters):
+        Previously, we were not failing if there were default parameters
+        early in the parameter list that were not yet identified as duplicates
+        and simple parameters later were duplicates. Now, we fail if there
+        are default parameters anywhere in the parameter list with a duplicate.
+
</ins><span class="cx"> 2016-09-14  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         ASSERT_NOT_REACHED when using spread inside an array literal with Function.prototype.apply
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.cpp (205968 => 205969)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.cpp        2016-09-15 15:30:00 UTC (rev 205968)
+++ trunk/Source/JavaScriptCore/parser/Parser.cpp        2016-09-15 15:40:55 UTC (rev 205969)
</span><span class="lines">@@ -1748,11 +1748,12 @@
</span><span class="cx"> {
</span><span class="cx"> #define failIfDuplicateIfViolation() \
</span><span class="cx">     if (duplicateParameter) {\
</span><del>-        semanticFailIfTrue(defaultValue, &quot;Duplicate parameter '&quot;, duplicateParameter-&gt;impl(), &quot;' not allowed in function with default parameter values&quot;);\
</del><ins>+        semanticFailIfTrue(hasDefaultParameterValues, &quot;Duplicate parameter '&quot;, duplicateParameter-&gt;impl(), &quot;' not allowed in function with default parameter values&quot;);\
</ins><span class="cx">         semanticFailIfTrue(hasDestructuringPattern, &quot;Duplicate parameter '&quot;, duplicateParameter-&gt;impl(), &quot;' not allowed in function with destructuring parameters&quot;);\
</span><span class="cx">         semanticFailIfTrue(isRestParameter, &quot;Duplicate parameter '&quot;, duplicateParameter-&gt;impl(), &quot;' not allowed in function with a rest parameter&quot;);\
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool hasDefaultParameterValues = false;
</ins><span class="cx">     bool hasDestructuringPattern = false;
</span><span class="cx">     bool isRestParameter = false;
</span><span class="cx">     const Identifier* duplicateParameter = nullptr;
</span><span class="lines">@@ -1773,8 +1774,11 @@
</span><span class="cx">         } else
</span><span class="cx">             parameter = parseDestructuringPattern(context, DestructuringKind::DestructureToParameters, ExportType::NotExported, &amp;duplicateParameter, &amp;hasDestructuringPattern);
</span><span class="cx">         failIfFalse(parameter, &quot;Cannot parse parameter pattern&quot;);
</span><del>-        if (!isRestParameter)
</del><ins>+        if (!isRestParameter) {
</ins><span class="cx">             defaultValue = parseDefaultValueForDestructuringPattern(context);
</span><ins>+            if (defaultValue)
+                hasDefaultParameterValues = true;
+        }
</ins><span class="cx">         propagateError();
</span><span class="cx">         failIfDuplicateIfViolation();
</span><span class="cx">         if (isRestParameter || defaultValue || hasDestructuringPattern)
</span></span></pre>
</div>
</div>

</body>
</html>