summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2019-05-23 19:32:44 +0200
committerGitHub <noreply@github.com>2019-05-23 19:32:44 +0200
commitaa4cf92ae851a466317e59835b5968139b9648ed (patch)
tree4239dc6dfa19e682b2bfdfaee807ccc3c529dd24
parent44cc5f6360c7ccc96c296948b2524bd2cdebf1f0 (diff)
downloadNim-aa4cf92ae851a466317e59835b5968139b9648ed.tar.gz
fixes #11309 (#11310)
-rw-r--r--compiler/cgen.nim10
-rw-r--r--tests/exception/tshow_real_exception_name.nim28
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()