From eb3aa70ffa7cdb6fe164a144aecfeacf9ae3274c Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Mon, 20 Nov 2023 00:53:25 +0800 Subject: [PATCH] =?UTF-8?q?fixes=20#22939;=20fixes=20#16890;=20push=20shou?= =?UTF-8?q?ld=20but=20doesn't=20apply=20to=20importc=20=E2=80=A6=20(#22944?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …var/let symbols fixes #22939 fixes #16890 Besides, it was applied to let/const/var with pragmas, now it is universally applied. ```nim {.push exportc.} proc foo = let bar = 12 echo bar {.pop.} ``` For example, the `bar` variable will be affected by `exportc`. (cherry picked from commit cecaf9c56b1240a44a4de837e03694a0c55ec379) --- compiler/semtypes.nim | 6 ++++++ tests/nimdoc/m13129.nim | 1 + tests/stdlib/tsugar.nim | 40 ++++++++++++++++++++-------------------- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index 452863ce1a..bc6e0c46e6 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -536,6 +536,12 @@ proc semIdentWithPragma(c: PContext, kind: TSymKind, n: PNode, else: discard else: result = semIdentVis(c, kind, n, allowed) + case kind + of skField: implicitPragmas(c, result, n.info, fieldPragmas) + of skVar: implicitPragmas(c, result, n.info, varPragmas) + of skLet: implicitPragmas(c, result, n.info, letPragmas) + of skConst: implicitPragmas(c, result, n.info, constPragmas) + else: discard proc checkForOverlap(c: PContext, t: PNode, currentEx, branchIndex: int) = let ex = t[branchIndex][currentEx].skipConv diff --git a/tests/nimdoc/m13129.nim b/tests/nimdoc/m13129.nim index 145cae39ca..34e118381d 100644 --- a/tests/nimdoc/m13129.nim +++ b/tests/nimdoc/m13129.nim @@ -4,6 +4,7 @@ when defined(cpp): {.push header: "".} type Vector[T] {.importcpp: "std::vector".} = object + {.pop.} elif defined(js): proc endsWith*(s, suffix: cstring): bool {.noSideEffect,importjs: "#.endsWith(#)".} elif defined(c): diff --git a/tests/stdlib/tsugar.nim b/tests/stdlib/tsugar.nim index 5e0c51b2dc..10bc95befb 100644 --- a/tests/stdlib/tsugar.nim +++ b/tests/stdlib/tsugar.nim @@ -11,6 +11,23 @@ type # for capture test, ref #20679 FooCapture = ref object x: int +proc mainProc() = + block: # bug #16967 + var s = newSeq[proc (): int](5) + {.push exportc.} + proc bar() = + for i in 0 ..< s.len: + let foo = i + 1 + capture foo: + s[i] = proc(): int = foo + {.pop.} + + bar() + + for i, p in s.pairs: + let foo = i + 1 + doAssert p() == foo + template main() = block: # `=>` block: @@ -85,22 +102,6 @@ template main() = closure2 = () => (i, j) doAssert closure2() == (5, 3) - block: # bug #16967 - var s = newSeq[proc (): int](5) - {.push exportc.} - proc bar() = - for i in 0 ..< s.len: - let foo = i + 1 - capture foo: - s[i] = proc(): int = foo - {.pop.} - - bar() - - for i, p in s.pairs: - let foo = i + 1 - doAssert p() == foo - block: # issue #20679 # this should compile. Previously was broken as `var int` is an `nnkHiddenDeref` # which was not handled correctly @@ -270,17 +271,16 @@ template main() = discard collect(newSeq, for i in 1..3: i) foo() -proc mainProc() = block: # dump # symbols in templates are gensym'd let - x = 10 - y = 20 + x {.inject.} = 10 + y {.inject.} = 20 dump(x + y) # x + y = 30 block: # dumpToString template square(x): untyped = x * x - let x = 10 + let x {.inject.} = 10 doAssert dumpToString(square(x)) == "square(x): x * x = 100" let s = dumpToString(doAssert 1+1 == 2) doAssert "failedAssertImpl" in s