OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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: --harmony-sloppy-function | 5 // Flags: --harmony-sloppy-function --nolegacy-const |
6 | 6 |
7 // In sloppy mode we allow function redeclarations within blocks for webcompat. | 7 // In sloppy mode we allow function redeclarations within blocks for webcompat. |
8 (function() { | 8 (function() { |
9 assertEquals(undefined, f); // Annex B | 9 assertEquals(undefined, f); // Annex B |
10 if (true) { | 10 if (true) { |
11 assertEquals(2, f()); | 11 assertEquals(2, f()); |
12 function f() { return 1 } | 12 function f() { return 1 } |
13 assertEquals(2, f()); | 13 assertEquals(2, f()); |
14 function f() { return 2 } | 14 function f() { return 2 } |
15 assertEquals(2, f()); | 15 assertEquals(2, f()); |
16 } | 16 } |
17 assertEquals(2, f()); // Annex B | 17 assertEquals(2, f()); // Annex B |
18 })(); | 18 })(); |
19 | 19 |
20 // Should still fail in strict mode | 20 // Should still fail in strict mode |
21 assertThrows(` | 21 assertThrows(` |
22 (function() { | 22 (function() { |
23 "use strict"; | 23 "use strict"; |
24 if (true) { | 24 if (true) { |
25 function f() { return 1 } | 25 function f() { return 1 } |
26 function f() { return 2 } | 26 function f() { return 2 } |
27 } | 27 } |
28 })(); | 28 })(); |
29 `, SyntaxError); | 29 `, SyntaxError); |
| 30 |
| 31 // Conflicts between let and function still throw |
| 32 assertThrows(` |
| 33 (function() { |
| 34 if (true) { |
| 35 let f; |
| 36 function f() { return 2 } |
| 37 } |
| 38 })(); |
| 39 `, SyntaxError); |
| 40 |
| 41 assertThrows(` |
| 42 (function() { |
| 43 if (true) { |
| 44 function f() { return 2 } |
| 45 let f; |
| 46 } |
| 47 })(); |
| 48 `, SyntaxError); |
| 49 |
| 50 // Conflicts between const and function still throw |
| 51 assertThrows(` |
| 52 (function() { |
| 53 if (true) { |
| 54 const f; |
| 55 function f() { return 2 } |
| 56 } |
| 57 })(); |
| 58 `, SyntaxError); |
| 59 |
| 60 assertThrows(` |
| 61 (function() { |
| 62 if (true) { |
| 63 function f() { return 2 } |
| 64 const f; |
| 65 } |
| 66 })(); |
| 67 `, SyntaxError); |
| 68 |
| 69 // Annex B redefinition semantics still apply with more blocks |
| 70 (function() { |
| 71 assertEquals(undefined, f); // Annex B |
| 72 if (true) { |
| 73 assertEquals(undefined, f); |
| 74 { function f() { return 1 } } |
| 75 assertEquals(1, f()); |
| 76 { function f() { return 2 } } |
| 77 assertEquals(2, f()); |
| 78 } |
| 79 assertEquals(2, f()); // Annex B |
| 80 })(); |
OLD | NEW |