Skip to content

Commit

Permalink
--hintAsError (#16763)
Browse files Browse the repository at this point in the history
* --hintAsError

* add test, changelog

* condsyms
  • Loading branch information
timotheecour authored Jan 20, 2021
1 parent 2bedb0f commit 4fc7fcb
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 9 deletions.
1 change: 1 addition & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ with other backends. see #9125. Use `-d:nimLegacyJsRound` for previous behavior.
- Type mismatch errors now show more context, use `-d:nimLegacyTypeMismatch` for previous
behavior.

- Added `--hintAsError` with similar semantics as `--warningAsError`.

## Tool changes

Expand Down
10 changes: 6 additions & 4 deletions compiler/commands.nim
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,8 @@ proc processSpecificNote*(arg: string, state: TSpecialWord, pass: TCmdLinePass,
if i == arg.len: discard
elif i < arg.len and (arg[i] in {':', '='}): inc(i)
else: invalidCmdLineOption(conf, pass, orig, info)
if state == wHint:
# unfortunately, hintUser and warningUser clash
if state in {wHint, wHintAsError}:
let x = findStr(hintMin, hintMax, id, errUnknown)
if x != errUnknown: n = TNoteKind(x)
else: localError(conf, info, "unknown hint: " & id)
Expand All @@ -209,13 +210,13 @@ proc processSpecificNote*(arg: string, state: TSpecialWord, pass: TCmdLinePass,
incl(conf.modifiedyNotes, n)
case val
of "on":
if state == wWarningAsError:
incl(conf.warningAsErrors, n)
if state in {wWarningAsError, wHintAsError}:
incl(conf.warningAsErrors, n) # xxx rename warningAsErrors to noteAsErrors
else:
incl(conf.notes, n)
incl(conf.mainPackageNotes, n)
of "off":
if state == wWarningAsError:
if state in {wWarningAsError, wHintAsError}:
excl(conf.warningAsErrors, n)
else:
excl(conf.notes, n)
Expand Down Expand Up @@ -607,6 +608,7 @@ proc processSwitch*(switch, arg: string, pass: TCmdLinePass, info: TLineInfo;
of "warning": processSpecificNote(arg, wWarning, pass, info, switch, conf)
of "hint": processSpecificNote(arg, wHint, pass, info, switch, conf)
of "warningaserror": processSpecificNote(arg, wWarningAsError, pass, info, switch, conf)
of "hintaserror": processSpecificNote(arg, wHintAsError, pass, info, switch, conf)
of "hints":
if processOnOffSwitchOrList(conf, {optHints}, arg, pass, info): listHints(conf)
of "threadanalysis": processOnOffSwitchG(conf, {optThreadAnalysis}, arg, pass, info)
Expand Down
1 change: 1 addition & 0 deletions compiler/condsyms.nim
Original file line number Diff line number Diff line change
Expand Up @@ -124,3 +124,4 @@ proc initDefines*(symbols: StringTableRef) =
defineSymbol("nimHasCastPragmaBlocks")
defineSymbol("nimHasDeclaredLocs")
defineSymbol("nimHasJsBigIntBackend")
defineSymbol("nimHasHintAsError")
8 changes: 6 additions & 2 deletions compiler/msgs.nim
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ proc handleError(conf: ConfigRef; msg: TMsgKind, eh: TErrorHandling, s: string)
if conf.cmd == cmdIdeTools: log(s)
quit(conf, msg)
if msg >= errMin and msg <= errMax or
(msg in warnMin..warnMax and msg in conf.warningAsErrors):
(msg in warnMin..hintMax and msg in conf.warningAsErrors):
inc(conf.errorCounter)
conf.exitcode = 1'i8
if conf.errorCounter >= conf.errorMax:
Expand Down Expand Up @@ -522,7 +522,11 @@ proc liMessage*(conf: ConfigRef; info: TLineInfo, msg: TMsgKind, arg: string,
of hintMin..hintMax:
sev = Severity.Hint
ignoreMsg = not conf.hasHint(msg)
title = HintTitle
if msg in conf.warningAsErrors:
ignoreMsg = false
title = ErrorTitle
else:
title = HintTitle
color = HintColor
inc(conf.hintCounter)

Expand Down
1 change: 1 addition & 0 deletions compiler/pragmas.nim
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,7 @@ proc processNote(c: PContext, n: PNode) =
of wHint: handleNote(hintMin .. hintMax, c.config.notes)
of wWarning: handleNote(warnMin .. warnMax, c.config.notes)
of wWarningAsError: handleNote(warnMin .. warnMax, c.config.warningAsErrors)
of wHintAsError: handleNote(hintMin .. hintMax, c.config.warningAsErrors)
else: invalidPragma(c, n)
else: invalidPragma(c, n)

Expand Down
5 changes: 4 additions & 1 deletion compiler/wordrecg.nim
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@ type
wNosinks = "nosinks", wMerge = "merge", wLib = "lib", wDynlib = "dynlib",
wCompilerProc = "compilerproc", wCore = "core", wProcVar = "procvar",
wBase = "base", wUsed = "used", wFatal = "fatal", wError = "error", wWarning = "warning",
wHint = "hint", wWarningAsError = "warningAsError", wLine = "line", wPush = "push",
wHint = "hint",
wWarningAsError = "warningAsError",
wHintAsError = "hintAsError",
wLine = "line", wPush = "push",
wPop = "pop", wDefine = "define", wUndef = "undef", wLineDir = "lineDir",
wStackTrace = "stackTrace", wLineTrace = "lineTrace", wLink = "link", wCompile = "compile",
wLinksys = "linksys", wDeprecated = "deprecated", wVarargs = "varargs", wCallconv = "callconv",
Expand Down
4 changes: 2 additions & 2 deletions doc/advopt.txt
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ Advanced options:
--warning[X]:on|off turn specific warning X on|off
--hints:on|off|list turn all hints on|off or list all available
--hint[X]:on|off turn specific hint X on|off
--warningAsError[X]:on|off
turn specific warning X into an error on|off
--warningAsError[X]:on|off turn specific warning X into an error on|off
--hintAsError[X]:on|off turn specific hint X into an error on|off
--styleCheck:off|hint|error
produce hints or errors for Nim identifiers that
do not adhere to Nim's official style guide
Expand Down
35 changes: 35 additions & 0 deletions tests/misc/twarningaserror.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
discard """
joinable: false
"""

#[
tests: hintAsError, warningAsError
]#

template fn1 =
{.hintAsError[ConvFromXtoItselfNotNeeded]:on.}
proc fn(a: string) = discard a.string
{.hintAsError[ConvFromXtoItselfNotNeeded]:off.}

template fn2 =
{.hintAsError[ConvFromXtoItselfNotNeeded]:on.}
proc fn(a: string) = discard a
{.hintAsError[ConvFromXtoItselfNotNeeded]:off.}

template gn1 =
{.warningAsError[ProveInit]:on.}
proc fn(): var int = discard
discard fn()
{.warningAsError[ProveInit]:off.}

template gn2 =
{.warningAsError[ProveInit]:on.}
proc fn(): int = discard
discard fn()
{.warningAsError[ProveInit]:off.}

doAssert not compiles(fn1())
doAssert compiles(fn2())

doAssert not compiles(gn1())
doAssert compiles(gn2())

0 comments on commit 4fc7fcb

Please sign in to comment.