| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| |
| // In sloppy mode we allow function redeclarations within blocks for webcompat. |
| (function() { |
| assertEquals(undefined, f); // Annex B |
| if (true) { |
| assertEquals(2, f()); |
| function f() { return 1 } |
| assertEquals(2, f()); |
| function f() { return 2 } |
| assertEquals(2, f()); |
| } |
| assertEquals(2, f()); // Annex B |
| })(); |
| |
| // Should still fail in strict mode |
| assertThrows(` |
| (function() { |
| "use strict"; |
| if (true) { |
| function f() { return 1 } |
| function f() { return 2 } |
| } |
| })(); |
| `, SyntaxError); |
| |
| // Conflicts between let and function still throw |
| assertThrows(` |
| (function() { |
| if (true) { |
| let f; |
| function f() { return 2 } |
| } |
| })(); |
| `, SyntaxError); |
| |
| assertThrows(` |
| (function() { |
| if (true) { |
| function f() { return 2 } |
| let f; |
| } |
| })(); |
| `, SyntaxError); |
| |
| // Conflicts between const and function still throw |
| assertThrows(` |
| (function() { |
| if (true) { |
| const f; |
| function f() { return 2 } |
| } |
| })(); |
| `, SyntaxError); |
| |
| assertThrows(` |
| (function() { |
| if (true) { |
| function f() { return 2 } |
| const f; |
| } |
| })(); |
| `, SyntaxError); |
| |
| // Annex B redefinition semantics still apply with more blocks |
| (function() { |
| assertEquals(undefined, f); // Annex B |
| if (true) { |
| assertEquals(undefined, f); |
| { function f() { return 1 } } |
| assertEquals(1, f()); |
| { function f() { return 2 } } |
| assertEquals(2, f()); |
| } |
| assertEquals(2, f()); // Annex B |
| })(); |