123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- 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"
|