Improve error reporting for type signatures
[ghc-hetmet.git] / compiler / rename / RnBinds.lhs
index a96c63f..1c7bebb 100644 (file)
@@ -33,12 +33,12 @@ import RnEnv                ( bindLocatedLocalsRn, lookupLocatedBndrRn,
                          warnUnusedLocalBinds, mapFvRn, extendTyVarEnvFVRn,
                        )
 import DynFlags        ( DynFlag(..) )
-import Name            ( Name, nameOccName, nameSrcLoc )
+import Name
 import NameEnv
 import NameSet
 import PrelNames       ( isUnboundName )
 import RdrName         ( RdrName, rdrNameOcc )
-import SrcLoc          ( mkSrcSpan, Located(..), unLoc )
+import SrcLoc          ( Located(..), unLoc )
 import ListSetOps      ( findDupsEq )
 import BasicTypes      ( RecFlag(..) )
 import Digraph         ( SCC(..), stronglyConnComp )
@@ -178,20 +178,7 @@ rnTopBindsBoot (ValBindsIn mbinds sigs)
        ; return (ValBindsOut [] sigs', usesOnly (hsSigsFVs sigs')) }
 
 rnTopBindsSrc :: HsValBinds RdrName -> RnM (HsValBinds Name, DefUses)
-rnTopBindsSrc binds@(ValBindsIn mbinds _)
-  = do { (binds', dus) <- rnValBinds noTrim binds
-
-               -- Warn about missing signatures, 
-       ; let   { ValBindsOut _ sigs' = binds'
-               ; ty_sig_vars = mkNameSet [ unLoc n | L _ (TypeSig n _) <- sigs']
-               ; un_sigd_bndrs = duDefs dus `minusNameSet` ty_sig_vars }
-
-       ; warn_missing_sigs <- doptM Opt_WarnMissingSigs
-       ; ifM (warn_missing_sigs)
-             (mappM_ missingSigWarn (nameSetToList un_sigd_bndrs))
-
-       ; return (binds', dus)
-       }
+rnTopBindsSrc binds = rnValBinds noTrim binds
 \end{code}
 
 
@@ -642,16 +629,20 @@ dupSigDeclErr sigs@(L loc sig : _)
     ppr_sig (L loc sig) = ppr loc <> colon <+> ppr sig
 
 unknownSigErr (L loc sig)
-  = addErrAt loc $
-       sep [ptext SLIT("Misplaced") <+> what_it_is <> colon, ppr sig]
+  = do { mod <- getModule
+       ; addErrAt loc $
+               vcat [sep [ptext SLIT("Misplaced") <+> what_it_is <> colon, ppr sig],
+                     extra_stuff mod sig] }
   where
     what_it_is = hsSigDoc sig
-
-missingSigWarn var
-  = addWarnAt (mkSrcSpan loc loc) $
-      sep [ptext SLIT("Definition but no type signature for"), quotes (ppr var)]
-  where 
-    loc = nameSrcLoc var  -- TODO: make a proper span
+    extra_stuff mod  (TypeSig (L _ n) _)
+       | nameIsLocalOrFrom mod n
+       = ptext SLIT("The type signature must be given where")
+               <+> quotes (ppr n) <+> ptext SLIT("is declared")
+       | otherwise
+       = ptext SLIT("You cannot give a type signature for an imported value")
+
+    extra_stuff mod other = empty
 
 methodBindErr mbind
  =  hang (ptext SLIT("Pattern bindings (except simple variables) not allowed in instance declarations"))