summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorTimothee Cour <timothee.cour2@gmail.com>2021-01-20 01:49:59 -0800
committerGitHub <noreply@github.com>2021-01-20 10:49:59 +0100
commit4fc7fcb775140dc774a713063917fbf7d1392bdf (patch)
treeffb29f080816cc85e7a47a96cde8e79945d023a8
parent2bedb0fe2c38424a53ec7376c05db09090af9f93 (diff)
downloadNim-4fc7fcb775140dc774a713063917fbf7d1392bdf.tar.gz
`--hintAsError` (#16763)
* --hintAsError

* add test, changelog

* condsyms
-rw-r--r--changelog.md1
-rw-r--r--compiler/commands.nim10
-rw-r--r--compiler/condsyms.nim1
-rw-r--r--compiler/msgs.nim8
-rw-r--r--compiler/pragmas.nim1
-rw-r--r--compiler/wordrecg.nim5
-rw-r--r--doc/advopt.txt4
-rw-r--r--tests/misc/twarningaserror.nim35
8 files changed, 56 insertions, 9 deletions
diff --git a/changelog.md b/changelog.md
index 5f3db3dfb..af979fc93 100644
--- a/changelog.md
+++ b/changelog.md
@@ -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
 
diff --git a/compiler/commands.nim b/compiler/commands.nim
index bc1a63cc4..0c835a2f7 100644
--- a/compiler/commands.nim
+++ b/compiler/commands.nim
@@ -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)
@@ -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)
@@ -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)
diff --git a/compiler/condsyms.nim b/compiler/condsyms.nim
index 55f2b4a0f..a6ad45436 100644
--- a/compiler/condsyms.nim
+++ b/compiler/condsyms.nim
@@ -124,3 +124,4 @@ proc initDefines*(symbols: StringTableRef) =
   defineSymbol("nimHasCastPragmaBlocks")
   defineSymbol("nimHasDeclaredLocs")
   defineSymbol("nimHasJsBigIntBackend")
+  defineSymbol("nimHasHintAsError")
diff --git a/compiler/msgs.nim b/compiler/msgs.nim
index afb51da09..442695ea1 100644
--- a/compiler/msgs.nim
+++ b/compiler/msgs.nim
@@ -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:
@@ -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)
 
diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim
index 1404959c6..c8aee3327 100644
--- a/compiler/pragmas.nim
+++ b/compiler/pragmas.nim
@@ -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)
 
diff --git a/compiler/wordrecg.nim b/compiler/wordrecg.nim
index 170d04df1..ad529f437 100644
--- a/compiler/wordrecg.nim
+++ b/compiler/wordrecg.nim
@@ -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", 
diff --git a/doc/advopt.txt b/doc/advopt.txt
index a3040f378..93a985a37 100644
--- a/doc/advopt.txt
+++ b/doc/advopt.txt
@@ -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
diff --git a/tests/misc/twarningaserror.nim b/tests/misc/twarningaserror.nim
new file mode 100644
index 000000000..6f7b76095
--- /dev/null
+++ b/tests/misc/twarningaserror.nim
@@ -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())