mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
Merge branch 'Fixes-7845' of https://github.com/cooldome/Nim into cooldome-Fixes-7845
This commit is contained in:
@@ -1714,8 +1714,7 @@ proc toVar*(typ: PType): PType =
|
||||
proc toRef*(typ: PType): PType =
|
||||
## If ``typ`` is a tyObject then it is converted into a `ref <typ>` and
|
||||
## returned. Otherwise ``typ`` is simply returned as-is.
|
||||
result = typ
|
||||
if typ.kind == tyObject:
|
||||
if typ.skipTypes({tyAlias, tyGenericInst}).kind == tyObject:
|
||||
result = newType(tyRef, typ.owner)
|
||||
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
|
||||
## cases should be a ``tyObject``).
|
||||
## Otherwise ``typ`` is simply returned as-is.
|
||||
result = typ
|
||||
if result.kind == tyRef:
|
||||
result = result.lastSon
|
||||
let t = typ.skipTypes({tyAlias, tyGenericInst})
|
||||
if t.kind == tyRef: t.lastSon
|
||||
else: typ
|
||||
|
||||
proc isException*(t: PType): bool =
|
||||
# check if `y` is object type and it inherits from Exception
|
||||
assert(t != nil)
|
||||
|
||||
if t.kind != tyObject:
|
||||
if t.kind notin {tyObject, tyGenericInst}:
|
||||
return false
|
||||
|
||||
var base = t
|
||||
|
||||
@@ -823,9 +823,10 @@ proc semRaise(c: PContext, n: PNode): PNode =
|
||||
checkSonsLen(n, 1, c.config)
|
||||
if n[0].kind != nkEmpty:
|
||||
n[0] = semExprWithType(c, n[0])
|
||||
let typ = n[0].typ
|
||||
var typ = n[0].typ
|
||||
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)
|
||||
if typ.len > 0 and not isException(typ.lastSon):
|
||||
localError(c.config, n.info, "raised object of type $1 does not inherit from Exception",
|
||||
|
||||
@@ -4,6 +4,8 @@ discard """
|
||||
type
|
||||
ESomething = object of Exception
|
||||
ESomeOtherErr = object of Exception
|
||||
ESomethingGen[T] = object of Exception
|
||||
ESomethingGenRef[T] = ref object of Exception
|
||||
|
||||
proc genErrors(s: string) =
|
||||
if s == "error!":
|
||||
@@ -27,4 +29,17 @@ proc blah(): int =
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user