Skip to content

Commit

Permalink
fixes #9839; fixes noReturn pragma doesn't work for non-simple templa…
Browse files Browse the repository at this point in the history
…tes (#21048)
  • Loading branch information
ringabout authored Dec 8, 2022
1 parent 4480fd3 commit c5eb3fd
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 3 deletions.
9 changes: 6 additions & 3 deletions compiler/semstmts.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
32 changes: 32 additions & 0 deletions tests/controlflow/tunreachable.nim
Original file line number Diff line number Diff line change
@@ -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()

0 comments on commit c5eb3fd

Please sign in to comment.