Home | History | Annotate | Download | only in harmony
      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
      3 // found in the LICENSE file.
      4 
      5 // Flags: --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   if (false) function f() { };
     13   assertEquals(undefined, f);
     14 })();
     15 
     16 (function() {
     17   assertEquals(undefined, f);
     18   if (true) function f() { };
     19   assertEquals('function', typeof f);
     20 })();
     21 
     22 (function() {
     23   assertEquals(undefined, f);
     24   if (true) {} else function f() { };
     25   assertEquals(undefined, f);
     26 })();
     27 
     28 (function() {
     29   assertEquals(undefined, f);
     30   if (false) {} else function f() { };
     31   assertEquals('function', typeof f);
     32 })();
     33 
     34 // Labeled function declarations undergo the same hoisting/FiB semantics as if
     35 // they were unalbeled.
     36 (function() {
     37   function bar() {
     38     return f;
     39     x: function f() {}
     40   }
     41   assertEquals('function', typeof bar());
     42 })();
     43 
     44 (function() {
     45   function bar() {
     46     return f;
     47     {
     48       x: function f() {}
     49     }
     50   }
     51   assertEquals(undefined, bar());
     52 })();
     53