diff --git a/compiler/lookups.nim b/compiler/lookups.nim index cb7985384a..19a4da07b7 100644 --- a/compiler/lookups.nim +++ b/compiler/lookups.nim @@ -435,5 +435,5 @@ proc pickSym*(c: PContext, n: PNode; kind: TSymKind; return a a = nextOverloadIter(o, c, n) -proc isExceptAs*(n: PNode): bool = +proc isInfixAs*(n: PNode): bool = return n.kind == nkInfix and considerQuotedIdent(n[0]).s == "as" \ No newline at end of file diff --git a/compiler/semgnrc.nim b/compiler/semgnrc.nim index 42f9bd4015..bc80c41ad1 100644 --- a/compiler/semgnrc.nim +++ b/compiler/semgnrc.nim @@ -338,17 +338,15 @@ proc semGenericStmt(c: PContext, n: PNode, var a = n.sons[i] checkMinSonsLen(a, 1) var L = sonsLen(a) + openScope(c) for j in countup(0, L-2): - debug(a.sons[j]) - if a.sons[j].isExceptAs(): - openScope(c) + if a.sons[j].isInfixAs(): addTempDecl(c, getIdentNode(a.sons[j][2]), skLet) - a.sons[j] = semGenericStmt(c, a.sons[j][1], flags+{withinTypeDesc}, ctx) - closeScope(c) + a.sons[j].sons[1] = semGenericStmt(c, a.sons[j][1], flags+{withinTypeDesc}, ctx) else: a.sons[j] = semGenericStmt(c, a.sons[j], flags+{withinTypeDesc}, ctx) - debug(a) a.sons[L-1] = semGenericStmtScope(c, a.sons[L-1], flags, ctx) + closeScope(c) of nkVarSection, nkLetSection: for i in countup(0, sonsLen(n) - 1): diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 6745893065..9752ccac16 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -286,7 +286,7 @@ proc semTry(c: PContext, n: PNode): PNode = var typeNode = a.sons[j] # e.g. `Exception` var symbolNode: PNode = nil # e.g. `foobar` # Handle the case where the `Exception as foobar` syntax is used. - if typeNode.isExceptAs(): + if typeNode.isInfixAs(): typeNode = a.sons[j].sons[1] symbolNode = a.sons[j].sons[2] diff --git a/compiler/transf.nim b/compiler/transf.nim index 838b2d902d..13c6dd8fe2 100644 --- a/compiler/transf.nim +++ b/compiler/transf.nim @@ -703,7 +703,7 @@ proc transformCall(c: PTransf, n: PNode): PTransNode = proc transformExceptBranch(c: PTransf, n: PNode): PTransNode = result = transformSons(c, n) - if n[0].isExceptAs(): + if n[0].isInfixAs(): let excTypeNode = n[0][1] let actions = newTransNode(nkStmtList, n[1].info, 2) # Generating `let exc = (excType)(getCurrentException())` diff --git a/tests/exception/texcas.nim b/tests/exception/texcas.nim index 807f2c8029..a00b09a8fc 100644 --- a/tests/exception/texcas.nim +++ b/tests/exception/texcas.nim @@ -1,10 +1,25 @@ discard """ - output: '''Hello''' + output: '''Hello + Hello + ''' """ proc test[T]() = try: raise newException(T, "Hello") except T as foobar: echo(foobar.msg) + echo(declared(foobar)) + doAssert(not declared(foobar)) + +template testTemplate() = + try: + raise newException(Exception, "Hello") + except Exception as foobar: + echo(foobar.msg) + doAssert(not declared(foobar)) + +proc test2() = + testTemplate() + doAssert(not declared(foobar)) test[Exception]()