Render bug: if expression with statement list expression as condition (#8375)

* Fixes #8348
This commit is contained in:
cooldome 2018-07-21 13:01:47 +02:00 • committed by Andreas Rumpf
commit ec02940185
3 changed files with 29 additions and 5 deletions

View file

@ -568,6 +568,7 @@ proc parsePar(p: var TParser): PNode =
result = newNodeP(nkPar, p)
getTok(p)
optInd(p, result)
flexComment(p, result)
if p.tok.tokType in {tkDiscard, tkInclude, tkIf, tkWhile, tkCase,
tkTry, tkDefer, tkFinally, tkExcept, tkFor, tkBlock,
tkConst, tkLet, tkWhen, tkVar,

View file

@ -634,9 +634,16 @@ proc gstmts(g: var TSrcGen, n: PNode, c: TContext, doIndent=true) =
optNL(g)
proc gcond(g: var TSrcGen, n: PNode) =
if n.kind == nkStmtListExpr:
put(g, tkParLe, "(")
gsub(g, n)
if n.kind == nkStmtListExpr:
put(g, tkParRi, ")")
proc gif(g: var TSrcGen, n: PNode) =
var c: TContext
gsub(g, n.sons[0].sons[0])
gcond(g, n.sons[0].sons[0])
initContext(c)
putWithSpace(g, tkColon, ":")
if longMode(g, n) or (lsub(g, n.sons[0].sons[1]) + g.lineLen > MaxLineLen):
@ -651,7 +658,7 @@ proc gif(g: var TSrcGen, n: PNode) =
proc gwhile(g: var TSrcGen, n: PNode) =
var c: TContext
putWithSpace(g, tkWhile, "while")
gsub(g, n.sons[0])
gcond(g, n.sons[0])
putWithSpace(g, tkColon, ":")
initContext(c)
if longMode(g, n) or (lsub(g, n.sons[1]) + g.lineLen > MaxLineLen):
@ -715,7 +722,7 @@ proc gcase(g: var TSrcGen, n: PNode) =
var last = if n.sons[length-1].kind == nkElse: -2 else: -1
if longMode(g, n, 0, last): incl(c.flags, rfLongMode)
putWithSpace(g, tkCase, "case")
gsub(g, n.sons[0])
gcond(g, n.sons[0])
gcoms(g)
optNL(g)
gsons(g, n, c, 1, last)
@ -1102,13 +1109,13 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
put(g, tkAccent, "`")
of nkIfExpr:
putWithSpace(g, tkIf, "if")
if n.len > 0: gsub(g, n.sons[0], 0)
if n.len > 0: gcond(g, n.sons[0].sons[0])
putWithSpace(g, tkColon, ":")
if n.len > 0: gsub(g, n.sons[0], 1)
gsons(g, n, emptyContext, 1)
of nkElifExpr:
putWithSpace(g, tkElif, " elif")
gsub(g, n, 0)
gcond(g, n[0])
putWithSpace(g, tkColon, ":")
gsub(g, n, 1)
of nkElseExpr:

View file

@ -57,5 +57,21 @@ proc test_block(x, y : int): int =
result = x
result = y
#------------------------------------
# bugs #8348
template `>`(x, y: untyped): untyped =
## "is greater" operator. This is the same as ``y < x``.
y < x
proc test_cond_stmtlist(x, y: int): int =
result = x
if x > y:
result = x
repr_and_parse(one_if_proc)
repr_and_parse(test_block)
repr_and_parse(test_cond_stmtlist)