diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2019-05-23 19:32:44 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-23 19:32:44 +0200 |
commit | aa4cf92ae851a466317e59835b5968139b9648ed (patch) | |
tree | 4239dc6dfa19e682b2bfdfaee807ccc3c529dd24 | |
parent | 44cc5f6360c7ccc96c296948b2524bd2cdebf1f0 (diff) | |
download | Nim-aa4cf92ae851a466317e59835b5968139b9648ed.tar.gz |
fixes #11309 (#11310)
-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() |