// Expect 19 errors

int variable = 0;
uniform half mystery;

int if_only()                       { if (variable == 1) return 0; }
int return_on_if_but_not_else()     { if (variable == 1) return 0; else variable *= 2; }
int return_on_else_but_not_if()     { if (variable == 1) variable *= 2; else return 1; }

int for_with_conditional_return()   { for (;;) { if (variable == 1) return 0; } }
int for_with_conditional_break()    { for (;;) { if (variable == 1) break; return 0; } }
int for_with_conditional_continue() { for (;;) { if (variable == 1) continue; return 0; } }

bool do_with_conditional_return()   { do { if (mystery == 1) return true; } while(true); }
bool do_with_conditional_break()    { do { if (mystery == 1) break; return true; } while(true); }
bool do_with_conditional_continue() { do { if (mystery == 1) continue; return true; } while(true); }

bool bad_if_else_chain() {
    if (mystery == 1)
        return true;
    else if (mystery == 2)
        return false;
    else if (mystery == 3)
        return true;
    else if (mystery == 4)
        variable *= 2; // doesn't return
    else
        return true;
}


int switch_empty() {
    switch (variable) {}
}

int switch_with_no_default() {
    switch (variable) {
        case 1: return 1;
        case 2: return 2;
    }
}

int switch_with_break() {
    switch (variable) {
        case 1:  return 1;
        case 2:  break;
        default: return 3;
    }
}

int switch_with_continue() {
    for (;;) switch (variable) {
        case 1:  return 1;
        case 2:  return 2;
        default: continue;
    }
}

int switch_with_fallthrough_off_bottom() {
    switch (variable) {
        case 1:  return 1;
        case 2:  return 2;
        default:
    }
}

int switch_with_conditional_break() {
    switch (variable) {
        case 1:  if (mystery == 123) break; return 1;
        case 2:  return 2;
        default: return 3;
    }
}

int switch_with_conditional_continue() {
    for (;;) switch (variable) {
        case 1:  if (mystery == 123) ; else continue; return 1;
        case 2:  return 2;
        default: return 3;
    }
}

int switch_with_conditional_if_then_return() {
    switch (variable) {
        case 1:  if (mystery == 123) break; return 1;
        default: return 2;
    }
}

int switch_with_conditional_break_then_fallthrough() {
    switch (variable) {
        case 1:  if (mystery == 123) {} else break;
        default: return 2;
    }
}

/*%%*
function 'if_only' can exit without returning a value
function 'return_on_if_but_not_else' can exit without returning a value
function 'return_on_else_but_not_if' can exit without returning a value
function 'for_with_conditional_return' can exit without returning a value
function 'for_with_conditional_break' can exit without returning a value
function 'for_with_conditional_continue' can exit without returning a value
function 'do_with_conditional_return' can exit without returning a value
function 'do_with_conditional_break' can exit without returning a value
function 'do_with_conditional_continue' can exit without returning a value
function 'bad_if_else_chain' can exit without returning a value
function 'switch_empty' can exit without returning a value
function 'switch_with_no_default' can exit without returning a value
function 'switch_with_break' can exit without returning a value
continue statement cannot be used in a switch
function 'switch_with_continue' can exit without returning a value
function 'switch_with_fallthrough_off_bottom' can exit without returning a value
function 'switch_with_conditional_break' can exit without returning a value
continue statement cannot be used in a switch
function 'switch_with_conditional_continue' can exit without returning a value
function 'switch_with_conditional_if_then_return' can exit without returning a value
function 'switch_with_conditional_break_then_fallthrough' can exit without returning a value
*%%*/
