Modified: trunk/JSTests/stress/es6-default-parameters.js (205968 => 205969)
--- 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)
@@ -277,5 +277,8 @@
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) {}");
Modified: trunk/JSTests/test262.yaml (205968 => 205969)
--- 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)
@@ -54068,7 +54068,7 @@
- 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
@@ -62176,7 +62176,7 @@
- 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
@@ -62998,7 +62998,7 @@
- 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
@@ -83352,7 +83352,7 @@
- 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
@@ -84162,7 +84162,7 @@
- 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
Modified: trunk/Source/_javascript_Core/parser/Parser.cpp (205968 => 205969)
--- trunk/Source/_javascript_Core/parser/Parser.cpp 2016-09-15 15:30:00 UTC (rev 205968)
+++ trunk/Source/_javascript_Core/parser/Parser.cpp 2016-09-15 15:40:55 UTC (rev 205969)
@@ -1748,11 +1748,12 @@
{
#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 @@
} 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)