uniform half4 colorGreen, colorRed;

bool test_return() {
    do {
        return true;
        continue;     // should be eliminated
        break;        // should be eliminated
    } while (false);

    return false; // should be eliminated
}

bool test_break() {
    do {
        break;
        continue;     // should be eliminated
        return false; // should be eliminated
    } while (false);

    return true;
}

bool test_continue() {
    do {
        continue;
        break;        // should be eliminated
        return false; // should be eliminated
    } while (false);

    return true;
}

bool test_if_return() {
    do {
        if (colorGreen.g > 0) {
            return true;
        } else {
            break;
        }
        continue;
    } while (false);

    return false;
}

bool test_if_break() {
    do {
        if (colorGreen.g > 0) {
            break;
        } else {
            continue;
        }
        return false; // should be eliminated
    } while (false);

    return true;
}

bool test_else() {
    do {
        if (colorGreen.g == 0) {
            return false;
        } else {
            return true;
        }
        break;        // should be eliminated
        continue;     // should be eliminated
        return false; // should be eliminated
    } while (false);

    return false; // should be eliminated
}

bool test_loop_return() {
    // This test is technically ES2-compliant.
    // In practice, some older GPUs don't like zero-iteration loops.
    for (int x=0; x<0; ++x) {
        return false;
        return true;  // should be eliminated
        continue;     // should be eliminated
    }
    return true;
}

bool test_loop_break() {
    // This test is technically ES2-compliant.
    // In practice, the Tegra3 driver doesn't support a `break` inside of a for loop.
    for (int x=0; x<=1; ++x) {
        break;
        return false; // should be eliminated
        continue;     // should be eliminated
    }
    return true;
}


half4 main(float2 xy) {
    return (test_return() && test_break() && test_continue() &&
            test_if_return() && test_if_break() && test_else()) &&
            test_loop_return() && test_loop_break() ? colorGreen
                                                    : colorRed;
}
