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); | |
Dmitry Lomov (no reviews)
2015/03/06 14:48:01
Add a test that tests the wrong behavior:
class C
marja
2015/03/06 16:14:23
Done.
| |
120 })(); | 147 })(); |
121 | 148 |
122 | 149 |
123 (function UsesWhichAreFine() { | 150 (function UsesWhichAreFine() { |
124 "use strong"; | 151 "use strong"; |
125 | 152 |
126 let var1 = 0; | 153 let var1 = 0; |
127 var1; | 154 var1; |
128 | 155 |
129 let var2a = 0, var2b = var2a + 1, var2c = 2 + var2b; | 156 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; | 200 var1, var2a, var2b, var2c; |
174 } | 201 } |
175 | 202 |
176 (function eval1() { | 203 (function eval1() { |
177 let var7 = 0; // Declaration position will be something large. | 204 let var7 = 0; // Declaration position will be something large. |
178 // But use position will be something small, however, this is not an error, | 205 // But use position will be something small, however, this is not an error, |
179 // since the use is inside an eval scope. | 206 // since the use is inside an eval scope. |
180 eval("var7;"); | 207 eval("var7;"); |
181 })(); | 208 })(); |
182 | 209 |
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 | 210 |
187 // class C4 { method() { C4; method; } }; new C4(); | 211 class C1 { constructor() { C1; } }; new C1(); |
188 // let C5 = class C6 { method() { C6; method; } }; new C5(); | 212 let C2 = class C3 { constructor() { C3; } }; new C2(); |
213 | |
214 class C4 { method() { C4; } }; new C4(); | |
215 let C5 = class C6 { method() { C6; } }; new C5(); | |
216 | |
217 class C7 { static method() { C7; } }; new C7(); | |
218 let C8 = class C9 { static method() { C9; } }; new C8(); | |
Dmitry Lomov (no reviews)
2015/03/06 14:48:01
Add a test for inner class referencing outer class
marja
2015/03/06 16:14:23
Done (not sure what you meant w/ object literal me
Dmitry Lomov (no reviews)
2015/03/07 18:17:10
Yes, it does
| |
189 })(); | 219 })(); |
OLD | NEW |