[project @ 2003-11-05 14:51:53 by simonpj]
authorsimonpj <unknown>
Wed, 5 Nov 2003 14:51:54 +0000 (14:51 +0000)
committersimonpj <unknown>
Wed, 5 Nov 2003 14:51:54 +0000 (14:51 +0000)
Fixes to derivable type classes; should work now

ghc/compiler/typecheck/TcDeriv.lhs
ghc/compiler/typecheck/TcRnMonad.lhs

index a9e1a83..1d23c7b 100644 (file)
@@ -19,7 +19,7 @@ import CmdLineOpts    ( DynFlag(..) )
 import Generics                ( mkTyConGenericBinds )
 import TcRnMonad
 import TcEnv           ( newDFunName, 
-                         InstInfo(..), pprInstInfo, InstBindings(..),
+                         InstInfo(..), InstBindings(..),
                          pprInstInfoDetails, tcLookupTyCon, tcExtendTyVarEnv
                        )
 import TcGenDeriv      -- Deriv stuff
@@ -215,8 +215,10 @@ tcDeriving tycl_decls
        ; let inst_info  = newtype_inst_info ++ ordinary_inst_info
 
        -- Rename these extra bindings, discarding warnings about unused bindings etc
+       -- Set -fglasgow exts so that we can have type signatures in patterns,
+       -- which is used in the generic binds
        ; (rn_binds, gen_bndrs) 
-               <- discardWarnings $ do
+               <- discardWarnings $ setOptM Opt_GlasgowExts $ do
                        { (rn_deriv, _dus1) <- rnTopMonoBinds deriv_binds []
                        ; (rn_gen, dus_gen) <- rnTopMonoBinds gen_binds   []
                        ; return (rn_deriv `ThenBinds` rn_gen, duDefs dus_gen) }
index 47cd402..de3390c 100644 (file)
@@ -38,7 +38,7 @@ import Bag            ( emptyBag )
 import Outputable
 import UniqSupply      ( UniqSupply, mkSplitUniqSupply, uniqFromSupply, splitUniqSupply )
 import Unique          ( Unique )
-import CmdLineOpts     ( DynFlags, DynFlag(..), dopt, opt_PprStyle_Debug )
+import CmdLineOpts     ( DynFlags, DynFlag(..), dopt, opt_PprStyle_Debug, dopt_set )
 import Bag             ( snocBag, unionBags )
 import Panic           ( showException )
  
@@ -226,6 +226,10 @@ getDOpts = do { env <- getTopEnv; return (hsc_dflags env) }
 doptM :: DynFlag -> TcRnIf gbl lcl Bool
 doptM flag = do { dflags <- getDOpts; return (dopt flag dflags) }
 
+setOptM :: DynFlag -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
+setOptM flag = updEnv (\ env@(Env { env_top = top }) ->
+                        env { env_top = top { hsc_dflags = dopt_set (hsc_dflags top) flag}} )
+
 ifOptM :: DynFlag -> TcRnIf gbl lcl () -> TcRnIf gbl lcl ()    -- Do it flag is true
 ifOptM flag thing_inside = do { b <- doptM flag; 
                                if b then thing_inside else return () }