// Copyright 2018 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.

// Flags: --compiler-dispatcher --parallel-compile-tasks --use-external-strings

(function(a) {
 assertEquals(a, "IIFE");
})("IIFE");

(function(a, ...rest) {
 assertEquals(a, 1);
 assertEquals(rest.length, 2);
 assertEquals(rest[0], 2);
 assertEquals(rest[1], 3);
})(1,2,3);

var outer_var = 42;

function lazy_outer() {
 return 42;
}

var eager_outer = (function() { return 42; });

(function() {
 assertEquals(outer_var, 42);
 assertEquals(lazy_outer(), 42);
 assertEquals(eager_outer(), 42);
})();

var gen = (function*() {
 yield 1;
 yield 2;
})();

assertEquals(gen.next().value, 1);
assertEquals(gen.next().value, 2);

var result = (function recursive(a=0) {
 if (a == 1) {
  return 42;
 }
 return recursive(1);
})();

assertEquals(result, 42);

var a = 42;
var b;
var c = (a, b = (function z(){ return a+1; })());
assertEquals(b, 43);
assertEquals(c, 43);
var c = (a, b = (function z(){ return a+1; })()) => { return b; };
assertEquals(c(314), 315);

// http://crbug.com/898076
(function() {
  class foo {};
});  // Don't call IIFE so that it is compiled during idle time

// http://crbug.com/900535
(function() {
  "use asm";
  function bar(i, j) {
    i = i|0;
    j = j|0;
  }
  return {bar: bar};
});  // Don't call IIFE so that it is compiled during idle time
