summaryrefslogtreecommitdiff
path: root/compiler/main
diff options
context:
space:
mode:
authorDavid Terei <davidterei@gmail.com>2011-04-25 15:58:10 -0700
committerDavid Terei <davidterei@gmail.com>2011-06-17 18:39:28 -0700
commit0f13e110c01674fe185ead1cd24e234dba2fa22e (patch)
tree8de25e4935f1f5d2a418ab72d48c5ad5f8fd2410 /compiler/main
parent029e24e0cbfe89ea061e1901612daa09f0e832db (diff)
downloadhaskell-0f13e110c01674fe185ead1cd24e234dba2fa22e.tar.gz
SafeHaskell: Disable user written rewrite rules in Safe mode
Diffstat (limited to 'compiler/main')
-rw-r--r--compiler/main/DynFlags.hs6
-rw-r--r--compiler/main/HscMain.lhs33
2 files changed, 29 insertions, 10 deletions
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
index 7a587dac0a..35859158db 100644
--- a/compiler/main/DynFlags.hs
+++ b/compiler/main/DynFlags.hs
@@ -1260,8 +1260,6 @@ shFlagsDisallowed dflags = foldl check_method (dflags, []) bad_flags
bad_flags = [(xopt Opt_GeneralizedNewtypeDeriving, "-XGeneralizedNewtypeDeriving",
flip xopt_unset Opt_GeneralizedNewtypeDeriving),
- (dopt Opt_EnableRewriteRules, "-enable-rewrite-rules",
- flip dopt_unset Opt_EnableRewriteRules),
(xopt Opt_TemplateHaskell, "-XTemplateHaskell",
flip xopt_unset Opt_TemplateHaskell)]
@@ -1778,8 +1776,8 @@ fFlags = [
( "print-bind-result", AlwaysAllowed, Opt_PrintBindResult, nop ),
( "force-recomp", AlwaysAllowed, Opt_ForceRecomp, nop ),
( "hpc-no-auto", AlwaysAllowed, Opt_Hpc_No_Auto, nop ),
- ( "rewrite-rules", NeverAllowed, Opt_EnableRewriteRules, useInstead "enable-rewrite-rules" ),
- ( "enable-rewrite-rules", NeverAllowed, Opt_EnableRewriteRules, nop ),
+ ( "rewrite-rules", AlwaysAllowed, Opt_EnableRewriteRules, useInstead "enable-rewrite-rules" ),
+ ( "enable-rewrite-rules", AlwaysAllowed, Opt_EnableRewriteRules, nop ),
( "break-on-exception", AlwaysAllowed, Opt_BreakOnException, nop ),
( "break-on-error", AlwaysAllowed, Opt_BreakOnError, nop ),
( "print-evld-with-show", AlwaysAllowed, Opt_PrintEvldWithShow, nop ),
diff --git a/compiler/main/HscMain.lhs b/compiler/main/HscMain.lhs
index 24f610f836..dddee58ec9 100644
--- a/compiler/main/HscMain.lhs
+++ b/compiler/main/HscMain.lhs
@@ -778,8 +778,27 @@ hscFileFrontEnd mod_summary = do
tcg_env <- ioMsgMaybe $
tcRnModule hsc_env (ms_hsc_src mod_summary) False rdr_module
dflags <- getDynFlags
- tcg_env' <- checkSafeImports dflags hsc_env tcg_env
- return tcg_env'
+ -- XXX: See Note [SafeHaskell API]
+ if safeHaskellOn dflags
+ then do
+ tcg_env1 <- checkSafeImports dflags hsc_env tcg_env
+ if safeLanguageOn dflags
+ then do
+ -- we also nuke user written RULES.
+ logWarnings $ warns (tcg_rules tcg_env1)
+ return tcg_env1 { tcg_rules = [] }
+ else
+ return tcg_env1
+
+ else
+ return tcg_env
+
+ where
+ warns rules = listToBag $ map warnRules rules
+ warnRules (L loc (HsRule n _ _ _ _ _ _)) =
+ mkPlainWarnMsg loc $
+ text "Rule \"" <> ftext n <> text "\" ignored" $+$
+ text "User defined rules are disabled under SafeHaskell"
--------------------------------------------------------------
-- SafeHaskell
@@ -791,12 +810,14 @@ hscFileFrontEnd mod_summary = do
-- trust type is 'Safe' or 'Trustworthy'. For modules that
-- reside in another package we also must check that the
-- external pacakge is trusted.
+--
+-- Note [SafeHaskell API]
+-- ~~~~~~~~~~~~~~~~~~~~~~
+-- XXX: We only call this in hscFileFrontend and don't expose
+-- it to the GHC API. External users of GHC can't properly use
+-- the GHC API and SafeHaskell.
checkSafeImports :: DynFlags -> HscEnv -> TcGblEnv -> Hsc TcGblEnv
checkSafeImports dflags hsc_env tcg_env
- | not (safeHaskellOn dflags)
- = return tcg_env
-
- | otherwise
= do
imps <- mapM condense imports'
mapM_ checkSafe imps