summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--changelog.md4
-rw-r--r--compiler/condsyms.nim1
-rw-r--r--compiler/modules.nim1
-rw-r--r--compiler/pragmas.nim2
-rw-r--r--compiler/renderer.nim5
-rw-r--r--compiler/sem.nim3
-rw-r--r--doc/manual.rst11
-rw-r--r--tests/tools/dontmentionme.nim3
-rw-r--r--tests/tools/tunused_imports.nim2
9 files changed, 28 insertions, 4 deletions
diff --git a/changelog.md b/changelog.md
index f29a4c69d..749959e3c 100644
--- a/changelog.md
+++ b/changelog.md
@@ -58,6 +58,10 @@
 - The Nim compiler now does not recompile the Nim project via ``nim c -r`` if
   no dependent Nim file changed. This feature can be overridden by
   the ``--forceBuild`` command line option.
+- The Nim compiler now warns about unused module imports. You can use a
+  top level ``{.used.}`` pragma in the module that you want to be importable
+  without producing this warning.
+
 
 ### Compiler changes
 
diff --git a/compiler/condsyms.nim b/compiler/condsyms.nim
index ce295c8b9..15a625472 100644
--- a/compiler/condsyms.nim
+++ b/compiler/condsyms.nim
@@ -97,3 +97,4 @@ proc initDefines*(symbols: StringTableRef) =
 
   defineSymbol("nimFixedOwned")
   defineSymbol("nimHasStyleChecks")
+  defineSymbol("nimHasUsed")
diff --git a/compiler/modules.nim b/compiler/modules.nim
index 13845e6e9..02b4d8ac4 100644
--- a/compiler/modules.nim
+++ b/compiler/modules.nim
@@ -50,7 +50,6 @@ proc partialInitModule(result: PSym; graph: ModuleGraph; fileIdx: FileIndex; fil
     setLen(graph.modules, int(fileIdx) + 1)
   graph.modules[result.position] = result
 
-  incl(result.flags, sfUsed)
   initStrTable(result.tab)
   strTableAdd(result.tab, result) # a module knows itself
   strTableAdd(packSym.tab, result)
diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim
index 9e3976e73..12b0cff87 100644
--- a/compiler/pragmas.nim
+++ b/compiler/pragmas.nim
@@ -49,7 +49,7 @@ const
     wDeprecated,
     wFloatChecks, wInfChecks, wNanChecks, wPragma, wEmit, wUnroll,
     wLinearScanEnd, wPatterns, wTrMacros, wEffects, wNoForward, wReorder, wComputedGoto,
-    wInjectStmt, wDeprecated, wExperimental, wThis}
+    wInjectStmt, wDeprecated, wExperimental, wThis, wUsed}
   lambdaPragmas* = {FirstCallConv..LastCallConv, wImportc, wExportc, wNodecl,
     wNoSideEffect, wSideEffect, wNoreturn, wDynlib, wHeader,
     wDeprecated, wExtern, wThread, wImportCpp, wImportObjC, wAsmNoStackFrame,
diff --git a/compiler/renderer.nim b/compiler/renderer.nim
index cfc414aaf..dfe66de03 100644
--- a/compiler/renderer.nim
+++ b/compiler/renderer.nim
@@ -9,6 +9,11 @@
 
 # This module implements the renderer of the standard Nim representation.
 
+when defined(nimHasUsed):
+  # 'import renderer' is so useful for debugging
+  # that Nim shouldn't produce a warning for that:
+  {.used.}
+
 import
   lexer, options, idents, strutils, ast, msgs, lineinfos
 
diff --git a/compiler/sem.nim b/compiler/sem.nim
index 119393e25..a13fd138b 100644
--- a/compiler/sem.nim
+++ b/compiler/sem.nim
@@ -614,7 +614,8 @@ proc myProcess(context: PPassContext, n: PNode): PNode =
 
 proc reportUnusedModules(c: PContext) =
   for i in 0..high(c.unusedImports):
-    message(c.config, c.unusedImports[i][1], warnUnusedImportX, c.unusedImports[i][0].name.s)
+    if sfUsed notin c.unusedImports[i][0].flags:
+      message(c.config, c.unusedImports[i][1], warnUnusedImportX, c.unusedImports[i][0].name.s)
 
 proc myClose(graph: ModuleGraph; context: PPassContext, n: PNode): PNode =
   var c = PContext(context)
diff --git a/doc/manual.rst b/doc/manual.rst
index f0945f78d..1f8f23310 100644
--- a/doc/manual.rst
+++ b/doc/manual.rst
@@ -6276,6 +6276,17 @@ is particularly useful when the symbol was generated by a macro:
   implementArithOps(int)
   echoAdd 3, 5
 
+``used`` can also be used as a top level statement to mark a module as "used".
+This prevents the "Unused import" warning:
+
+.. code-block:: nim
+
+  # module: debughelper.nim
+  when defined(nimHasUsed):
+    # 'import debughelper' is so useful for debugging
+    # that Nim shouldn't produce a warning for that import,
+    # even if currently unused:
+    {.used.}
 
 
 experimental pragma
diff --git a/tests/tools/dontmentionme.nim b/tests/tools/dontmentionme.nim
new file mode 100644
index 000000000..218823aca
--- /dev/null
+++ b/tests/tools/dontmentionme.nim
@@ -0,0 +1,3 @@
+{.used.}
+
+proc nothing* = echo "nothing to see here"
diff --git a/tests/tools/tunused_imports.nim b/tests/tools/tunused_imports.nim
index c9cfcfe90..1c5732c83 100644
--- a/tests/tools/tunused_imports.nim
+++ b/tests/tools/tunused_imports.nim
@@ -10,7 +10,7 @@ tunused_imports.nim(25, 8) Warning: imported and not used: 'strutils' [UnusedImp
 
 {.warning: "BEGIN".}
 
-import net
+import net, dontmentionme
 
 echo AF_UNIX