From 7bba0deb1db7a308d813237cb7166fb191afaa63 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Wed, 9 Sep 2020 14:20:10 +0200 Subject: [PATCH] fixes #15280 [backport:1.2] (#15281) * fixes #15280 [backport:1.2] * make tests green again * adapt tests (cherry picked from commit 3f00a738dbc8319b4dd2b86bf5529c096f2dd243) --- compiler/sem.nim | 2 +- tests/casestmt/tcasestmt.nim | 2 +- tests/semreject/tmixing_return_and_exprs.nim | 44 ++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 tests/semreject/tmixing_return_and_exprs.nim diff --git a/compiler/sem.nim b/compiler/sem.nim index 1ced234f57..e2ffc13089 100644 --- a/compiler/sem.nim +++ b/compiler/sem.nim @@ -183,7 +183,7 @@ proc endsInNoReturn(n: PNode): bool = var it = n while it.kind in {nkStmtList, nkStmtListExpr} and it.len > 0: it = it.lastSon - result = it.kind in nkLastBlockStmts or + result = it.kind in (nkLastBlockStmts-{nkReturnStmt}) or it.kind in nkCallKinds and it[0].kind == nkSym and sfNoReturn in it[0].sym.flags proc commonType*(x: PType, y: PNode): PType = diff --git a/tests/casestmt/tcasestmt.nim b/tests/casestmt/tcasestmt.nim index 6abea53bc6..8c6ce7a389 100644 --- a/tests/casestmt/tcasestmt.nim +++ b/tests/casestmt/tcasestmt.nim @@ -258,7 +258,7 @@ func foo(input: string): int = try: parseInt(input) except: - return + 0 func foo2(b, input: string): int = case b: diff --git a/tests/semreject/tmixing_return_and_exprs.nim b/tests/semreject/tmixing_return_and_exprs.nim new file mode 100644 index 0000000000..2848c47e4e --- /dev/null +++ b/tests/semreject/tmixing_return_and_exprs.nim @@ -0,0 +1,44 @@ +discard """ + errormsg: "expression 'len(src) shl 1' is of type 'int' and has to be used (or discarded)" + line: 19 +""" + +# bug #15280 + +type + HexFlags* {.pure.} = enum + LowerCase, ## Produce lowercase hexadecimal characters + PadOdd, ## Pads odd strings + SkipSpaces, ## Skips all the whitespace characters inside of string + SkipPrefix ## Skips `0x` and `x` prefixes at the begining of string + + +proc bytesToHex*(src: openarray[byte], dst: var openarray[char], + flags: set[HexFlags]): int = + if len(dst) == 0: + (len(src) shl 1) + else: + var halflast = false + let dstlen = len(dst) + var srclen = len(src) + + if dstlen < (srclen shl 1): + if (dstlen and 1) == 1: + srclen = (dstlen - 1) shr 1 + halflast = true + else: + srclen = (dstlen shr 1) + + let lowercase = (HexFlags.LowerCase in flags) + + var k = 0 + for i in 0 ..< srclen: + let x = int(src[i]) + inc(k, 2) + + if halflast: + let x = int(src[srclen]) + inc(k) + + return k +