diff options
Diffstat (limited to 'tests/ccgbugs/tcodegenbug1.nim')
-rw-r--r-- | tests/ccgbugs/tcodegenbug1.nim | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/tests/ccgbugs/tcodegenbug1.nim b/tests/ccgbugs/tcodegenbug1.nim new file mode 100644 index 000000000..d2ab97ede --- /dev/null +++ b/tests/ccgbugs/tcodegenbug1.nim @@ -0,0 +1,185 @@ +discard """ + matrix: "--mm:refc" + output: '''obj = (inner: (kind: Just, id: 7)) +obj.inner.id = 7 +id = 7 +obj = (inner: (kind: Just, id: 7)) +2 +(a: "a", b: "b", c: "") +caught +(a: "a", b: "b", c: "")''' +""" + +# bug #6960 + +import sugar +type + Kind = enum None, Just, Huge + Inner = object + case kind: Kind + of None: discard + of Just: id: int + of Huge: a,b,c,d,e,f: string + Outer = object + inner: Inner + + +proc shouldDoNothing(id: int): Inner = + dump id + Inner(kind: Just, id: id) + +var obj = Outer(inner: Inner(kind: Just, id: 7)) +dump obj +dump obj.inner.id +obj.inner = shouldDoNothing(obj.inner.id) +dump obj + +import os + +type + TStatusEnum* = enum + sUnknown = -1, sBuildFailure, sBuildInProgress, sBuildSuccess, + sTestFailure, sTestInProgress, sTestSuccess, # ORDER MATTERS! + sDocGenFailure, sDocGenInProgress, sDocGenSuccess, + sCSrcGenFailure, sCSrcGenInProgress, sCSrcGenSuccess + + TStatus* = object + status*: TStatusEnum + desc*: string + hash*: string + +proc initStatus*(): TStatus = + result.status = sUnknown + result.desc = "" + result.hash = "" + +proc isInProgress*(status: TStatusEnum): bool = + return status in {sBuildInProgress, sTestInProgress, sDocGenInProgress, + sCSrcGenInProgress} + +proc `$`*(status: TStatusEnum): string = + case status + of sBuildFailure: + return "build failure" + of sBuildInProgress: + return "build in progress" + of sBuildSuccess: + return "build finished" + of sTestFailure: + return "testing failure" + of sTestInProgress: + return "testing in progress" + of sTestSuccess: + return "testing finished" + of sDocGenFailure: + return "documentation generation failed" + of sDocGenInProgress: + return "generating documentation" + of sDocGenSuccess: + return "documentation generation succeeded" + of sCSrcGenFailure: + return "csource generation failed" + of sCSrcGenInProgress: + return "csource generation in progress" + of sCSrcGenSuccess: + return "csource generation succeeded" + of sUnknown: + return "unknown" + +proc makeCommitPath*(platform, hash: string): string = + return platform / "nim_" & hash.substr(0, 11) # 11 Chars. + +type + TFlag = enum + A, B, C, D + + TFlags = set[TFlag] + + TObj = object + x: int + flags: TFlags + +# have a proc taking TFlags as param and returning object having TFlags field +proc foo(flags: TFlags): TObj = nil + + +# bug #5137 +type + MyInt {.importc: "int".} = object + MyIntDistinct = distinct MyInt + +proc bug5137(d: MyIntDistinct) = + discard d.MyInt + +#------------------------------------- +# bug #8979 + +type + MyKind = enum + Fixed, Float + + MyObject = object + someInt: int + case kind: MyKind + of Float: index: string + of Fixed: nil + + MyResult = object + val: array[0..1, string] + vis: set[0..1] + +import macros + +func myfunc(obj: MyObject): MyResult {.raises: [].} = + template index: auto = + case obj.kind: + of Float: $obj.index + of Fixed: "Fixed" + macro to_str(a: untyped): string = + result = newStrLitNode(a.repr) + result.val[0] = index + result.val[1] = to_str(obj.kind + Ola) + +let x = MyObject(someInt: 10, kind: Fixed) +echo myfunc(x).val.len + +# bug #14126 + +type X = object + a, b, c: string + +proc f(): X = + result.a = "a" + result.b = "b" + raise (ref ValueError)() + +proc ohmanNoNRVO = + var x: X + x.a = "1" + x.b = "2" + x.c = "3" + + try: + x = f() + except: + discard + + echo x + # once NVRO is sorted out, x.c == "3" + doAssert x.c == "", "shouldn't modify x if f raises" + +ohmanNoNRVO() + +proc ohmanNoNRVO2(x: var X) = + x.a = "1" + x.c = "3" + x = f() + +var xgg: X +try: + ohmanNoNRVO2(xgg) +except: + echo "caught" +echo xgg +# once NVRO is sorted out, xgg.c == "3" +doAssert xgg.c == "", "this assert will fail" |