fix race conditions in sandboxIO (#1583, #1922, #1946)
[ghc-hetmet.git] / compiler / coreSyn / CoreLint.lhs
index 18b65d5..395c72a 100644 (file)
@@ -1,3 +1,4 @@
+
 %
 % (c) The University of Glasgow 2006
 % (c) The GRASP/AQUA Project, Glasgow University, 1993-1998
@@ -6,11 +7,11 @@
 A ``lint'' pass to check for Core correctness
 
 \begin{code}
-{-# OPTIONS_GHC -w #-}
+{-# OPTIONS -w #-}
 -- The above warning supression flag is a temporary kludge.
 -- While working on this module you are encouraged to remove it and fix
 -- any warnings in the module. See
---     http://hackage.haskell.org/trac/ghc/wiki/WorkingConventions#Warnings
+--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
 -- for details
 
 module CoreLint (
@@ -42,13 +43,10 @@ import Coercion
 import TyCon
 import BasicTypes
 import StaticFlags
+import ListSetOps
 import DynFlags
 import Outputable
-
-#ifdef DEBUG
-import Util             ( notNull )
-#endif
-
+import Util
 import Data.Maybe
 \end{code}
 
@@ -181,7 +179,8 @@ lintCoreBindings dflags whoDunnit binds
        -- Put all the top-level binders in scope at the start
        -- This is because transformation rules can bring something
        -- into use 'unexpectedly'
-    lint_binds binds = addInScopeVars (bindersOfBinds binds) $
+    lint_binds binds = addLoc TopLevelBindings $
+                      addInScopeVars (bindersOfBinds binds) $
                       mapM lint_bind binds 
 
     lint_bind (Rec prs)                = mapM_ (lintSingleBinding TopLevel Recursive) prs
@@ -370,8 +369,8 @@ lintCoreExpr e@(Case scrut var alt_ty alts) =
                    else lintAndScopeId var
      ; scope $ \_ ->
        do { -- Check the alternatives
-            checkCaseAlts e scrut_ty alts
-          ; mapM (lintCoreAlt scrut_ty alt_ty) alts
+            mapM (lintCoreAlt scrut_ty alt_ty) alts
+          ; checkCaseAlts e scrut_ty alts
           ; return alt_ty } }
   where
     pass_var f = f var
@@ -645,6 +644,7 @@ data LintLocInfo
   | CasePat CoreAlt    -- *Pattern* of the case alternative
   | AnExpr CoreExpr    -- Some expression
   | ImportedUnfolding SrcLoc -- Some imported unfolding (ToDo: say which)
+  | TopLevelBindings
 \end{code}
 
                  
@@ -682,8 +682,13 @@ addLoc extra_loc m =
   LintM (\ loc subst errs -> unLintM m (extra_loc:loc) subst errs)
 
 addInScopeVars :: [Var] -> LintM a -> LintM a
-addInScopeVars vars m = 
-  LintM (\ loc subst errs -> unLintM m loc (extendTvInScope subst vars) errs)
+addInScopeVars vars m
+  | null dups
+  = LintM (\ loc subst errs -> unLintM m loc (extendTvInScope subst vars) errs)
+  | otherwise
+  = addErrL (dupVars dups)
+  where
+    (_, dups) = removeDups compare vars 
 
 updateTvSubst :: TvSubst -> LintM a -> LintM a
 updateTvSubst subst' m = 
@@ -771,6 +776,8 @@ dumpLoc (CasePat (con, args, rhs))
 
 dumpLoc (ImportedUnfolding locn)
   = (locn, brackets (ptext SLIT("in an imported unfolding")))
+dumpLoc TopLevelBindings
+  = (noSrcLoc, empty)
 
 pp_binders :: [Var] -> SDoc
 pp_binders bs = sep (punctuate comma (map pp_binder bs))
@@ -923,6 +930,10 @@ mkCastErr from_ty expr_ty
          ptext SLIT("Type of enclosed expr:") <+> ppr expr_ty
     ]
 
+dupVars vars
+  = hang (ptext SLIT("Duplicate variables brought into scope"))
+       2 (ppr vars)
+
 mkStrangeTyMsg e
   = ptext SLIT("Type where expression expected:") <+> ppr e
 \end{code}