diff options
-rw-r--r-- | compiler/sem.nim | 2 | ||||
-rw-r--r-- | tests/arc/tmovebug.nim | 6 | ||||
-rw-r--r-- | tests/casestmt/tcasestmt.nim | 2 | ||||
-rw-r--r-- | tests/semreject/tmixing_return_and_exprs.nim | 44 |
4 files changed, 49 insertions, 5 deletions
diff --git a/compiler/sem.nim b/compiler/sem.nim index 705e1b72c..bc6119460 100644 --- a/compiler/sem.nim +++ b/compiler/sem.nim @@ -184,7 +184,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/arc/tmovebug.nim b/tests/arc/tmovebug.nim index 3b7a7c5df..c735ea1eb 100644 --- a/tests/arc/tmovebug.nim +++ b/tests/arc/tmovebug.nim @@ -502,7 +502,7 @@ weirdScopes() # bug #14985 proc getScope(): string = if true: - return "hi" + "hi" else: "else" @@ -512,14 +512,14 @@ proc getScope3(): string = try: "try" except: - return "except" + "except" echo getScope3() proc getScope2(): string = case true of true: - return "bye" + "bye" else: "else" diff --git a/tests/casestmt/tcasestmt.nim b/tests/casestmt/tcasestmt.nim index 53cccdb64..2151892aa 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 000000000..2848c47e4 --- /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 + |