Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: test/cctest/test-parsing.cc

Issue 1891453005: [parser] Relex restriction on reserved words (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Restoring 'let let' case (with explanation) Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parsing/parser-base.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1997 matching lines...) Expand 10 before | Expand all | Expand 10 after
2008 "var foo = { eval: 1 };", 2008 "var foo = { eval: 1 };",
2009 "var foo = { arguments: 1 };", 2009 "var foo = { arguments: 1 };",
2010 "var foo = { }; foo.eval = {};", 2010 "var foo = { }; foo.eval = {};",
2011 "var foo = { }; foo.arguments = {};", 2011 "var foo = { }; foo.arguments = {};",
2012 NULL 2012 NULL
2013 }; 2013 };
2014 2014
2015 RunParserSyncTest(context_data, statement_data, kSuccess); 2015 RunParserSyncTest(context_data, statement_data, kSuccess);
2016 } 2016 }
2017 2017
2018 #define FUTURE_STRICT_RESERVED_WORDS_NO_LET(V) \
2019 V(implements) \
2020 V(interface) \
2021 V(package) \
2022 V(private) \
2023 V(protected) \
2024 V(public) \
2025 V(static) \
2026 V(yield)
2018 2027
2019 #define FUTURE_STRICT_RESERVED_WORDS(V) \ 2028 #define FUTURE_STRICT_RESERVED_WORDS(V) \
2020 V(implements) \
2021 V(interface) \
2022 V(let) \ 2029 V(let) \
2023 V(package) \ 2030 FUTURE_STRICT_RESERVED_WORDS_NO_LET(V)
2024 V(private) \ 2031
2025 V(protected) \ 2032 #define LIMITED_FUTURE_STRICT_RESERVED_WORDS_NO_LET(V) \
2026 V(public) \ 2033 V(implements) \
2027 V(static) \ 2034 V(static) \
2028 V(yield) 2035 V(yield)
2029 2036
2030
2031 #define LIMITED_FUTURE_STRICT_RESERVED_WORDS(V) \ 2037 #define LIMITED_FUTURE_STRICT_RESERVED_WORDS(V) \
2032 V(implements) \
2033 V(let) \ 2038 V(let) \
2034 V(static) \ 2039 LIMITED_FUTURE_STRICT_RESERVED_WORDS_NO_LET(V)
2035 V(yield)
2036
2037 2040
2038 #define FUTURE_STRICT_RESERVED_STATEMENTS(NAME) \ 2041 #define FUTURE_STRICT_RESERVED_STATEMENTS(NAME) \
2039 "var " #NAME ";", \ 2042 "var " #NAME ";", \
2040 "var foo, " #NAME ";", \ 2043 "var foo, " #NAME ";", \
2041 "try { } catch (" #NAME ") { }", \ 2044 "try { } catch (" #NAME ") { }", \
2042 "function " #NAME "() { }", \ 2045 "function " #NAME "() { }", \
2043 "(function " #NAME "() { })", \ 2046 "(function " #NAME "() { })", \
2044 "function foo(" #NAME ") { }", \ 2047 "function foo(" #NAME ") { }", \
2045 "function foo(bar, " #NAME ") { }", \ 2048 "function foo(bar, " #NAME ") { }", \
2046 #NAME " = 1;", \ 2049 #NAME " = 1;", \
2047 #NAME " += 1;", \ 2050 #NAME " += 1;", \
2048 "var foo = " #NAME " = 1;", \ 2051 "var foo = " #NAME " = 1;", \
2049 "++" #NAME ";", \ 2052 "++" #NAME ";", \
2050 #NAME " ++;", 2053 #NAME " ++;",
2051 2054
2055 // clang-format off
2056 #define FUTURE_STRICT_RESERVED_LEX_BINDINGS(NAME) \
2057 "let " #NAME ";", \
2058 "for (let " #NAME "; false; ) {}", \
2059 "for (let " #NAME " in {}) {}", \
2060 "for (let " #NAME " of []) {}", \
2061 "const " #NAME " = null;", \
2062 "for (const " #NAME " = null; false; ) {}", \
2063 "for (const " #NAME " in {}) {}", \
2064 "for (const " #NAME " of []) {}",
2065 // clang-format on
2052 2066
2053 TEST(ErrorsFutureStrictReservedWords) { 2067 TEST(ErrorsFutureStrictReservedWords) {
2054 // Tests that both preparsing and parsing produce the right kind of errors for 2068 // Tests that both preparsing and parsing produce the right kind of errors for
2055 // using future strict reserved words as identifiers. Without the strict mode, 2069 // using future strict reserved words as identifiers. Without the strict mode,
2056 // it's ok to use future strict reserved words as identifiers. With the strict 2070 // it's ok to use future strict reserved words as identifiers. With the strict
2057 // mode, it isn't. 2071 // mode, it isn't.
2058 const char* context_data[][2] = { 2072 const char* strict_contexts[][2] = {
2059 {"function test_func() {\"use strict\"; ", "}"}, 2073 {"function test_func() {\"use strict\"; ", "}"},
2060 {"() => { \"use strict\"; ", "}"}, 2074 {"() => { \"use strict\"; ", "}"},
2061 {NULL, NULL}}; 2075 {NULL, NULL}};
2062 2076
2077 // clang-format off
2063 const char* statement_data[] { 2078 const char* statement_data[] {
2064 LIMITED_FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) 2079 LIMITED_FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS)
2080 LIMITED_FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_LEX_BINDINGS)
2065 NULL 2081 NULL
2066 }; 2082 };
2083 // clang-format on
2067 2084
2068 RunParserSyncTest(context_data, statement_data, kError); 2085 RunParserSyncTest(strict_contexts, statement_data, kError);
2086
2087 // From ES2015, 13.3.1.1 Static Semantics: Early Errors:
2088 //
2089 // > LexicalDeclaration : LetOrConst BindingList ;
2090 // >
2091 // > - It is a Syntax Error if the BoundNames of BindingList contains "let".
2092 const char* non_strict_contexts[][2] = {{"", ""},
2093 {"function test_func() {", "}"},
2094 {"() => {", "}"},
2095 {NULL, NULL}};
2096 const char* invalid_statements[] = {FUTURE_STRICT_RESERVED_LEX_BINDINGS("let")
2097 NULL};
2098
2099 RunParserSyncTest(non_strict_contexts, invalid_statements, kError);
2069 } 2100 }
2070 2101
2071
2072 #undef LIMITED_FUTURE_STRICT_RESERVED_WORDS 2102 #undef LIMITED_FUTURE_STRICT_RESERVED_WORDS
2073 2103
2074 2104
2075 TEST(NoErrorsFutureStrictReservedWords) { 2105 TEST(NoErrorsFutureStrictReservedWords) {
2076 const char* context_data[][2] = { 2106 const char* context_data[][2] = {
2077 { "", "" }, 2107 { "", "" },
2078 { "function test_func() {", "}"}, 2108 { "function test_func() {", "}"},
2079 { "() => {", "}" }, 2109 { "() => {", "}" },
2080 { NULL, NULL } 2110 { NULL, NULL }
2081 }; 2111 };
2082 2112
2113 // clang-format off
2083 const char* statement_data[] = { 2114 const char* statement_data[] = {
2084 FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) 2115 FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS)
2116 FUTURE_STRICT_RESERVED_WORDS_NO_LET(FUTURE_STRICT_RESERVED_LEX_BINDINGS)
2085 NULL 2117 NULL
2086 }; 2118 };
2119 // clang-format on
2087 2120
2088 RunParserSyncTest(context_data, statement_data, kSuccess); 2121 RunParserSyncTest(context_data, statement_data, kSuccess);
2089 } 2122 }
2090 2123
2091 2124
2092 TEST(ErrorsReservedWords) { 2125 TEST(ErrorsReservedWords) {
2093 // Tests that both preparsing and parsing produce the right kind of errors for 2126 // Tests that both preparsing and parsing produce the right kind of errors for
2094 // using future reserved words as identifiers. These tests don't depend on the 2127 // using future reserved words as identifiers. These tests don't depend on the
2095 // strict mode. 2128 // strict mode.
2096 const char* context_data[][2] = { 2129 const char* context_data[][2] = {
(...skipping 5594 matching lines...) Expand 10 before | Expand all | Expand 10 after
7691 "for (const x = 0 in {});", 7724 "for (const x = 0 in {});",
7692 "for (let x = 0 in {});", 7725 "for (let x = 0 in {});",
7693 NULL 7726 NULL
7694 }; 7727 };
7695 // clang-format on 7728 // clang-format on
7696 7729
7697 static const ParserFlag always_flags[] = {kAllowHarmonyForIn}; 7730 static const ParserFlag always_flags[] = {kAllowHarmonyForIn};
7698 RunParserSyncTest(context_data, error_data, kError, nullptr, 0, always_flags, 7731 RunParserSyncTest(context_data, error_data, kError, nullptr, 0, always_flags,
7699 arraysize(always_flags)); 7732 arraysize(always_flags));
7700 } 7733 }
OLDNEW
« no previous file with comments | « src/parsing/parser-base.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698