diff options
Diffstat (limited to 'tests/controlflow')
-rw-r--r-- | tests/controlflow/tblock1.nim | 4 | ||||
-rw-r--r-- | tests/controlflow/tbreak.nim | 44 | ||||
-rw-r--r-- | tests/controlflow/tcontinue.nim | 28 | ||||
-rw-r--r-- | tests/controlflow/tcontrolflow.nim | 116 | ||||
-rw-r--r-- | tests/controlflow/tnestif.nim | 24 | ||||
-rw-r--r-- | tests/controlflow/tstatret.nim | 9 | ||||
-rw-r--r-- | tests/controlflow/tunamedbreak.nim | 15 | ||||
-rw-r--r-- | tests/controlflow/tunreachable.nim | 79 | ||||
-rw-r--r-- | tests/controlflow/tunreachable2.nim | 12 |
9 files changed, 226 insertions, 105 deletions
diff --git a/tests/controlflow/tblock1.nim b/tests/controlflow/tblock1.nim index e3a780dfe..70c844513 100644 --- a/tests/controlflow/tblock1.nim +++ b/tests/controlflow/tblock1.nim @@ -1,7 +1,7 @@ discard """ + errormsg: "undeclared identifier: \'ha\'" file: "tblock1.nim" line: 14 - errormsg: "undeclared identifier: \'ha\'" """ # check for forward label and # for failure when label is not declared @@ -14,5 +14,3 @@ proc main = break ha #ERROR main() - - diff --git a/tests/controlflow/tbreak.nim b/tests/controlflow/tbreak.nim deleted file mode 100644 index 7deab4caf..000000000 --- a/tests/controlflow/tbreak.nim +++ /dev/null @@ -1,44 +0,0 @@ -discard """ - output: '''10 -true true -true false -false true -false false''' -""" - -var - x = false - run = true - -while run: - run = false - block myblock: - if true: - break - echo "leaving myblock" - x = true -doAssert(x) - -# bug #1418 -iterator foo: int = - for x in 0 .. 9: - for y in [10,20,30,40,50,60,70,80,90]: - yield x + y - -for p in foo(): - echo p - break - -iterator permutations: int = - yield 10 - -for p in permutations(): - break - -# regression: -proc main = - for x in [true, false]: - for y in [true, false]: - echo x, " ", y - -main() diff --git a/tests/controlflow/tcontinue.nim b/tests/controlflow/tcontinue.nim deleted file mode 100644 index ac4fdc2de..000000000 --- a/tests/controlflow/tcontinue.nim +++ /dev/null @@ -1,28 +0,0 @@ -discard """ - output: "came here" -""" - -var i = 0 -while i < 400: - - if i == 10: break - elif i == 3: - inc i - continue - inc i - -var f = "failure" -var j = 0 -while j < 300: - for x in 0..34: - if j < 300: continue - if x == 10: - echo "failure: should never happen" - break - f = "came here" - break - -if i == 10: - echo f -else: - echo "failure" diff --git a/tests/controlflow/tcontrolflow.nim b/tests/controlflow/tcontrolflow.nim new file mode 100644 index 000000000..dd21a2bb6 --- /dev/null +++ b/tests/controlflow/tcontrolflow.nim @@ -0,0 +1,116 @@ +discard """ + output: ''' +10 +true true +true false +false true +false false +i == 2 +''' +""" + + +block tbreak: + var + x = false + run = true + + while run: + run = false + block myblock: + if true: + break myblock + echo "leaving myblock" + x = true + doAssert(x) + + # bug #1418 + iterator foo: int = + for x in 0 .. 9: + for y in [10,20,30,40,50,60,70,80,90]: + yield x + y + + for p in foo(): + echo p + break + + iterator permutations: int = + yield 10 + + for p in permutations(): + break + + # regression: + proc main = + for x in [true, false]: + for y in [true, false]: + echo x, " ", y + + main() + + + +block tcontinue: + var i = 0 + while i < 400: + + if i == 10: break + elif i == 3: + inc i + continue + inc i + + var f = "failure" + var j = 0 + while j < 300: + for x in 0..34: + if j < 300: continue + if x == 10: + echo "failure: should never happen" + break + f = "came here" + break + + if i == 10: + doAssert f == "came here" + else: + echo "failure" + + + +block tnestif: + var + x, y: int + x = 2 + if x == 0: + write(stdout, "i == 0") + if y == 0: + writeLine(stdout, x) + else: + writeLine(stdout, y) + elif x == 1: + writeLine(stdout, "i == 1") + elif x == 2: + writeLine(stdout, "i == 2") + else: + writeLine(stdout, "looks like Python") + #OUT i == 2 + +# bug https://github.com/nim-lang/RFCs/issues/451 +for i in 1..2: # works + break + +block: # works + for i in 1..2: + break + +block: # works + block: + discard 12 + 3 + for i in 1..2: + break + +block named: # works + if true: + break named + doAssert false, "not reached" diff --git a/tests/controlflow/tnestif.nim b/tests/controlflow/tnestif.nim deleted file mode 100644 index 3d8adb337..000000000 --- a/tests/controlflow/tnestif.nim +++ /dev/null @@ -1,24 +0,0 @@ -discard """ - file: "tnestif.nim" - output: "i == 2" -""" -# test nested ifs - -var - x, y: int -x = 2 -if x == 0: - write(stdout, "i == 0") - if y == 0: - write(stdout, x) - else: - write(stdout, y) -elif x == 1: - write(stdout, "i == 1") -elif x == 2: - write(stdout, "i == 2") -else: - write(stdout, "looks like Python") -#OUT i == 2 - - diff --git a/tests/controlflow/tstatret.nim b/tests/controlflow/tstatret.nim index 04cac9966..a3558e6f4 100644 --- a/tests/controlflow/tstatret.nim +++ b/tests/controlflow/tstatret.nim @@ -1,12 +1,9 @@ discard """ - file: "tstatret.nim" - line: 9 - errormsg: "unreachable statement after 'return'" + nimout: ''' +tstatret.nim(9, 7) Warning: unreachable code after 'return' statement or '{.noReturn.}' proc [UnreachableCode] +''' """ # no statement after return proc main() = return echo("huch?") #ERROR_MSG statement not allowed after - - - diff --git a/tests/controlflow/tunamedbreak.nim b/tests/controlflow/tunamedbreak.nim new file mode 100644 index 000000000..46113cabc --- /dev/null +++ b/tests/controlflow/tunamedbreak.nim @@ -0,0 +1,15 @@ + +discard """ + cmd: "nim check $file" + action: "reject" + nimout: ''' +tunamedbreak.nim(12, 5) Error: Using an unnamed break in a block is deprecated; Use a named block with a named break instead [UnnamedBreak] +tunamedbreak.nim(15, 3) Error: Using an unnamed break in a block is deprecated; Use a named block with a named break instead [UnnamedBreak] + ''' +""" +for i in 1..2: # errors + block: + break + +block: # errors + break diff --git a/tests/controlflow/tunreachable.nim b/tests/controlflow/tunreachable.nim new file mode 100644 index 000000000..06321ce8a --- /dev/null +++ b/tests/controlflow/tunreachable.nim @@ -0,0 +1,79 @@ +discard """ + cmd: "nim check --warningAsError:UnreachableCode $file" + action: "reject" + nimout: ''' +tunreachable.nim(26, 3) Error: unreachable code after 'return' statement or '{.noReturn.}' proc [UnreachableCode] +tunreachable.nim(33, 3) Error: unreachable code after 'return' statement or '{.noReturn.}' proc [UnreachableCode] +tunreachable.nim(42, 3) Error: unreachable code after 'return' statement or '{.noReturn.}' proc [UnreachableCode] +tunreachable.nim(65, 5) Error: unreachable code after 'return' statement or '{.noReturn.}' proc [UnreachableCode] +tunreachable.nim(77, 5) Error: unreachable code after 'return' statement or '{.noReturn.}' proc [UnreachableCode] +''' +""" + +# bug #9839 +template myquit1():untyped= + ## foo + quit(1) +template myquit2():untyped= + echo 123 + myquit1() + +proc main1()= + + # BUG: uncommenting this doesn't give `Error: unreachable statement` + myquit2() + + echo "after" + +main1() + +proc main2() = + myquit1() + + echo "after" + +main2() + +proc main3() = + if true: + return + else: + return + echo "after" + +main3() + + +block: + # Cases like strings are not checked for exhaustiveness unless they have an else + proc main4(x: string) = + case x + of "a": + return + # reachable + echo "after" + + main4("a") + + proc main5(x: string) = + case x + of "a": + return + else: + return + # unreachable + echo "after" + + main5("a") + +block: + # In this case no else is needed because it's exhaustive + proc exhaustive(x: bool) = + case x + of true: + return + of false: + return + echo "after" + + exhaustive(true) diff --git a/tests/controlflow/tunreachable2.nim b/tests/controlflow/tunreachable2.nim new file mode 100644 index 000000000..a658880f0 --- /dev/null +++ b/tests/controlflow/tunreachable2.nim @@ -0,0 +1,12 @@ +discard """ + matrix: "--warningAsError:UnreachableCode" +""" + +proc test(): bool = + block okay: + if true: break okay + return false + + return true # Line 7 is here + +doAssert test() |