[commit: ghc] wip/T5462: Use MINIMAL to decide whether we can derive or not, and do not reject newtypes (ffb4520)

git at git.haskell.org git at git.haskell.org
Fri Nov 14 16:50:53 UTC 2014


Repository : ssh://git@git.haskell.org/ghc

On branch  : wip/T5462
Link       : http://ghc.haskell.org/trac/ghc/changeset/ffb45204de1841ff1aff7c8e3c04acf3f7081595/ghc

>---------------------------------------------------------------

commit ffb45204de1841ff1aff7c8e3c04acf3f7081595
Author: Jose Pedro Magalhaes <jpm at cs.ox.ac.uk>
Date:   Wed Nov 5 16:25:25 2014 +0000

    Use MINIMAL to decide whether we can derive or not, and do not reject newtypes


>---------------------------------------------------------------

ffb45204de1841ff1aff7c8e3c04acf3f7081595
 compiler/typecheck/TcDeriv.lhs    |  7 +++----
 compiler/typecheck/TcGenDeriv.lhs | 14 +++++++++-----
 2 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/compiler/typecheck/TcDeriv.lhs b/compiler/typecheck/TcDeriv.lhs
index 231f928..ef12d55 100644
--- a/compiler/typecheck/TcDeriv.lhs
+++ b/compiler/typecheck/TcDeriv.lhs
@@ -1568,7 +1568,6 @@ mkNewTypeEqn dflags overlap_mode tvs
             , ds_newtype = True }
   | otherwise
   = case checkSideConditions dflags mtheta cls cls_tys rep_tycon rep_tc_args of
-      CanDerive -> go_for_it    -- Use the standard H98 method
       DerivableClassError msg   -- Error with standard class
         | might_derive_via_coercible -> bale_out (msg $$ suggest_nd)
         | otherwise                  -> bale_out msg
@@ -1577,7 +1576,7 @@ mkNewTypeEqn dflags overlap_mode tvs
         | might_derive_via_coercible -> bale_out (non_std $$ suggest_nd) -- Try newtype deriving!
         | derivingViaGenerics        -> bale_out msg
         | otherwise                  -> bale_out non_std
-      DerivableViaGenerics           -> panicGenericsNewtype
+      _                              -> go_for_it -- CanDerive/DerivableViaGenerics
   where
         newtype_deriving    = xopt Opt_GeneralizedNewtypeDeriving dflags
         derivingViaGenerics = xopt Opt_DerivingViaGenerics        dflags
@@ -1586,8 +1585,8 @@ mkNewTypeEqn dflags overlap_mode tvs
 
         non_std    = nonStdErr cls
         suggest_nd = ptext (sLit "Try GeneralizedNewtypeDeriving for GHC's newtype-deriving extension")
-        panicGenericsNewtype = pprPanic "mkNewTypeEqn: DerivableViaGenerics"
-                                        (ppr (cls, rep_tycon))
+        -- panicGenericsNewtype = pprPanic "mkNewTypeEqn: DerivableViaGenerics"
+                                        -- (ppr (cls, rep_tycon))
 
         -- Here is the plan for newtype derivings.  We see
         --        newtype T a1...an = MkT (t ak+1...an) deriving (.., C s1 .. sm, ...)
diff --git a/compiler/typecheck/TcGenDeriv.lhs b/compiler/typecheck/TcGenDeriv.lhs
index 88c2929..232bfe8 100644
--- a/compiler/typecheck/TcGenDeriv.lhs
+++ b/compiler/typecheck/TcGenDeriv.lhs
@@ -69,6 +69,7 @@ import TcEnv (InstInfo)
 import ListSetOps ( assocMaybe )
 import Data.List  ( partition, intersperse )
 import Data.Maybe ( isNothing )
+import BooleanFormula ( isTrue )
 \end{code}
 
 \begin{code}
@@ -132,7 +133,7 @@ genDerivedBinds dflags fix_env clas loc tycon
 -- We can derive a given class via Generics iff
 canDeriveViaGenerics :: DynFlags -> TyCon -> Class -> Maybe SDoc
 canDeriveViaGenerics dflags tycon clas =
-  let dfs          = map (defMethSpecOfDefMeth . snd) . classOpItems $ clas
+  let _dfs         = map (defMethSpecOfDefMeth . snd) . classOpItems $ clas
       b `orElse` s = if b then Nothing else Just (ptext (sLit s))
       Just m  <> _ = Just m
       Nothing <> n = n
@@ -141,11 +142,14 @@ canDeriveViaGenerics dflags tycon clas =
       -- 2) Opt_DerivingViaGenerics is on
      <> (xopt Opt_DerivingViaGenerics dflags `orElse` "Try enabling DerivingViaGenerics")
       -- 3) It has no non-default methods
-     <> (all (/= NoDM) dfs `orElse` "There are methods without a default definition")
+     -- <> (all (/= NoDM) dfs `orElse` "There are methods without a default definition")
       -- 4) It has at least one generic default method
-     <> (any (== GenericDM) dfs `orElse` "There must be at least one method with a default signature")
-      -- 5) It's not a newtype (that conflicts with GeneralizedNewtypeDeriving)
-     <> (not (isNewTyCon tycon) `orElse` "DerivingViaGenerics is not supported for newtypes")
+     -- <> (any (== GenericDM) dfs `orElse` "There must be at least one method with a default signature")
+      -- 3/4) Its MINIMAL set is empty
+     <> (isTrue (classMinimalDef clas) `orElse` "because its MINIMAL set is not empty")
+      -- 5) It a newtype and GND is enabled
+     <> (not (isNewTyCon tycon && xopt Opt_GeneralizedNewtypeDeriving dflags)
+          `orElse` "I don't know whether to use DerivingViaGenerics or GeneralizedNewtypeDeriving")
   -- Nothing: we can derive it via Generics
   -- Just s:  we can't, reason s
 \end{code}



More information about the ghc-commits mailing list