new .redefine pragma for templates, warn on redefinition without it (#20211)

* test CI for template redefinitions

* adapt asyncmacro

* fix quote

* fix again

* try something else

* revert

* fix ioselectors_select, disable packages CI

* adapt more tests & simplify

* more

* more

* more

* rename to redefine, warn on implicit redefinition

* basic documentation [skip ci]

* Update compiler/lineinfos.nim

Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com>

Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com>
This commit is contained in:
metagn 2022-08-23 22:41:30 +03:00 • committed by GitHub
commit d1d141b135
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 85 additions and 25 deletions

View file

@ -126,7 +126,9 @@ template await*(f: typed): untyped {.used.} =
error "await expects Future[T], got " & $typeof(f)
template await*[T](f: Future[T]): auto {.used.} =
template yieldFuture = yield FutureBase()
when not defined(nimHasTemplateRedefinitionPragma):
{.pragma: redefine.}
template yieldFuture {.redefine.} = yield FutureBase()
when compiles(yieldFuture):
var internalTmpFuture: FutureBase = f

View file

@ -398,18 +398,6 @@ proc contains*[T](s: Selector[T], fd: SocketHandle|int): bool {.inline.} =
if s.fds[i].ident == fdi:
return true
when hasThreadSupport:
template withSelectLock[T](s: Selector[T], body: untyped) =
acquire(s.lock)
{.locks: [s.lock].}:
try:
body
finally:
release(s.lock)
else:
template withSelectLock[T](s: Selector[T], body: untyped) =
body
proc getData*[T](s: Selector[T], fd: SocketHandle|int): var T =
s.withSelectLock():
let fdi = int(fd)

View file

@ -85,7 +85,9 @@ template onFailedAssert*(msg, code: untyped): untyped {.dirty.} =
onFailedAssert(msg):
raise (ref MyError)(msg: msg, lineinfo: instantiationInfo(-2))
doAssertRaises(MyError): doAssert false
template failedAssertImpl(msgIMPL: string): untyped {.dirty.} =
when not defined(nimHasTemplateRedefinitionPragma):
{.pragma: redefine.}
template failedAssertImpl(msgIMPL: string): untyped {.dirty, redefine.} =
let msg = msgIMPL
code
@ -98,7 +100,7 @@ template doAssertRaises*(exception: typedesc, code: untyped) =
var wrong = false
const begin = "expected raising '" & astToStr(exception) & "', instead"
const msgEnd = " by: " & astToStr(code)
template raisedForeign = raiseAssert(begin & " raised foreign exception" & msgEnd)
template raisedForeign {.gensym.} = raiseAssert(begin & " raised foreign exception" & msgEnd)
when Exception is exception:
try:
if true: