diff options
-rw-r--r-- | compiler/semstmts.nim | 9 | ||||
-rw-r--r-- | tests/controlflow/tunreachable.nim | 32 |
2 files changed, 38 insertions, 3 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 43bd11717..a006013b8 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -2447,9 +2447,12 @@ proc semStmtList(c: PContext, n: PNode, flags: TExprFlags, expectedType: PType = else: n.typ = n[i].typ if not isEmptyType(n.typ): n.transitionSonsKind(nkStmtListExpr) - if n[i].kind in nkLastBlockStmts or - n[i].kind in nkCallKinds and n[i][0].kind == nkSym and - sfNoReturn in n[i][0].sym.flags: + var m = n[i] + while m.kind in {nkStmtListExpr, nkStmtList} and m.len > 0: # from templates + m = m.lastSon + if m.kind in nkLastBlockStmts or + m.kind in nkCallKinds and m[0].kind == nkSym and + sfNoReturn in m[0].sym.flags: for j in i + 1..<n.len: case n[j].kind of nkPragma, nkCommentStmt, nkNilLit, nkEmpty, nkState: discard diff --git a/tests/controlflow/tunreachable.nim b/tests/controlflow/tunreachable.nim new file mode 100644 index 000000000..11c8595eb --- /dev/null +++ b/tests/controlflow/tunreachable.nim @@ -0,0 +1,32 @@ +discard """ + cmd: "nim check --warningAsError:UnreachableCode $file" + action: "reject" + nimout: ''' +tunreachable.nim(23, 3) Error: unreachable code after 'return' statement or '{.noReturn.}' proc [UnreachableCode] +tunreachable.nim(30, 3) 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() |