| uniform half4 colorGreen, colorRed; |
| |
| bool return_in_one_case(int x) { |
| int val = 0; |
| switch (x) { |
| case 1: |
| ++val; |
| return false; |
| ++val; // unreachable |
| default: ++val; |
| } |
| |
| // reachable |
| return val == 1; |
| } |
| |
| bool return_in_default(int x) { |
| int val = 0; |
| switch (x) { |
| default: return true; |
| } |
| |
| // unreachable |
| ++val; |
| return val == 1; |
| } |
| |
| bool return_in_every_case(int x) { |
| int val = 0; |
| switch (x) { |
| case 1: return false; |
| default: return true; |
| } |
| |
| // unreachable |
| ++val; |
| return val == 1; |
| } |
| |
| bool return_in_every_case_no_default(int x) { |
| int val = 0; |
| switch (x) { |
| case 1: return false; |
| case 2: return true; |
| } |
| |
| // reachable |
| ++val; |
| return val == 1; |
| } |
| |
| bool case_has_break_before_return(int x) { |
| int val = 0; |
| switch (x) { |
| case 1: |
| break; |
| return false; // unreachable |
| case 2: return true; |
| default: return true; |
| } |
| |
| // reachable |
| ++val; |
| return val == 1; |
| } |
| |
| bool case_has_break_after_return(int x) { |
| int val = 0; |
| switch (x) { |
| case 1: |
| return false; |
| break; // unreachable |
| case 2: return true; |
| default: return true; |
| } |
| |
| // unreachable |
| ++val; |
| return val == 1; |
| } |
| |
| bool no_return_in_default(int x) { |
| int val = 0; |
| switch (x) { |
| case 1: return false; |
| case 2: return true; |
| default: break; |
| } |
| |
| // reachable |
| ++val; |
| return val == 1; |
| } |
| |
| bool empty_default(int x) { |
| int val = 0; |
| switch (x) { |
| case 1: return false; |
| case 2: return true; |
| default: |
| } |
| |
| // reachable |
| ++val; |
| return val == 1; |
| } |
| |
| bool return_with_fallthrough(int x) { |
| int val = 0; |
| switch (x) { |
| case 1: |
| case 2: return true; |
| default: return false; |
| } |
| |
| // unreachable |
| ++val; |
| return val == 1; |
| } |
| |
| bool fallthrough_ends_in_break(int x) { |
| int val = 0; |
| switch (x) { |
| case 1: |
| case 2: break; |
| default: return false; |
| } |
| |
| // reachable |
| ++val; |
| return val == 1; |
| } |
| |
| bool fallthrough_to_default_with_break(int x) { |
| int val = 0; |
| switch (x) { |
| case 1: |
| case 2: |
| default: break; |
| } |
| |
| // reachable |
| ++val; |
| return val == 1; |
| } |
| |
| bool fallthrough_to_default_with_return(int x) { |
| int val = 0; |
| switch (x) { |
| case 1: |
| case 2: |
| default: return true; |
| } |
| |
| // unreachable |
| ++val; |
| return val == 1; |
| } |
| |
| bool fallthrough_with_loop_break(int x) { |
| int val = 0; |
| switch (x) { |
| case 1: for (int i = 0; i < 5; ++i) { |
| ++val; |
| break; // break only applies to loop, should fallthrough |
| } |
| case 2: |
| default: return true; |
| } |
| |
| // unreachable |
| ++val; |
| return val == 1; |
| } |
| |
| bool fallthrough_with_loop_continue(int x) { |
| int val = 0; |
| switch (x) { |
| case 1: for (int i = 0; i < 5; ++i) { |
| ++val; |
| continue; // continue only applies to loop, should fallthrough |
| } |
| case 2: |
| default: return true; |
| } |
| |
| // unreachable |
| ++val; |
| return val == 1; |
| } |
| |
| half4 main(float2 coords) { |
| int x = int(colorGreen.g); |
| return (return_in_one_case(x) && |
| return_in_default(x) && |
| return_in_every_case(x) && |
| return_in_every_case_no_default(x) && |
| case_has_break_before_return(x) && |
| case_has_break_after_return(x) && |
| no_return_in_default(x) && |
| empty_default(x) && |
| return_with_fallthrough(x) && |
| fallthrough_ends_in_break(x) && |
| fallthrough_to_default_with_break(x) && |
| fallthrough_to_default_with_return(x) && |
| fallthrough_with_loop_break(x) && |
| fallthrough_with_loop_continue(x)) ? colorGreen : colorRed; |
| } |