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:
parent
14656154ef
commit
d1d141b135
19 changed files with 85 additions and 25 deletions
|
|
@ -334,6 +334,7 @@ const
|
|||
sfEscapes* = sfProcvar # param escapes
|
||||
sfBase* = sfDiscriminant
|
||||
sfCustomPragma* = sfRegister # symbol is custom pragma template
|
||||
sfTemplateRedefinition* = sfExportc # symbol is a redefinition of an earlier template
|
||||
|
||||
const
|
||||
# getting ready for the future expr/stmt merge
|
||||
|
|
|
|||
|
|
@ -140,3 +140,4 @@ proc initDefines*(symbols: StringTableRef) =
|
|||
defineSymbol("nimHasEffectsOf")
|
||||
|
||||
defineSymbol("nimHasEnforceNoRaises")
|
||||
defineSymbol("nimHasTemplateRedefinitionPragma")
|
||||
|
|
|
|||
|
|
@ -81,6 +81,7 @@ type
|
|||
warnCstringConv = "CStringConv",
|
||||
warnEffect = "Effect",
|
||||
warnCastSizes = "CastSizes"
|
||||
warnTemplateRedefinition = "TemplateRedefinition",
|
||||
warnUser = "User",
|
||||
# hints
|
||||
hintSuccess = "Success", hintSuccessX = "SuccessX",
|
||||
|
|
@ -175,6 +176,7 @@ const
|
|||
warnCstringConv: "$1",
|
||||
warnEffect: "$1",
|
||||
warnCastSizes: "$1",
|
||||
warnTemplateRedefinition: "template '$1' is implicitly redefined, consider adding an explicit .redefine pragma",
|
||||
warnUser: "$1",
|
||||
hintSuccess: "operation successful: $#",
|
||||
# keep in sync with `testament.isSuccess`
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ const
|
|||
converterPragmas* = procPragmas
|
||||
methodPragmas* = procPragmas+{wBase}-{wImportCpp}
|
||||
templatePragmas* = {wDeprecated, wError, wGensym, wInject, wDirty,
|
||||
wDelegator, wExportNims, wUsed, wPragma}
|
||||
wDelegator, wExportNims, wUsed, wPragma, wRedefine}
|
||||
macroPragmas* = declPragmas + {FirstCallConv..LastCallConv,
|
||||
wMagic, wNoSideEffect, wCompilerProc, wNonReloadable, wCore,
|
||||
wDiscardable, wGensym, wInject, wDelegator}
|
||||
|
|
@ -870,6 +870,9 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: var int,
|
|||
of wDirty:
|
||||
if sym.kind == skTemplate: incl(sym.flags, sfDirty)
|
||||
else: invalidPragma(c, it)
|
||||
of wRedefine:
|
||||
if sym.kind == skTemplate: incl(sym.flags, sfTemplateRedefinition)
|
||||
else: invalidPragma(c, it)
|
||||
of wImportCpp:
|
||||
processImportCpp(c, sym, getOptionalStr(c, it, "$1"), it.info)
|
||||
of wCppNonPod:
|
||||
|
|
|
|||
|
|
@ -2112,10 +2112,12 @@ proc semQuoteAst(c: PContext, n: PNode): PNode =
|
|||
ids[0] = newAnonSym(c, skParam, n.info).newSymNode
|
||||
processQuotations(c, quotedBlock, op, quotes, ids)
|
||||
|
||||
let dummyTemplateSym = newAnonSym(c, skTemplate, n.info)
|
||||
incl(dummyTemplateSym.flags, sfTemplateRedefinition)
|
||||
var dummyTemplate = newProcNode(
|
||||
nkTemplateDef, quotedBlock.info, body = quotedBlock,
|
||||
params = c.graph.emptyNode,
|
||||
name = newAnonSym(c, skTemplate, n.info).newSymNode,
|
||||
name = dummyTemplateSym.newSymNode,
|
||||
pattern = c.graph.emptyNode, genericParams = c.graph.emptyNode,
|
||||
pragmas = c.graph.emptyNode, exceptions = c.graph.emptyNode)
|
||||
|
||||
|
|
|
|||
|
|
@ -691,6 +691,9 @@ proc semTemplateDef(c: PContext, n: PNode): PNode =
|
|||
if proto == nil:
|
||||
addInterfaceOverloadableSymAt(c, c.currentScope, s)
|
||||
elif not comesFromShadowscope:
|
||||
if {sfTemplateRedefinition, sfGenSym} * s.flags == {}:
|
||||
#wrongRedefinition(c, n.info, proto.name.s, proto.info)
|
||||
message(c.config, n.info, warnTemplateRedefinition, s.name.s)
|
||||
symTabReplace(c.currentScope.symbols, proto, s)
|
||||
if n[patternPos].kind != nkEmpty:
|
||||
c.patterns.add(s)
|
||||
|
|
|
|||
|
|
@ -87,6 +87,7 @@ type
|
|||
wGlobal = "global", wCodegenDecl = "codegenDecl", wUnchecked = "unchecked",
|
||||
wGuard = "guard", wLocks = "locks", wPartial = "partial", wExplain = "explain",
|
||||
wLiftLocals = "liftlocals", wEnforceNoRaises = "enforceNoRaises",
|
||||
wRedefine = "redefine",
|
||||
|
||||
wAuto = "auto", wBool = "bool", wCatch = "catch", wChar = "char",
|
||||
wClass = "class", wCompl = "compl", wConstCast = "const_cast", wDefault = "default",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue