X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypecheck%2FTcRnTypes.lhs;h=98bb936b50ce0fc7271b6c8964c2dddf3237d1d5;hb=f555abffd676544cd13d022bf1eb829e63f7aebe;hp=ec2f5da7d0bb2c362e2befe40a1fc9367fe0516b;hpb=4ba96c06f2b69ea1fe2b27718013713e94c1520c;p=ghc-hetmet.git diff --git a/compiler/typecheck/TcRnTypes.lhs b/compiler/typecheck/TcRnTypes.lhs index ec2f5da..98bb936 100644 --- a/compiler/typecheck/TcRnTypes.lhs +++ b/compiler/typecheck/TcRnTypes.lhs @@ -1,4 +1,4 @@ -% + % (c) The University of Glasgow 2006 % (c) The GRASP Project, Glasgow University, 1992-2002 % @@ -53,7 +53,6 @@ import Packages import Type import Coercion import TcType -import TcGadt import InstEnv import FamInstEnv import IOEnv @@ -64,7 +63,7 @@ import NameSet import Var import VarEnv import Module -import UniqFM +import LazyUniqFM import SrcLoc import VarSet import ErrUtils @@ -152,7 +151,7 @@ data TcGblEnv -- (Ids defined in this module start in the local envt, -- though they move to the global envt during zonking) - tcg_type_env_var :: TcRef TypeEnv, + tcg_type_env_var :: TcRef TypeEnv, -- Used only to initialise the interface-file -- typechecker in initIfaceTcRn, so that it can see stuff -- bound in this module when dealing with hi-boot recursions @@ -318,8 +317,8 @@ data TcLclEnv -- Changes as we move inside an expression tcl_ctxt :: ErrCtxt, -- Error context tcl_errs :: TcRef Messages, -- Place to accumulate errors - tcl_th_ctxt :: ThStage, -- Template Haskell context - tcl_arrow_ctxt :: ArrowCtxt, -- Arrow-notation context + tcl_th_ctxt :: ThStage, -- Template Haskell context + tcl_arrow_ctxt :: ArrowCtxt, -- Arrow-notation context tcl_rdr :: LocalRdrEnv, -- Local name envt -- Maintained during renaming, of course, but also during @@ -369,7 +368,7 @@ type ThLevel = Int -- Incremented when going inside a bracket, -- decremented when going inside a splice -- NB: ThLevel is one greater than the 'n' in Fig 2 of the - -- original "Template meta-programmign for Haskell" paper + -- original "Template meta-programming for Haskell" paper impLevel, topLevel :: ThLevel topLevel = 1 -- Things defined at top level of this module @@ -470,7 +469,7 @@ data RefinementVisibility -- GADT refinement instance Outputable TcTyThing where -- Debugging only - ppr (AGlobal g) = ppr g + ppr (AGlobal g) = pprTyThing g ppr elt@(ATcId {}) = text "Identifier" <> ifPprDebug (brackets (ppr (tct_id elt) <> dcolon <> ppr (tct_type elt) <> comma <+> ppr (tct_level elt) <+> ppr (tct_co elt))) @@ -632,7 +631,7 @@ type Int, represented by Method 34 doubleId [Int] origin In addition to the basic Haskell variants of 'Inst's, they can now also -represent implication constraints 'forall tvs. (reft, given) => wanted' +represent implication constraints 'forall tvs. given => wanted' and equality constraints 'co :: ty1 ~ ty2'. NB: Equalities occur in two flavours: @@ -655,22 +654,17 @@ data Inst } | ImplicInst { -- An implication constraint - -- forall tvs. (reft, given) => wanted + -- forall tvs. given => wanted tci_name :: Name, tci_tyvars :: [TcTyVar], -- Quantified type variables - -- Includes coercion variables - -- mentioned in tci_reft - tci_reft :: Refinement, - tci_given :: [Inst], -- Only Dicts + tci_given :: [Inst], -- Only Dicts and EqInsts -- (no Methods, LitInsts, ImplicInsts) - tci_wanted :: [Inst], -- Only Dicts and ImplicInsts + tci_wanted :: [Inst], -- Only Dicts, EqInst, and ImplicInsts -- (no Methods or LitInsts) tci_loc :: InstLoc } - -- NB: the tci_given are not necessarily rigid, - -- although they will be if the tci_reft is non-trivial - -- NB: the tci_reft is already applied to tci_given and tci_wanted + -- NB: the tci_given are not necessarily rigid | Method { tci_id :: TcId, -- The Id for the Inst @@ -715,23 +709,22 @@ data Inst | EqInst { -- delayed unification of the form -- co :: ty1 ~ ty2 - tci_left :: TcType, -- ty1 - tci_right :: TcType, -- ty2 + tci_left :: TcType, -- ty1 -- both types are... + tci_right :: TcType, -- ty2 -- ...free of boxes tci_co :: Either -- co - TcTyVar -- a wanted equation, with a hole, to be - -- filled with a witness for the equality - -- for equation generated by the - -- unifier, 'ty1' is the actual and - -- 'ty2' the expected type - Coercion, -- a given equation, with a coercion - -- witnessing the equality - -- a coercion that originates from a - -- signature or a GADT is a CoVar, but - -- after normalisation of coercions, - -- they can be arbitrary Coercions - -- involving constructors and - -- pseudo-constructors like sym and - -- trans. + TcTyVar -- - a wanted equation, with a hole, to be + -- filled with a witness for the equality; + -- for equation arising from deferring + -- unification, 'ty1' is the actual and + -- 'ty2' the expected type + Coercion, -- - a given equation, with a coercion + -- witnessing the equality; + -- a coercion that originates from a + -- signature or a GADT is a CoVar, but + -- after normalisation of coercions, they + -- can be arbitrary Coercions involving + -- constructors and pseudo-constructors + -- like sym and trans. tci_loc :: InstLoc, tci_name :: Name -- Debugging help only: this makes it easier to @@ -865,18 +858,23 @@ data InstOrigin -- The rest are all occurrences: Insts that are 'wanted' ------------------------------------------------------- | OccurrenceOf Name -- Occurrence of an overloaded identifier + | SpecPragOrigin Name -- Specialisation pragma for identifier | IPOccOrigin (IPName Name) -- Occurrence of an implicit parameter | LiteralOrigin (HsOverLit Name) -- Occurrence of a literal + | NegateOrigin -- Occurrence of syntactic negation | ArithSeqOrigin (ArithSeqInfo Name) -- [x..], [x..y] etc | PArrSeqOrigin (ArithSeqInfo Name) -- [:x..y:] and [:x,y..z:] + | TupleOrigin -- (..,..) | InstSigOrigin -- A dict occurrence arising from instantiating -- a polymorphic type during a subsumption check + | ExprSigOrigin -- e :: ty | RecordUpdOrigin + | ViewPatOrigin | InstScOrigin -- Typechecking superclasses of an instance declaration | DerivOrigin -- Typechecking deriving | StandAloneDerivOrigin -- Typechecking stand-alone deriving @@ -888,13 +886,17 @@ data InstOrigin instance Outputable InstOrigin where ppr (OccurrenceOf name) = hsep [ptext SLIT("a use of"), quotes (ppr name)] + ppr (SpecPragOrigin name) = hsep [ptext SLIT("a specialisation pragma for"), quotes (ppr name)] ppr (IPOccOrigin name) = hsep [ptext SLIT("a use of implicit parameter"), quotes (ppr name)] ppr (IPBindOrigin name) = hsep [ptext SLIT("a binding for implicit parameter"), quotes (ppr name)] ppr RecordUpdOrigin = ptext SLIT("a record update") + ppr ExprSigOrigin = ptext SLIT("an expression type signature") + ppr ViewPatOrigin = ptext SLIT("a view pattern") ppr (LiteralOrigin lit) = hsep [ptext SLIT("the literal"), quotes (ppr lit)] ppr (ArithSeqOrigin seq) = hsep [ptext SLIT("the arithmetic sequence"), quotes (ppr seq)] ppr (PArrSeqOrigin seq) = hsep [ptext SLIT("the parallel array sequence"), quotes (ppr seq)] - ppr InstSigOrigin = ptext SLIT("instantiating a type signature") + ppr TupleOrigin = ptext SLIT("a tuple") + ppr NegateOrigin = ptext SLIT("a use of syntactic negation") ppr InstScOrigin = ptext SLIT("the superclasses of an instance declaration") ppr DerivOrigin = ptext SLIT("the 'deriving' clause of a data type declaration") ppr StandAloneDerivOrigin = ptext SLIT("a 'deriving' declaration") @@ -904,5 +906,4 @@ instance Outputable InstOrigin where ppr (ImplicOrigin doc) = doc ppr (SigOrigin info) = pprSkolInfo info ppr EqOrigin = ptext SLIT("a type equality") - \end{code}