Warn if you explicitly export an identifier with warning attached.
authorEdward Z. Yang <ezyang@cs.stanford.edu>
Fri, 30 Dec 2016 05:39:27 +0000 (21:39 -0800)
committerEdward Z. Yang <ezyang@cs.stanford.edu>
Wed, 11 Jan 2017 14:53:56 +0000 (06:53 -0800)
Summary:
This won't stop people from attempting to use this identifier
(since it is still always going to be in the export list), but
having an explicit reference to something people shouldn't
use is a smell, so warn about it.

Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu>
Test Plan: validate

Reviewers: simonpj, austin, bgamari

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D2907

compiler/typecheck/TcBackpack.hs
testsuite/tests/backpack/should_fail/bkpfail35.stderr

index 9cc2997..76cb88d 100644 (file)
@@ -459,9 +459,22 @@ mergeSignatures hsmod lcl_iface0 = do
     tcg_env <- getGblEnv
 
     -- Make sure we didn't refer to anything that doesn't actually exist
-    _ <- exports_from_avail mb_exports rdr_env
+    (mb_lies, _) <- exports_from_avail mb_exports rdr_env
                         (tcg_imports tcg_env) (tcg_semantic_mod tcg_env)
 
+    -- If you tried to explicitly export an identifier that has a warning
+    -- attached to it, that's probably a mistake.  Warn about it.
+    case mb_lies of
+      Nothing -> return ()
+      Just lies ->
+        forM_ (concatMap (\(L loc x) -> map (L loc) (ieNames x)) lies) $ \(L loc n) ->
+          setSrcSpan loc $
+            unless (nameOccName n `elemOccSet` ok_to_use) $
+                addWarn NoReason $ vcat [
+                    text "Exported identifier" <+> quotes (ppr n) <+> text "will cause warnings if used.",
+                    parens (text "To suppress this warning, remove" <+> quotes (ppr n) <+> text "from the export list of this signature.")
+                    ]
+
     failIfErrsM
 
     -- STEP 4: Rename the interfaces
index f90d0e2..e371488 100644 (file)
@@ -3,6 +3,10 @@
   [2 of 2] Compiling B                ( p/B.hs, nothing )
 [2 of 4] Processing q
   [1 of 1] Compiling A[sig]           ( q/A.hsig, nothing )
+
+bkpfail35.bkp:8:18: warning:
+    Exported identifier ‘x’ will cause warnings if used.
+    (To suppress this warning, remove ‘x’ from the export list of this signature.)
 [3 of 4] Processing aimpl
   Instantiating aimpl
   [1 of 1] Compiling A                ( aimpl/A.hs, bkpfail35.out/aimpl/A.o )