a25ee6adc5
Change-Id: I9ec3a68c392c533ed9e766b1233ea9a672a9f5cc Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149041 Auto-Submit: Bob Nystrom <rnystrom@google.com> Commit-Queue: Srujan Gaddam <srujzs@google.com> Reviewed-by: Srujan Gaddam <srujzs@google.com>
353 lines
6.3 KiB
Dart
353 lines
6.3 KiB
Dart
// Copyright (c) 2011, 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 test program to test check that we can parse labels.
|
|
|
|
import "package:expect/expect.dart";
|
|
|
|
class Helper {
|
|
static int ticks = 0;
|
|
|
|
// Helper function to prevent endless loops in case labels or
|
|
// break/continue is broken.
|
|
static doAgain() {
|
|
++ticks;
|
|
if (ticks > 300) {
|
|
// obfuscating man's assert(false)
|
|
Expect.equals(true, false);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static test1() {
|
|
var i = 1;
|
|
while (doAgain()) {
|
|
if (i > 0) break;
|
|
return 0;
|
|
}
|
|
return 111;
|
|
}
|
|
|
|
static test2() {
|
|
// Make sure we break out to default label.
|
|
var i = 1;
|
|
L:
|
|
while (doAgain()) {
|
|
// unused label
|
|
if (i > 0) break;
|
|
return 0;
|
|
}
|
|
return 111;
|
|
}
|
|
|
|
static test3() {
|
|
// Make sure we break out of outer loop.
|
|
var i = 1;
|
|
L:
|
|
while (doAgain()) {
|
|
while (doAgain()) {
|
|
if (i > 0) break L;
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
return 111;
|
|
}
|
|
|
|
static test4() {
|
|
// Make sure we break out of inner loop.
|
|
var i = 100;
|
|
L:
|
|
while (doAgain()) {
|
|
// unused label
|
|
while (doAgain()) {
|
|
if (i > 0) break;
|
|
return 0;
|
|
}
|
|
return 111;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
static test5() {
|
|
// Make sure we jump to loop condition.
|
|
var i = 10;
|
|
while (i > 0) {
|
|
i--;
|
|
if (true) continue; // without the if the following return is dead code.
|
|
return 0;
|
|
}
|
|
return 111;
|
|
}
|
|
|
|
static test6() {
|
|
// Make sure we jump to loop condition.
|
|
L:
|
|
for (int i = 10; i > 0; i--) {
|
|
// unreferenced label, should warn
|
|
if (true) continue; // without the if the following return is dead code.
|
|
return 0;
|
|
}
|
|
// Make sure this L does not conflict with previous L.
|
|
var k = 20;
|
|
L:
|
|
while (doAgain()) {
|
|
L0:
|
|
while (doAgain()) break L; // unreferenced label L0, should warn
|
|
return 1;
|
|
}
|
|
return 111;
|
|
}
|
|
|
|
static test7() {
|
|
// Just weird stuff.
|
|
var i = 10;
|
|
L:
|
|
do {
|
|
L:
|
|
while (doAgain()) {
|
|
if (true) break L; // without the if the following line is dead code.
|
|
continue L;
|
|
}
|
|
i = 0;
|
|
continue L;
|
|
} while (i == 10 && doAgain());
|
|
return 111;
|
|
}
|
|
|
|
static test8() {
|
|
L:
|
|
while (false) {
|
|
var L = 33; // OK, shouldn't collide with label.
|
|
if (true) break L;
|
|
}
|
|
return 111;
|
|
}
|
|
|
|
static test9() {
|
|
var i = 111;
|
|
L1:
|
|
if (i == 0) {
|
|
// unreferenced label, should warn
|
|
return 0;
|
|
}
|
|
|
|
L2:
|
|
while (i == 0) {
|
|
// unreferenced label, should warn
|
|
return 0;
|
|
}
|
|
|
|
L3: // useless label, should warn
|
|
return i;
|
|
}
|
|
|
|
// Labels should be allowed on block/if/for/switch/while/do stmts.
|
|
static test10() {
|
|
int i = 111;
|
|
// block
|
|
while (doAgain()) {
|
|
L:
|
|
{
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
}
|
|
break;
|
|
}
|
|
Expect.equals(111, i);
|
|
|
|
while (doAgain()) {
|
|
L:
|
|
if (doAgain()) {
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
}
|
|
break;
|
|
}
|
|
Expect.equals(111, i);
|
|
|
|
while (doAgain()) {
|
|
L:
|
|
for (; doAgain();) {
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
}
|
|
break;
|
|
}
|
|
Expect.equals(111, i);
|
|
|
|
L:
|
|
for (i in [111]) {
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
break;
|
|
}
|
|
Expect.equals(111, i);
|
|
|
|
L:
|
|
for (var j in [111]) {
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
break;
|
|
}
|
|
Expect.equals(111, i);
|
|
|
|
while (doAgain()) {
|
|
L:
|
|
switch (i) {
|
|
case 111:
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
break;
|
|
default:
|
|
i--;
|
|
}
|
|
break;
|
|
}
|
|
Expect.equals(111, i);
|
|
|
|
while (doAgain()) {
|
|
L:
|
|
do {
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
} while (doAgain());
|
|
break;
|
|
}
|
|
Expect.equals(111, i);
|
|
|
|
while (doAgain()) {
|
|
L:
|
|
try {
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
} finally {}
|
|
break;
|
|
}
|
|
Expect.equals(111, i);
|
|
|
|
return i;
|
|
}
|
|
|
|
static test11() {
|
|
// Kind of odd, but is valid and shouldn't be flagged as useless either.
|
|
L:
|
|
break L;
|
|
return 111;
|
|
}
|
|
|
|
static test12() {
|
|
int i = 111;
|
|
|
|
// label the inner block on compound stmts
|
|
if (true)
|
|
L:
|
|
{
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
}
|
|
Expect.equals(111, i);
|
|
|
|
// loop will execute each time, but won't execute code below the break
|
|
var forCount = 0;
|
|
for (forCount = 0; forCount < 2; forCount++)
|
|
L:
|
|
{
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
break;
|
|
}
|
|
Expect.equals(111, i);
|
|
Expect.equals(forCount, 2);
|
|
|
|
for (i in [111])
|
|
L:
|
|
{
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
break;
|
|
}
|
|
Expect.equals(111, i);
|
|
|
|
for (var j in [111])
|
|
L:
|
|
{
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
break;
|
|
}
|
|
Expect.equals(111, i);
|
|
|
|
if (false) {} else
|
|
L:
|
|
{
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
}
|
|
Expect.equals(111, i);
|
|
|
|
int whileCount = 0;
|
|
while (whileCount < 2)
|
|
L:
|
|
{
|
|
whileCount++;
|
|
while (doAgain()) {
|
|
break L;
|
|
}
|
|
i--;
|
|
break;
|
|
}
|
|
Expect.equals(111, i);
|
|
Expect.equals(2, whileCount);
|
|
|
|
return i;
|
|
}
|
|
}
|
|
|
|
class LabelTest {
|
|
static testMain() {
|
|
Expect.equals(111, Helper.test1());
|
|
Expect.equals(111, Helper.test2());
|
|
Expect.equals(111, Helper.test3());
|
|
Expect.equals(111, Helper.test4());
|
|
Expect.equals(111, Helper.test5());
|
|
Expect.equals(111, Helper.test6());
|
|
Expect.equals(111, Helper.test7());
|
|
Expect.equals(111, Helper.test8());
|
|
Expect.equals(111, Helper.test9());
|
|
Expect.equals(111, Helper.test10());
|
|
Expect.equals(111, Helper.test11());
|
|
Expect.equals(111, Helper.test12());
|
|
}
|
|
}
|
|
|
|
main() {
|
|
LabelTest.testMain();
|
|
}
|