diff options
| author | Sebastian Graf <sebastian.graf@kit.edu> | 2019-10-25 11:20:48 +0200 |
|---|---|---|
| committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2019-10-28 09:22:35 -0400 |
| commit | e951f219597a3e8209abd62f85c717865f7445ca (patch) | |
| tree | f1036c6a31758fb835179fc147ab4830c0b61c20 /compiler/GHC/Hs/ImpExp.hs | |
| parent | e0e0485634d9a047b43da958c09e3bf6c5937c0f (diff) | |
| download | haskell-e951f219597a3e8209abd62f85c717865f7445ca.tar.gz | |
Use FlexibleInstances for `Outputable (* p)` instead of match-all instances with equality constraints
In #17304, Richard and Simon dicovered that using `-XFlexibleInstances`
for `Outputable` instances of AST data types means users can provide orphan
`Outputable` instances for passes other than `GhcPass`.
Type inference doesn't currently to suffer, and Richard gave an example
in #17304 that shows how rare a case would be where the slightly worse
type inference would matter.
So I went ahead with the refactoring, attempting to fix #17304.
Diffstat (limited to 'compiler/GHC/Hs/ImpExp.hs')
| -rw-r--r-- | compiler/GHC/Hs/ImpExp.hs | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/compiler/GHC/Hs/ImpExp.hs b/compiler/GHC/Hs/ImpExp.hs index 56d1691ac4..32cc3b21a9 100644 --- a/compiler/GHC/Hs/ImpExp.hs +++ b/compiler/GHC/Hs/ImpExp.hs @@ -8,6 +8,7 @@ GHC.Hs.ImpExp: Abstract syntax: imports, exports, interfaces {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE UndecidableInstances #-} -- Note [Pass sensitive types] @@ -125,8 +126,8 @@ simpleImportDecl mn = ImportDecl { ideclHiding = Nothing } -instance (p ~ GhcPass pass,OutputableBndrId p) - => Outputable (ImportDecl p) where +instance OutputableBndrId p + => Outputable (ImportDecl (GhcPass p)) where ppr (ImportDecl { ideclSourceSrc = mSrcText, ideclName = mod' , ideclPkgQual = pkg , ideclSource = from, ideclSafe = safe @@ -322,7 +323,7 @@ replaceWrappedName (IEType (L l _)) n = IEType (L l n) replaceLWrappedName :: LIEWrappedName name1 -> name2 -> LIEWrappedName name2 replaceLWrappedName (L l n) n' = L l (replaceWrappedName n n') -instance (p ~ GhcPass pass,OutputableBndrId p) => Outputable (IE p) where +instance OutputableBndrId p => Outputable (IE (GhcPass p)) where ppr (IEVar _ var) = ppr (unLoc var) ppr (IEThingAbs _ thing) = ppr (unLoc thing) ppr (IEThingAll _ thing) = hcat [ppr (unLoc thing), text "(..)"] |
