blob: 07023208646201545269265d7c2b305b025d7c76 [file] [log] [blame]
Ben Murdochda12d292016-06-02 14:46:10 +01001// 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
3// found in the LICENSE file.
4
5// Flags: --no-harmony-restrictive-declarations
6
7// ES#sec-functiondeclarations-in-ifstatement-statement-clauses
8// Annex B 3.4 FunctionDeclarations in IfStatement Statement Clauses
9// In sloppy mode, function declarations in if statements act like
10// they have a block around them. Prohibited in strict mode.
11(function() {
12 assertEquals(undefined, f);
13 if (false) function f() { };
14 assertEquals(undefined, f);
15})();
16
17(function() {
18 assertEquals(undefined, f);
19 if (true) function f() { };
20 assertEquals('function', typeof f);
21})();
22
23(function() {
24 assertEquals(undefined, f);
25 if (true) {} else function f() { };
26 assertEquals(undefined, f);
27})();
28
29(function() {
30 assertEquals(undefined, f);
31 if (false) {} else function f() { };
32 assertEquals('function', typeof f);
33})();
34
35// For legacy reasons, we also support these types of semantics as
36// the body of a for or with statement.
37(function() {
38 for (;false;) function f() { };
39 assertEquals(undefined, f);
40})();
41
42(function() {
43 for (var x in {}) function f() { };
44 assertEquals(undefined, f);
45})();
46
47(function() {
48 var x;
49 for (x in {}) function f() { };
50 assertEquals(undefined, f);
51})();
52
53(function() {
54 for (var i = 0; i < 1; i++) function f() { };
55 assertEquals('function', typeof f);
56})();
57
58(function() {
59 for (var x in {a: 1}) function f() { };
60 assertEquals('function', typeof f);
61})();
62
63(function() {
64 var x;
65 for (x in {a: 1}) function f() { };
66 assertEquals('function', typeof f);
67})();
68
69(function() {
70 with ({}) function f() { };
71 assertEquals('function', typeof f);
72})();
73
74(function() {
75 do function f() {} while (0);
76 assertEquals('function', typeof f);
77})();
78
79// Labeled function declarations undergo the same hoisting/FiB semantics as if
80// they were unalbeled.
81(function() {
82 function bar() {
83 return f;
84 x: function f() {}
85 }
86 assertEquals('function', typeof bar());
87})();
88
89(function() {
90 function bar() {
91 return f;
92 {
93 x: function f() {}
94 }
95 }
96 assertEquals(undefined, bar());
97})();