import org.checkerframework.common.value.qual.IntRange;

// Because the analysis of loops isn't precise enough, the Value Checker issues
// warnings on this test case. So, suppress those warnings, but run the tests
// to make sure that dataflow reaches a fixed point.
@SuppressWarnings("value")
public class NestedLoops {
    void test1() {
        int doWhileIndex = 0;
        do {
            for (int forIndex = 0; forIndex < doWhileIndex; forIndex++) {
                System.out.print("Hello");
                int whileIndex = 0;
                while (whileIndex < forIndex) {
                    whileIndex++;
                }
            }
            doWhileIndex++;
        } while (doWhileIndex < Integer.MAX_VALUE);
    }

    void test2() {
        int doWhileIndex = 0;
        do {
            for (int forIndex = 0; forIndex < Integer.MAX_VALUE; forIndex++) {
                System.out.print("Hello");
                int whileIndex = 0;
                while (whileIndex < Integer.MAX_VALUE) {
                    whileIndex++;
                }
            }
            doWhileIndex++;
        } while (doWhileIndex < Integer.MAX_VALUE);
    }

    void test3() {
        int doWhileIndex = 0;
        int forIndex;
        int whileIndex = 0;

        do {
            @IntRange(to = 2999) int a = doWhileIndex;
            for (forIndex = 0; forIndex < 4000; forIndex++) {

                @IntRange(to = 3999) int b = forIndex;
                System.out.print("Hello");
                whileIndex = 0;
                while (whileIndex < 5000) {
                    @IntRange(to = 4999) int c = whileIndex;
                    whileIndex++;
                }
            }
            doWhileIndex++;
        } while (doWhileIndex < 3000);
    }
}
