test262: Should be a SyntaxError for duplicate parameter names in function with defau...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 15 Sep 2016 15:40:55 +0000 (15:40 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 15 Sep 2016 15:40:55 +0000 (15:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=162013

Patch by Joseph Pecoraro <pecoraro@apple.com> 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<LexerType>::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.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@205969 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChangeLog
JSTests/stress/es6-default-parameters.js
JSTests/test262.yaml
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/parser/Parser.cpp

index 4fa72af..abda5ce 100644 (file)
@@ -1,3 +1,13 @@
+2016-09-15  Joseph Pecoraro  <pecoraro@apple.com>
+
+        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:
+
 2016-09-14  Joseph Pecoraro  <pecoraro@apple.com>
 
         ASSERT_NOT_REACHED when using spread inside an array literal with Function.prototype.apply
index 16d516d..9a004e1 100644 (file)
@@ -277,5 +277,8 @@ augmentsArguments5(20);
 shouldThrowSyntaxError("function b(a = 20, a = 40) {}");
 shouldThrowSyntaxError("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) {}");
 shouldThrowSyntaxError("function b(a = 20, {a}) {}");
+shouldThrowSyntaxError("function b(a = 20, a) {}");
+shouldThrowSyntaxError("function b(a, a = 20) {}");
+shouldThrowSyntaxError("function b(a, a, b = 20) {}");
 shouldThrowSyntaxError("function b({a, a} = 20) {}");
 shouldThrowSyntaxError("function b({a, a} = 20) {}");
index f44c984..c7a59da 100644 (file)
 - path: test262/test/language/expressions/arrow-function/params-dflt-arg-val-undefined.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/arrow-function/params-dflt-duplicates.js
-  cmd: runTest262 :fail, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
+  cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/expressions/arrow-function/params-dflt-duplicates.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/arrow-function/params-dflt-ref-later.js
 - path: test262/test/language/expressions/function/params-dflt-args-unmapped.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/function/params-dflt-duplicates.js
-  cmd: runTest262 :fail, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
+  cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/expressions/function/params-dflt-duplicates.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/function/params-dflt-ref-arguments.js
 - path: test262/test/language/expressions/generators/params-dflt-args-unmapped.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/generators/params-dflt-duplicates.js
-  cmd: runTest262 :fail, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
+  cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/expressions/generators/params-dflt-duplicates.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/generators/params-dflt-ref-arguments.js
 - path: test262/test/language/statements/function/params-dflt-args-unmapped.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/function/params-dflt-duplicates.js
-  cmd: runTest262 :fail, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
+  cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/statements/function/params-dflt-duplicates.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/function/params-dflt-ref-arguments.js
 - path: test262/test/language/statements/generators/params-dflt-args-unmapped.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/generators/params-dflt-duplicates.js
-  cmd: runTest262 :fail, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
+  cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/statements/generators/params-dflt-duplicates.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/generators/params-dflt-ref-arguments.js
index 606e512..ffab282 100644 (file)
@@ -1,3 +1,24 @@
+2016-09-15  Joseph Pecoraro  <pecoraro@apple.com>
+
+        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<LexerType>::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.
+
 2016-09-14  Joseph Pecoraro  <pecoraro@apple.com>
 
         ASSERT_NOT_REACHED when using spread inside an array literal with Function.prototype.apply
index 261745a..43708ff 100644 (file)
@@ -1748,11 +1748,12 @@ template <class TreeBuilder> bool Parser<LexerType>::parseFormalParameters(TreeB
 {
 #define failIfDuplicateIfViolation() \
     if (duplicateParameter) {\
-        semanticFailIfTrue(defaultValue, "Duplicate parameter '", duplicateParameter->impl(), "' not allowed in function with default parameter values");\
+        semanticFailIfTrue(hasDefaultParameterValues, "Duplicate parameter '", duplicateParameter->impl(), "' not allowed in function with default parameter values");\
         semanticFailIfTrue(hasDestructuringPattern, "Duplicate parameter '", duplicateParameter->impl(), "' not allowed in function with destructuring parameters");\
         semanticFailIfTrue(isRestParameter, "Duplicate parameter '", duplicateParameter->impl(), "' not allowed in function with a rest parameter");\
     }
 
+    bool hasDefaultParameterValues = false;
     bool hasDestructuringPattern = false;
     bool isRestParameter = false;
     const Identifier* duplicateParameter = nullptr;
@@ -1773,8 +1774,11 @@ template <class TreeBuilder> bool Parser<LexerType>::parseFormalParameters(TreeB
         } else
             parameter = parseDestructuringPattern(context, DestructuringKind::DestructureToParameters, ExportType::NotExported, &duplicateParameter, &hasDestructuringPattern);
         failIfFalse(parameter, "Cannot parse parameter pattern");
-        if (!isRestParameter)
+        if (!isRestParameter) {
             defaultValue = parseDefaultValueForDestructuringPattern(context);
+            if (defaultValue)
+                hasDefaultParameterValues = true;
+        }
         propagateError();
         failIfDuplicateIfViolation();
         if (isRestParameter || defaultValue || hasDestructuringPattern)