diff options
-rw-r--r-- | compiler/cgen.nim | 10 | ||||
-rw-r--r-- | tests/exception/tshow_real_exception_name.nim | 28 |
2 files changed, 38 insertions, 0 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 0585a2be0..be155df8d 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -357,6 +357,16 @@ proc genObjectInit(p: BProc, section: TCProcSection, t: PType, a: TLoc, var r = if takeAddr: addrLoc(p.config, a) else: rdLoc(a) linefmt(p, section, "#objectInit($1, $2);$n", [r, genTypeInfo(p.module, t, a.lode.info)]) + if isException(t): + var r = rdLoc(a) + if not takeAddr: r = "(*$1)" % [r] + var s = skipTypes(t, abstractInst) + if not p.module.compileToCpp: + while s.kind == tyObject and s.sons[0] != nil and s.sym.magic != mException: + add(r, ".Sup") + s = skipTypes(s.sons[0], skipPtrs) + linefmt(p, section, "$1.name = $2;$n", [r, makeCString(t.skipTypes(abstractInst).sym.name.s)]) + type TAssignmentFlag = enum needToCopy diff --git a/tests/exception/tshow_real_exception_name.nim b/tests/exception/tshow_real_exception_name.nim new file mode 100644 index 000000000..1a708dbd6 --- /dev/null +++ b/tests/exception/tshow_real_exception_name.nim @@ -0,0 +1,28 @@ +discard """ + outputsub: "CustomChildError" + exitcode: 1 +""" + +type + CustomError* = object of Exception + CustomChildError* = object of CustomError + + FutureBase* = ref object of RootObj + error*: ref Exception + + Future*[T] = ref object of FutureBase + v: T + +proc fail[T](future: Future[T], error: ref Exception) = + future.error = error + +proc w1(): Future[int] = + result = Future[int]() + result.fail(newException(CustomChildError, "abc")) + +proc main = + var fut = w1() + if true: + raise fut.error + +main() |