// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.7

// A break label must be declared where it's used.
undeclaredBreakLabel1() {
  foo: { break bar; break foo; } // //# 01: compile-time error
}

undeclaredBreakLabel2() {
  foo: while (true) { break bar; break foo; } // //# 02: compile-time error
}

// An unlabeled break must be inside a loop or switch.
noBreakTarget() {
  foo: if (true) { break; break foo; } // //# 03: compile-time error
}

// A continue label must be declared where it's used.
undeclaredContinueLabel() {
  foo: for (;;) { continue bar; break foo; } // //# 04: compile-time error
}

// An unlabeled continue must be inside a loop.
noContinueTarget() {
  foo: if (true) continue; else break foo; // //# 05: compile-time error
}

// A continue label must point to a continue-able statement.
wrongContinueLabel() {
  foo: if (true) continue foo; // //# 06: compile-time error
}

// Labels are not captured by closures.
noncaptureLabel() {
  foo: { //                   //# 07: compile-time error
    (() { break foo; })(); // //# 07: continued
    break foo; //             //# 07: continued
  } //                        //# 07: continued
}

// Implicit break targets are not captured by closures.
noncaptureBreak() {
  while(true) (() { break; })(); // //# 08: compile-time error
}

// Implicit continue targets are not captured by closures.
noncaptureContinue() {
  while(true) (() { continue; })(); // //# 09: compile-time error
}

main() {
  undeclaredBreakLabel1();
  undeclaredBreakLabel2();
  noBreakTarget();
  undeclaredContinueLabel();
  noContinueTarget();
  wrongContinueLabel();
  noncaptureLabel();
  noncaptureBreak();
  noncaptureContinue();
}
