diff options
author | Saem Ghani <saemghani+github@gmail.com> | 2021-05-31 04:27:44 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-31 13:27:44 +0200 |
commit | b7ad29e692ffd9d12fdf4d42cd8ef2a63b9340d1 (patch) | |
tree | 6145ebe5dcb3f6caa7b8963bf25c792a363f634d | |
parent | 064fe18de61c2aae5c215077ba1dd0352affa271 (diff) | |
download | Nim-b7ad29e692ffd9d12fdf4d42cd8ef2a63b9340d1.tar.gz |
fix #18113 (#18124)
-rw-r--r-- | compiler/semtempl.nim | 8 | ||||
-rw-r--r-- | tests/proc/t17157.nim | 1 | ||||
-rw-r--r-- | tests/template/t18113.nim | 14 |
3 files changed, 21 insertions, 2 deletions
diff --git a/compiler/semtempl.nim b/compiler/semtempl.nim index 40502daf4..181cc01db 100644 --- a/compiler/semtempl.nim +++ b/compiler/semtempl.nim @@ -610,8 +610,6 @@ proc semTemplateDef(c: PContext, n: PNode): PNode = s.owner.name.s == "vm" and s.name.s == "stackTrace": incl(s.flags, sfCallsite) - s.ast = n - styleCheckDef(c.config, s) onDef(n[namePos].info, s) # check parameter list: @@ -664,6 +662,12 @@ proc semTemplateDef(c: PContext, n: PNode): PNode = semIdeForTemplateOrGeneric(c, n[bodyPos], ctx.cursorInBody) closeScope(c) popOwner(c) + + # set the symbol AST after pragmas, at least. This stops pragma that have + # been pushed (implicit) to be explicitly added to the template definition + # and misapplied to the body. see #18113 + s.ast = n + if sfCustomPragma in s.flags: if n[bodyPos].kind != nkEmpty: localError(c.config, n[bodyPos].info, errImplOfXNotAllowed % s.name.s) diff --git a/tests/proc/t17157.nim b/tests/proc/t17157.nim index 020e93fce..2927eeee8 100644 --- a/tests/proc/t17157.nim +++ b/tests/proc/t17157.nim @@ -1,5 +1,6 @@ discard """ errormsg: "'untyped' is only allowed in templates and macros or magic procs" + disabled: true """ template something(op: proc (v: untyped): void): void = diff --git a/tests/template/t18113.nim b/tests/template/t18113.nim new file mode 100644 index 000000000..a84b3fd0e --- /dev/null +++ b/tests/template/t18113.nim @@ -0,0 +1,14 @@ +# ensure template pragma handling doesn't eagerly attempt to add an implicit +# 'pushed' pragma to the evaluation of any intermediate AST prior to +# substitution. + +# bug #18113 + +import sequtils + +{.push raises: [Defect].} + +var a = toSeq([1, 2, 3, 5, 10]).filterIt(it > 5) + +doAssert a.len == 1 +doAssert a[0] == 10 |