summaryrefslogtreecommitdiff
path: root/compiler/basicTypes/Id.hs
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2014-12-23 15:39:50 +0000
committerSimon Peyton Jones <simonpj@microsoft.com>2014-12-23 16:01:23 +0000
commita6f0f5ab45b2643b561e0a0a54a4f14745ab2152 (patch)
treeb9b303cd971dc82bf01849de881eff87e1d48ed3 /compiler/basicTypes/Id.hs
parent625dd7b646d37177731cad20abd4026f2725472f (diff)
downloadhaskell-a6f0f5ab45b2643b561e0a0a54a4f14745ab2152.tar.gz
Eliminate so-called "silent superclass parameters"
The purpose of silent superclass parameters was to solve the awkward problem of superclass dictinaries being bound to bottom. See THE PROBLEM in Note [Recursive superclasses] in TcInstDcls Although the silent-superclass idea worked, * It had non-local consequences, and had effects even in Haddock, where we had to discard silent parameters before displaying instance declarations * It had unexpected peformance costs, shown up by Trac #3064 and its test case. In monad-transformer code, when constructing a Monad dictionary you had to pass an Applicative dictionary; and to construct that you neede a Functor dictionary. Yet these extra dictionaries were often never used. (All this got much worse when we added Applicative as a superclass of Monad.) Test T3064 compiled *far* faster after silent superclasses were eliminated. * It introduced new bugs. For example SilentParametersOverlapping, T5051, and T7862, all failed to compile because of instance overlap directly because of the silent-superclass trick. So this patch takes a new approach, which I worked out with Dimitrios in the closing hours before Christmas. It is described in detail in THE PROBLEM in Note [Recursive superclasses] in TcInstDcls. Seems to work great! Quite a bit of knock-on effect * The main implementation work is in tcSuperClasses in TcInstDcls Everything else is fall-out * IdInfo.DFunId no longer needs its n-silent argument * Ditto IDFunId in IfaceSyn * Hence interface file format changes * Now that DFunIds do not have silent superclass parameters, printing out instance declarations is simpler. There is tiny knock-on effect in Haddock, so that submodule is updated * I realised that when computing the "size of a dictionary type" in TcValidity.sizePred, we should be rather conservative about type functions, which can arbitrarily increase the size of a type. Hence the new datatype TypeSize, which has a TSBig constructor for "arbitrarily big". * instDFunType moves from TcSMonad to Inst * Interestingly, CmmNode and CmmExpr both now need a non-silent (Ord r) in a couple of instance declarations. These were previously silent but must now be explicit. * Quite a bit of wibbling in error messages
Diffstat (limited to 'compiler/basicTypes/Id.hs')
-rw-r--r--compiler/basicTypes/Id.hs7
1 files changed, 1 insertions, 6 deletions
diff --git a/compiler/basicTypes/Id.hs b/compiler/basicTypes/Id.hs
index ccd6c9b494..3e6473ff6e 100644
--- a/compiler/basicTypes/Id.hs
+++ b/compiler/basicTypes/Id.hs
@@ -61,7 +61,7 @@ module Id (
hasNoBinding,
-- ** Evidence variables
- DictId, isDictId, dfunNSilent, isEvVar,
+ DictId, isDictId, isEvVar,
-- ** Inline pragma stuff
idInlinePragma, setInlinePragma, modifyInlinePragma,
@@ -392,11 +392,6 @@ isDFunId id = case Var.idDetails id of
DFunId {} -> True
_ -> False
-dfunNSilent :: Id -> Int
-dfunNSilent id = case Var.idDetails id of
- DFunId ns _ -> ns
- _ -> pprPanic "dfunSilent: not a dfun:" (ppr id)
-
isPrimOpId_maybe id = case Var.idDetails id of
PrimOpId op -> Just op
_ -> Nothing