Index: test/cctest/test-parsing.cc |
diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc |
index 9a585430b890edcb8318707a471ec261ff596d2b..86e042eced4ddf856bba7eacf7ae0bdde96f124f 100644 |
--- a/test/cctest/test-parsing.cc |
+++ b/test/cctest/test-parsing.cc |
@@ -3502,20 +3502,23 @@ TEST(ErrorsArrowFunctions) { |
"(x, (y, z)) => 0", |
"((x, y), z) => 0", |
- // Parameter lists are always validated as strict, so those are errors. |
- "eval => {}", |
- "arguments => {}", |
- "yield => {}", |
- "interface => {}", |
- "(eval) => {}", |
- "(arguments) => {}", |
- "(yield) => {}", |
- "(interface) => {}", |
- "(eval, bar) => {}", |
- "(bar, eval) => {}", |
- "(bar, arguments) => {}", |
- "(bar, yield) => {}", |
- "(bar, interface) => {}", |
+ // Arrow function formal parameters are parsed as StrictFormalParameters, |
+ // which confusingly only implies that there are no duplicates. Words |
+ // reserved in strict mode, and eval or arguments, are indeed valid in |
+ // sloppy mode. |
+ "eval => { 'use strict'; 0 }", |
+ "arguments => { 'use strict'; 0 }", |
+ "yield => { 'use strict'; 0 }", |
+ "interface => { 'use strict'; 0 }", |
+ "(eval) => { 'use strict'; 0 }", |
+ "(arguments) => { 'use strict'; 0 }", |
+ "(yield) => { 'use strict'; 0 }", |
+ "(interface) => { 'use strict'; 0 }", |
+ "(eval, bar) => { 'use strict'; 0 }", |
+ "(bar, eval) => { 'use strict'; 0 }", |
+ "(bar, arguments) => { 'use strict'; 0 }", |
+ "(bar, yield) => { 'use strict'; 0 }", |
+ "(bar, interface) => { 'use strict'; 0 }", |
// TODO(aperez): Detecting duplicates does not work in PreParser. |
// "(bar, bar) => {}", |
@@ -3622,6 +3625,66 @@ TEST(NoErrorsArrowFunctions) { |
} |
+TEST(ArrowFunctionsSloppyParameterNames) { |
+ const char* strong_context_data[][2] = { |
+ {"'use strong'; ", ";"}, |
+ {"'use strong'; bar ? (", ") : baz;"}, |
+ {"'use strong'; bar ? baz : (", ");"}, |
+ {"'use strong'; bar, ", ";"}, |
+ {"'use strong'; ", ", bar;"}, |
+ {NULL, NULL} |
+ }; |
+ |
+ const char* strict_context_data[][2] = { |
+ {"'use strict'; ", ";"}, |
+ {"'use strict'; bar ? (", ") : baz;"}, |
+ {"'use strict'; bar ? baz : (", ");"}, |
+ {"'use strict'; bar, ", ";"}, |
+ {"'use strict'; ", ", bar;"}, |
+ {NULL, NULL} |
+ }; |
+ |
+ const char* sloppy_context_data[][2] = { |
+ {"", ";"}, |
+ {"bar ? (", ") : baz;"}, |
+ {"bar ? baz : (", ");"}, |
+ {"bar, ", ";"}, |
+ {"", ", bar;"}, |
+ {NULL, NULL} |
+ }; |
+ |
+ const char* statement_data[] = { |
+ "eval => {}", |
+ "arguments => {}", |
+ "yield => {}", |
+ "interface => {}", |
+ "(eval) => {}", |
+ "(arguments) => {}", |
+ "(yield) => {}", |
+ "(interface) => {}", |
+ "(eval, bar) => {}", |
+ "(bar, eval) => {}", |
+ "(bar, arguments) => {}", |
+ "(bar, yield) => {}", |
+ "(bar, interface) => {}", |
+ "(interface, eval) => {}", |
+ "(interface, arguments) => {}", |
+ "(eval, interface) => {}", |
+ "(arguments, interface) => {}", |
+ NULL |
+ }; |
+ |
+ static const ParserFlag always_flags[] = { kAllowHarmonyArrowFunctions, |
+ kAllowStrongMode}; |
+ RunParserSyncTest(strong_context_data, statement_data, kError, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+ RunParserSyncTest(strict_context_data, statement_data, kError, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+ RunParserSyncTest(sloppy_context_data, statement_data, kSuccess, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
TEST(SuperNoErrors) { |
// Tests that parser and preparser accept 'super' keyword in right places. |
const char* context_data[][2] = { |