OLD | NEW |
---|---|
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Flags: --strong-mode --harmony_rest_parameters --harmony_arrow_functions --ha rmony_classes --harmony-computed-property-names | 5 // Flags: --strong-mode --harmony_rest_parameters --harmony_arrow_functions --ha rmony_classes --harmony-computed-property-names |
6 | 6 |
7 // Note that it's essential for these tests that the reference is inside dead | 7 // Note that it's essential for these tests that the reference is inside dead |
8 // code (because we already produce ReferenceErrors for run-time unresolved | 8 // code (because we already produce ReferenceErrors for run-time unresolved |
9 // variables and don't want to confuse those with strong mode errors). But the | 9 // variables and don't want to confuse those with strong mode errors). But the |
10 // errors should *not* be inside lazy, unexecuted functions, since lazy parsing | 10 // errors should *not* be inside lazy, unexecuted functions, since lazy parsing |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
103 | 103 |
104 assertThrowsHelper( | 104 assertThrowsHelper( |
105 "'use strong'; if (false) { let C = class C2 { method() { C; } } }", | 105 "'use strong'; if (false) { let C = class C2 { method() { C; } } }", |
106 ReferenceError); | 106 ReferenceError); |
107 | 107 |
108 assertThrowsHelper( | 108 assertThrowsHelper( |
109 "'use strong'; if (false) { let C = class C2 { " + | 109 "'use strong'; if (false) { let C = class C2 { " + |
110 "static a() { return 'A'; } [C.a()]() { return 'B'; } }; }", | 110 "static a() { return 'A'; } [C.a()]() { return 'B'; } }; }", |
111 ReferenceError); | 111 ReferenceError); |
112 | 112 |
113 // TODO(marja, rossberg): More tests related to computed property names in | 113 assertThrowsHelper( |
114 // classes + recognize more errors. This one is not recognized as an error | 114 "'use strong'; if (false) { let C = class C2 { " + |
115 // yet: | 115 "static a() { return 'A'; } [C2.a()]() { return 'B'; } }; }", |
116 // let C = class C2 { | 116 ReferenceError); |
117 // static a() { return 'A'; } | 117 |
118 // [C2.a()]() { return 'B'; } << C2 should not be allowed here | 118 assertThrowsHelper( |
119 // }; | 119 "'use strong'; if (false) { let C = class C2 { " + |
120 "[(function() { C; return 'A';})()]() { return 'B'; } }; }", | |
121 ReferenceError); | |
122 | |
123 // The reference to C or C2 is inside a function, but not a method. | |
124 assertThrowsHelper( | |
125 "'use strong'; if (false) { let C = class C2 { " + | |
126 "[(function() { C2; return 'A';})()]() { return 'B'; } }; }", | |
127 ReferenceError); | |
128 | |
129 assertThrowsHelper( | |
130 "'use strong'; if (false) { let C = class C2 { " + | |
131 "[(function() { C; return 'A';})()]() { return 'B'; } }; }", | |
132 ReferenceError); | |
133 | |
134 // The reference to C or C2 is inside a method, but it's not a method of the | |
135 // relevant class (C2). | |
136 assertThrowsHelper( | |
137 "'use strong'; if (false) { let C = class C2 { " + | |
138 "[(new (class D { m() { C2; return 'A'; } })).m()]() " + | |
139 "{ return 'B'; } } }", | |
140 ReferenceError); | |
141 | |
142 assertThrowsHelper( | |
143 "'use strong'; if (false) { let C = class C2 { " + | |
144 "[(new (class D { m() { C; return 'A'; } })).m()]() " + | |
145 "{ return 'B'; } } }", | |
146 ReferenceError); | |
147 | |
148 // Methods inside object literals are not sufficiently distinguished from | |
149 // methods inside classes. | |
150 // https://code.google.com/p/v8/issues/detail?id=3948 | |
151 // assertThrowsHelper( | |
152 // "'use strong'; if (false) { let C = class C2 { " + | |
153 // "[({m() { C2; return 'A'; }}).m()]() " + | |
154 // "{ return 'B'; } } }", | |
155 // ReferenceError); | |
156 | |
157 assertThrowsHelper( | |
158 "'use strong'; if (false) { let C = class C2 { " + | |
159 "[({m() { C; return 'A'; }}).m()]() " + | |
160 "{ return 'B'; } } }", | |
161 ReferenceError); | |
162 | |
163 // assertThrowsHelper( | |
164 // "'use strong';\n" + | |
165 // "if (false) {\n" + | |
166 // " class COuter {\n" + | |
167 // " m() {\n" + | |
168 // " class CInner {\n" + | |
169 // " [({ m() { CInner; return 'A'; } }).m()]() { return 'B'; }\ n" + | |
Dmitry Lomov (no reviews)
2015/03/07 18:17:10
line length
marja
2015/03/09 10:01:38
Done.
| |
170 // " }\n" + | |
171 // " }\n" + | |
172 // " }\n" + | |
173 // "}", | |
174 // ReferenceError); | |
120 })(); | 175 })(); |
121 | 176 |
122 | 177 |
123 (function UsesWhichAreFine() { | 178 (function UsesWhichAreFine() { |
124 "use strong"; | 179 "use strong"; |
125 | 180 |
126 let var1 = 0; | 181 let var1 = 0; |
127 var1; | 182 var1; |
128 | 183 |
129 let var2a = 0, var2b = var2a + 1, var2c = 2 + var2b; | 184 let var2a = 0, var2b = var2a + 1, var2c = 2 + var2b; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
173 var1, var2a, var2b, var2c; | 228 var1, var2a, var2b, var2c; |
174 } | 229 } |
175 | 230 |
176 (function eval1() { | 231 (function eval1() { |
177 let var7 = 0; // Declaration position will be something large. | 232 let var7 = 0; // Declaration position will be something large. |
178 // But use position will be something small, however, this is not an error, | 233 // But use position will be something small, however, this is not an error, |
179 // since the use is inside an eval scope. | 234 // since the use is inside an eval scope. |
180 eval("var7;"); | 235 eval("var7;"); |
181 })(); | 236 })(); |
182 | 237 |
183 // https://code.google.com/p/v8/issues/detail?id=3927 | |
184 // class C1 { constructor() { C1; } }; new C1(); | |
185 // let C2 = class C3 { constructor() { C3; } }; new C2(); | |
186 | 238 |
187 // class C4 { method() { C4; method; } }; new C4(); | 239 class C1 { constructor() { C1; } }; new C1(); |
188 // let C5 = class C6 { method() { C6; method; } }; new C5(); | 240 let C2 = class C3 { constructor() { C3; } }; new C2(); |
241 | |
242 class C4 { method() { C4; } }; new C4(); | |
243 let C5 = class C6 { method() { C6; } }; new C5(); | |
244 | |
245 class C7 { static method() { C7; } }; new C7(); | |
246 let C8 = class C9 { static method() { C9; } }; new C8(); | |
247 | |
248 // Regression test for unnamed classes. | |
249 let C10 = class { m() { var1; } }; | |
250 | |
251 class COuter { | |
252 m() { | |
253 class CInner { | |
254 // Here we can refer to COuter but not to CInner (see corresponding asse rtion test): | |
Dmitry Lomov (no reviews)
2015/03/07 18:17:10
line length
marja
2015/03/09 10:01:38
Done.
| |
255 [({ m() { COuter; return 'A'; } }).m()]() { return 'B'; } | |
256 // And here we can refer to both: | |
257 n() { COuter; CInner; } | |
258 } | |
259 return new CInner(); | |
260 } | |
261 } | |
262 (new COuter()).m().n(); | |
189 })(); | 263 })(); |
OLD | NEW |