Skip to content

Commit c365213

Browse files
committed
cleanups; add tests
1 parent f0c4109 commit c365213

File tree

6 files changed

+44
-22
lines changed

6 files changed

+44
-22
lines changed

compiler/sem.nim

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -640,12 +640,14 @@ proc myProcess(context: PPassContext, n: PNode): PNode {.nosinks.} =
640640
result = semStmtAndGenerateGenerics(c, n)
641641
else:
642642
let oldContextLen = msgs.getInfoContextLen(c.config)
643-
let oldInGenericInst = c.inGenericInst # PRTEMP: genericInstStack ?
643+
let oldInGenericInst = c.inGenericInst
644+
let oldgenericInstStackLen = c.genericInstStack.len
644645
try:
645646
result = semStmtAndGenerateGenerics(c, n)
646647
except ERecoverableError, ESuggestDone:
647648
recoverContext(c)
648649
c.inGenericInst = oldInGenericInst
650+
c.genericInstStack.setLen oldgenericInstStackLen
649651
msgs.setInfoContextLen(c.config, oldContextLen)
650652
if getCurrentException() of ESuggestDone:
651653
c.suggestionsMade = true

compiler/semgnrc.nim

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -491,20 +491,7 @@ proc semGenericStmt(c: PContext, n: PNode,
491491
n[bodyPos] = semGenericStmtScope(c, body, flags, ctx)
492492
closeScope(c)
493493
of nkPragma, nkPragmaExpr:
494-
#[
495-
# TODO: nkPragmaBlock ?
496-
D20210521T115234 PRTEMP
497-
{.define(foo).}
498-
{.noSideEffect.}
499-
{.warning[resultshadowed]: zook.}: discard
500-
{.pushwarning[resultshadowed]: zook.}
501-
{.push, warning[resultshadowed]: off.}
502-
{.pop.}
503-
{.push warnings: off.}
504-
{.push warning[GcMem]: off, warning[Uninit]: off.}
505-
506-
PRTEMP: FACTOR with D20210521T130909
507-
]#
494+
# similar to treatment in `semTemplBody`
508495
for i in 0..<n.len:
509496
if n[i].kind == nkExprColonExpr:
510497
if n[i][0].kind == nkIdent and getIdent(c.cache, $wPragma) == n[i][0].ident:

compiler/seminst.nim

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ proc fixupInstantiatedSymbols(c: PContext, s: PSym) =
156156
for i in 0..<c.generics.len:
157157
if c.generics[i].genericSym.id == s.id:
158158
var oldPrc = c.generics[i].inst.sym
159-
# D20210521T170223:here
160159
pushProcCon(c, oldPrc)
161160
pushOwner(c, oldPrc)
162161
pushInfoContext(c.config, oldPrc.info)
@@ -318,7 +317,7 @@ proc instantiateProcType(c: PContext, pt: TIdTable,
318317
resetIdTable(cl.localCache)
319318
cl.isReturnType = true
320319

321-
if result[0] != nil and result[0].kind == tyGenericInvocation: # PRTEMP
320+
if result[0] != nil and result[0].kind == tyGenericInvocation:
322321
result[0] = instGenericContainerImpl(cl, info, result[0], isReplaceVars = true)
323322
else:
324323
result[0] = replaceTypeVarsT(cl, result[0])

compiler/semtempl.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode =
494494
result[0] = semTemplBody(c, n[0])
495495
of nkPostfix:
496496
result[1] = semTemplBody(c, n[1])
497-
of nkPragma: # D20210521T130909:here
497+
of nkPragma:
498498
for x in n:
499499
if x.kind == nkExprColonExpr:
500500
x[1] = semTemplBody(c, x[1])

compiler/sigmatch.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -707,7 +707,7 @@ proc matchUserTypeClass*(m: var TCandidate; ff, a: PType): PType =
707707
let genericInstStackLenOld = c.genericInstStack.len
708708
c.genericInstStack.add typeClass.sym
709709

710-
# PRTEMP similar to D20210521T170223
710+
# similar to `fixupInstantiatedSymbols`
711711
pushOwner(c, typeClass.sym)
712712
# pushInfoContext(c.config, oldPrc.info)
713713

tests/generics/t13747.nim

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
discard """
22
joinable: false
3-
matrix: "-d:t13747_case1 -d:t13747_case2 -d:t13747_case3 -d:t13747_case4 -d:t13747_case5 -d:t13747_case6 -d:t13747_case7 -d:t13747_case8 -d:t13747_case9"
3+
matrix: "-d:t13747_case1 -d:t13747_case2 -d:t13747_case3 -d:t13747_case4 -d:t13747_case5 -d:t13747_case6 -d:t13747_case7 -d:t13747_case8 -d:t13747_case9 -d:t13747_case10 -d:t13747_case11"
44
# this allows testing each one individually; each of those (except t13747_case1, t13747_case7, t13747_case8) were failing
55
"""
66

77
# bug #13747 generic sandwich non-module scope symbols were ignored
88

99
# keep these at module scope
10-
{.define(nimCompilerDebug).}
1110
when defined(t13747_case1):
1211
# every symbol suffixed by V1, represents -d:case2a1 from https://github.com/nim-lang/Nim/issues/13747#issuecomment-615992993
1312
proc byValImpl1V1(T: typedesc, valV1: int): auto =
@@ -146,10 +145,45 @@ when defined t13747_case8: # bug #2752
146145
147146
# tests that need an stdlib import come after
148147
149-
when defined(t13747_case9): # bug #13970
148+
when defined t13747_case9: # bug #13970
150149
# (also reported in https://github.com/nim-lang/Nim/issues/13747#issuecomment-612905795)
151150
import algorithm
152151
block:
153152
var a = @[(1, @['a']), (4, @['d']), (3, @['c']), (2, @['b'])]
154153
proc `<`(x, y: (int, seq[char])): bool = x[0] < y[0]
155154
sort(a) # was CT error
155+
156+
when defined t13747_case10:
157+
# example with a pragma: make sure `off` is resolved here
158+
proc fn1[T](a: T) =
159+
{.warning[resultshadowed]: off.}: discard
160+
fn1(1)
161+
162+
when defined t13747_case11:
163+
# BUG D20210621T173756:here: this test was failing with `Error: type mismatch`
164+
proc fn1[T](a: T) =
165+
{.warning[resultshadowed]: off.}:
166+
discard
167+
const off = "asdf"
168+
fn1(1)
169+
170+
when defined t13747_case12:
171+
# more pragmas
172+
proc fn1[T](a: T) =
173+
mixin off2
174+
mixin resultshadowed2
175+
{.define(t13747_case12_sub).}
176+
{.noSideEffect.}: discard
177+
{.noSideEffect2.}: discard
178+
{.warning[resultshadowed]: off2.}: discard
179+
{.push warning[resultshadowed]: off2.}
180+
{.push, warning[resultshadowed]: off.}
181+
{.pop.}
182+
{.push warnings: off.}
183+
{.push warning[GcMem]: off, warning[Uninit]: off.}
184+
block:
185+
doAssert not compiles(fn1(1))
186+
const off2 = off
187+
{.pragma: noSideEffect2, noSideEffect.}
188+
doAssert compiles(fn1(1))
189+
fn1(1)

0 commit comments

Comments
 (0)