diff options
author | metagn <metagngn@gmail.com> | 2024-09-26 07:34:50 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-26 06:34:50 +0200 |
commit | a27542195c9ba760d58e9d1e977313bc322a1ede (patch) | |
tree | 7ecf9c2c3386306c99f8393289769b3d1548b5a4 /tests | |
parent | 69b2a6effc9b0fd2c9de76bbea5b2dba87781a52 (diff) | |
download | Nim-a27542195c9ba760d58e9d1e977313bc322a1ede.tar.gz |
only merge valid implicit pragmas to routine AST, include templates (#24171)
fixes #19277, refs #24169, refs #18124 When pragmas are pushed to a routine, if the routine symbol AST isn't nil by the time the pushed pragmas are being processed, the pragmas are implicitly added to the symbol AST. However this is done without restriction on the pragma, if the pushed pragma isn't supposed to apply to the routine, it's still added to the routine. This is why the symbol AST for templates wasn't set before the pushed pragma processing in #18124. Now, the pragmas added to the AST are restricted to ones that apply to the given routine. This means we can set the template symbol AST earlier so that the pragmas get added to the template AST.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/pragmas/tpush.nim | 12 | ||||
-rw-r--r-- | tests/template/m19277_1.nim | 2 | ||||
-rw-r--r-- | tests/template/m19277_2.nim | 2 | ||||
-rw-r--r-- | tests/template/t19277.nim | 19 |
4 files changed, 35 insertions, 0 deletions
diff --git a/tests/pragmas/tpush.nim b/tests/pragmas/tpush.nim index a505bb32f..9c6b85c4e 100644 --- a/tests/pragmas/tpush.nim +++ b/tests/pragmas/tpush.nim @@ -125,8 +125,20 @@ foo41() {.pop.} +import macros + block: {.push deprecated.} template test() = discard test() {.pop.} + macro foo(): bool = + let ast = getImpl(bindSym"test") + var found = false + if ast[4].kind == nnkPragma: + for x in ast[4]: + if x.eqIdent"deprecated": + found = true + break + result = newLit(found) + doAssert foo() diff --git a/tests/template/m19277_1.nim b/tests/template/m19277_1.nim new file mode 100644 index 000000000..840bd4767 --- /dev/null +++ b/tests/template/m19277_1.nim @@ -0,0 +1,2 @@ +template foo*(x: untyped) = + echo "got: ", x diff --git a/tests/template/m19277_2.nim b/tests/template/m19277_2.nim new file mode 100644 index 000000000..de72dad45 --- /dev/null +++ b/tests/template/m19277_2.nim @@ -0,0 +1,2 @@ +proc foo*(a: string) = + echo "got string: ", a diff --git a/tests/template/t19277.nim b/tests/template/t19277.nim new file mode 100644 index 000000000..16435a09c --- /dev/null +++ b/tests/template/t19277.nim @@ -0,0 +1,19 @@ +discard """ + output: ''' +got: 0 +''' +""" + +# issue #19277 + +import m19277_1, m19277_2 + +template injector(val: untyped): untyped = + template subtemplate: untyped = val + subtemplate() + +template methodCall(val: untyped): untyped = val + +{.push raises: [Defect].} + +foo(injector(0).methodCall()) |