Merge branch 'Fixes-7845' of https://github.com/cooldome/Nim into cooldome-Fixes-7845

This commit is contained in:
Araq 2018-10-15 11:50:12 +02:00
commit bf01d7136e
3 changed files with 23 additions and 8 deletions

View file

@ -1714,8 +1714,7 @@ proc toVar*(typ: PType): PType =
proc toRef*(typ: PType): PType = proc toRef*(typ: PType): PType =
## If ``typ`` is a tyObject then it is converted into a `ref <typ>` and ## If ``typ`` is a tyObject then it is converted into a `ref <typ>` and
## returned. Otherwise ``typ`` is simply returned as-is. ## returned. Otherwise ``typ`` is simply returned as-is.
result = typ if typ.skipTypes({tyAlias, tyGenericInst}).kind == tyObject:
if typ.kind == tyObject:
result = newType(tyRef, typ.owner) result = newType(tyRef, typ.owner)
rawAddSon(result, typ) rawAddSon(result, typ)
@ -1723,15 +1722,15 @@ proc toObject*(typ: PType): PType =
## If ``typ`` is a tyRef then its immediate son is returned (which in many ## If ``typ`` is a tyRef then its immediate son is returned (which in many
## cases should be a ``tyObject``). ## cases should be a ``tyObject``).
## Otherwise ``typ`` is simply returned as-is. ## Otherwise ``typ`` is simply returned as-is.
result = typ let t = typ.skipTypes({tyAlias, tyGenericInst})
if result.kind == tyRef: if t.kind == tyRef: t.lastSon
result = result.lastSon else: typ
proc isException*(t: PType): bool = proc isException*(t: PType): bool =
# check if `y` is object type and it inherits from Exception # check if `y` is object type and it inherits from Exception
assert(t != nil) assert(t != nil)
if t.kind != tyObject: if t.kind notin {tyObject, tyGenericInst}:
return false return false
var base = t var base = t

View file

@ -823,9 +823,10 @@ proc semRaise(c: PContext, n: PNode): PNode =
checkSonsLen(n, 1, c.config) checkSonsLen(n, 1, c.config)
if n[0].kind != nkEmpty: if n[0].kind != nkEmpty:
n[0] = semExprWithType(c, n[0]) n[0] = semExprWithType(c, n[0])
let typ = n[0].typ var typ = n[0].typ
if not isImportedException(typ, c.config): if not isImportedException(typ, c.config):
if typ.kind != tyRef or typ.lastSon.kind != tyObject: typ = typ.skipTypes({tyAlias, tyGenericInst})
if typ.kind != tyRef:
localError(c.config, n.info, errExprCannotBeRaised) localError(c.config, n.info, errExprCannotBeRaised)
if typ.len > 0 and not isException(typ.lastSon): if typ.len > 0 and not isException(typ.lastSon):
localError(c.config, n.info, "raised object of type $1 does not inherit from Exception", localError(c.config, n.info, "raised object of type $1 does not inherit from Exception",

View file

@ -4,6 +4,8 @@ discard """
type type
ESomething = object of Exception ESomething = object of Exception
ESomeOtherErr = object of Exception ESomeOtherErr = object of Exception
ESomethingGen[T] = object of Exception
ESomethingGenRef[T] = ref object of Exception
proc genErrors(s: string) = proc genErrors(s: string) =
if s == "error!": if s == "error!":
@ -27,4 +29,17 @@ proc blah(): int =
echo blah() echo blah()
# Issue #7845, raise generic exception
var x: ref ESomethingGen[int]
new(x)
try:
raise x
except ESomethingGen[int] as e:
discard
try:
raise new(ESomethingGenRef[int])
except ESomethingGenRef[int] as e:
discard
except:
discard