# # Tests of invalid return flow # # Copyright © 2022 Samuel Lidén Borell # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_empty() -> bool { } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_if(int choice) -> bool { if choice == 1 return false } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_else1(int choice) -> bool { if choice == 1 return false else { } } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_else2(int choice) -> bool { if choice == 1 { } else return true } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_elseif1(int choice) -> bool { if choice == 1 return false else if choice == 2 return true else if choice == 3 return false else if choice == 4 return true else { } } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_elseif2(int choice) -> bool { if choice == 1 return false else if choice == 2 return true else if choice == 3 { } else if choice == 4 return true else return true } func badretflow_elseif3(int choice) -> bool { if choice == 1 return false else return true # ERROR .5: warning: Unreachable statement return false } func badretflow_elseif4(int choice) -> bool { if choice == 1 return false else if choice == 2 return true else if choice == 3 return true else return true # ERROR .5: warning: Unreachable statement return false } func badretflow_block(int choice) -> bool { { if choice == 1 return false else if choice == 2 return true else if choice == 3 return true else return true } # ERROR .5: warning: Unreachable statement return false } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_switch1(int x, int y) -> int { switch x { case 1: if y < 0 return 1 else if y > 0 return -1 default: return 99 } } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_switch2(int x, int y) -> int { switch x { case 1: return 11 default: if y < 0 return 1 else if y > 0 return -1 } } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_switch3(int x) -> int { switch x { case 1: return 11 } } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_switch4(int x) -> int { switch x { case 1: return 11 case 2: return 22 } } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_switch5(int x, int y) -> int { if x < 0 { switch y { case 1: return 1 case 2: return 2 case 3: return 3 default: return 9 } } else if x < 10 { return 123 } else if x < 0 { switch y { case 1: return 11 case 2: # no return! assert x != y default: return 99 } } else { switch y { case 1: return 111 default: return 999 } } } func badretflow_switch6(int x) -> int { switch x { case 1: return 11 case 2: return 22 default: return 99 } # ERROR .5: warning: Unreachable statement return 123 } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_gototarget_last(int choice) -> bool { if choice == 1 goto skip return true skip: } func badretflow_unreachable_after_goto(int choice) -> bool { again: # ERROR .5: warning: Unreachable statements after goto goto again return true } func badretflow_goto_without_predecessor1(int choice) -> bool { return true # ERROR .3: error: goto target has no clear predecessor oops: if choice == 2 return true goto oops } func badretflow_goto_without_predecessor2(int choice) -> bool { while true { } # ERROR .3: error: goto target has no clear predecessor oops: if choice == 2 return true goto oops } func badretflow_goto_without_predecessor3(int choice) -> int { if choice == 1 return 11 else if choice == 2 return 22 else goto out # ERROR .3: error: goto target has no clear predecessor back: return 33 out: goto back } func badretflow_while_last(int choice) -> bool { if choice == 1 return false # ERROR .5: warning: Unreachable statements after return return true do { if choice == 2 return true } while false } func badretflow_while_endless1(int choice) -> bool { # ERROR .5: warning: Unreachable statements after while true { } while true { } return false } func badretflow_while_endless2(int choice) -> bool { # ERROR .5: warning: Unreachable statements after do { } while true do { } while true return false } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_while_not_endless1(int choice) -> bool { while true { if choice == 2 break } } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_while_not_endless2(int choice) -> bool { while false { } } # ERROR .6: error: Function is missing a return value (in one or more cases) func badretflow_while_not_endless3(int choice) -> bool { do { if choice == 2 break } while true } func badretflow_while_not_endless4(int choice) -> bool { # ERROR .5: warning: Unreachable statements after do { } while true do { if choice == 2 goto end } while true return false end: return true }