// Copyright 2014 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: --harmony-scoping

"use strict";

// Simplest case
var count = 0;
for (let x = 0; x < 10;) {
  x++;
  count++;
  continue;
}
assertEquals(10, count);

// Labeled
count = 0;
label: for (let x = 0; x < 10;) {
  while (true) {
    x++;
    count++;
    continue label;
  }
}
assertEquals(10, count);

// Simple and labeled
count = 0;
label: for (let x = 0; x < 10;) {
  x++;
  count++;
  continue label;
}
assertEquals(10, count);

// Shadowing loop variable in same scope as continue
count = 0;
for (let x = 0; x < 10;) {
  x++;
  count++;
  {
    let x = "hello";
    continue;
  }
}
assertEquals(10, count);

// Nested let-bound for loops, inner continue
count = 0;
for (let x = 0; x < 10;) {
  x++;
  for (let y = 0; y < 2;) {
    y++;
    count++;
    continue;
  }
}
assertEquals(20, count);

// Nested let-bound for loops, outer continue
count = 0;
for (let x = 0; x < 10;) {
  x++;
  for (let y = 0; y < 2;) {
    y++;
    count++;
  }
  continue;
}
assertEquals(20, count);

// Nested let-bound for loops, labeled continue
count = 0;
outer: for (let x = 0; x < 10;) {
  x++;
  for (let y = 0; y < 2;) {
    y++;
    count++;
    if (y == 2) continue outer;
  }
}
assertEquals(20, count);
