7 years agoBe willing to parse {-# UNPACK #-} without '!'
Simon Peyton Jones [Thu, 10 Jan 2013 16:50:25 +0000 (16:50 +0000)] 
Be willing to parse {-# UNPACK #-} without '!'

This change gives a more helpful error message when the
user says    data T = MkT {-# UNPACK #-} Int
which should have a strictness '!' as well. Rather than
just a parse error, we get

  T7562.hs:3:14: Warning:
    UNPACK pragma lacks '!' on the first argument of `MkT'

Fixes Trac #7562

7 years agofix disassembler after removal of size field in bco->instrs (#7518)
Simon Marlow [Wed, 9 Jan 2013 14:46:03 +0000 (14:46 +0000)] 
fix disassembler after removal of size field in bco->instrs  (#7518)

7 years agoremove unnecessary size field in BCO (#7518)
Simon Marlow [Wed, 9 Jan 2013 11:51:58 +0000 (11:51 +0000)] 
remove unnecessary size field in BCO (#7518)

7 years agoadd docs for ":showi language" (#7501)
Simon Marlow [Wed, 9 Jan 2013 09:29:42 +0000 (09:29 +0000)] 
add docs for ":showi language" (#7501)

7 years agoMerge branch 'master' of
Simon Peyton Jones [Wed, 9 Jan 2013 09:37:12 +0000 (09:37 +0000)] 
Merge branch 'master' of


7 years agoMore tidying up in FamInstBranch
Simon Peyton Jones [Wed, 9 Jan 2013 08:58:40 +0000 (08:58 +0000)] 
More tidying up in FamInstBranch

In particular I removed the fib_index and fib_loc fields.
The "master version" is in the CoAxiom; the FamInstBranches
are only for matching.

7 years agoFix Trac #7560.
Richard Eisenberg [Wed, 9 Jan 2013 04:30:16 +0000 (23:30 -0500)] 
Fix Trac #7560.

Code in conflictInstErr did not handle the case where some branches
of a branched family instance had an error and some didn't. It was
all or nothing. Now, if there are no conflicts for a given branch,
conflictInstErr just ignores the branch instead of panicking.

7 years agoAdd missing import
Simon Peyton Jones [Tue, 8 Jan 2013 12:04:24 +0000 (12:04 +0000)] 
Add missing import

7 years agoAdd missing file TcValidity.lhs
Simon Peyton Jones [Tue, 8 Jan 2013 08:39:36 +0000 (08:39 +0000)] 
Add missing file TcValidity.lhs

This should have been part of
  commit 97db0edc4e637dd61ec635d1f9b6b6dd25ad890c
  Re-engineer the ambiguity test for user type signatures

7 years agoMerge remote branch 'origin/master'
Simon Peyton Jones [Tue, 8 Jan 2013 08:27:11 +0000 (08:27 +0000)] 
Merge remote branch 'origin/master'

7 years agoRe-engineer the ambiguity test for user type signatures
Simon Peyton Jones [Tue, 8 Jan 2013 08:26:40 +0000 (08:26 +0000)] 
Re-engineer the ambiguity test for user type signatures

Two main changes. First, re-engineer the ambiguity test.  Previously
TcMType.checkAmbiguity used a rather syntactic test to detect some
types that are certainly ambiguous.  But a much easier test is available,
and it is used for inferred types in TcBinds. Namely
    <type> is ambiguous
   <type> `TcUnify.isSubType` <type>
fails to hold, where "isSubType" means "is provably more polymorphic than".
      C a => Int
is ambiguous, because isSubType instantiates the (C a => Int)
to (C alpha => Int) and then tries to deduce (C alpha) from (C a). This is
Martin Sulzmann's definition of ambiguity.  (Defn 10 of "Understanding
functional dependencies via constraint handling rules", JFP.)

This change is neat, reduces code, and correctly rejects more programs.
However is *is* just possible to have a useful program that would be
rejected. For example
          class C a b
          f :: C Int b => Int -> Int
Here 'f' would be rejected as having an ambiguous type. But it is
just possible that, at a *call* site there might be an instance
declaration  instance C Int b, which does not constrain 'b' at all.
This is pretty strange -- why is 'b' overloaded at all? -- but it's
possible, so I also added a flag -XAllowAmbiguousTypes that simply
removes the ambiguity check.  Let's see if anyone cares.  Meanwhile
the earlier error report will be useful for everyone else.

A handful of regression tests had to be adjusted as a result, because
they used ambiguous types, somewhat accidentally.

Second, split TcMType (already too large) into two

  * TcMType: a low-level module dealing with monadic operations like
    zonking, creating new evidence variables, etc

  * TcValidity: a brand-new higher-level module dealing with
    validity checking for types: checkValidType, checkValidInstance,
    checkFamInstPats etc

Apart from the fact that TcMType was too big, this allows TcValidity
to import TcUnify(tcSubType) without causing a loop.

7 years agoRemove two unused imports, detected by the fix to Trac #7454
Simon Peyton Jones [Mon, 7 Jan 2013 17:52:08 +0000 (17:52 +0000)] 
Remove two unused imports, detected by the fix to Trac #7454

7 years agoRearrange the computation of unused imports; fixes Trac #7454
Simon Peyton Jones [Mon, 7 Jan 2013 17:50:57 +0000 (17:50 +0000)] 
Rearrange the computation of unused imports; fixes Trac #7454

7 years agoFix bugs in allocMoreStack (#7498, #7510)
Simon Marlow [Mon, 7 Jan 2013 12:26:29 +0000 (12:26 +0000)] 
Fix bugs in allocMoreStack (#7498, #7510)

There were four bugs here.  Clearly I didn't test this enough to
expose the bugs - it appeared to work on x86/Linux, but completely by
accident it seems.

1. the delta was wrong by a factor of the slot size (as noted on #7498)

2. we weren't correctly aligning the stack pointer (sp needs to be
16-byte aligned on x86/x86_64)

3. we were doing the adjustment multiple times in the case of a block
that was both a return point and a local branch target.  To fix this I
had to add new shim blocks to adjust the stack pointer, and retarget
the original branches.  See comment for details.

4. we were doing the adjustment for CALL instructions, which is
unnecessary and wrong; only JMPs should be preceded by a stack

(Someone with a PPC box will need to update the PPC version of
allocMoreStack to fix the above bugs, using the x86 version as a

7 years agomake "./sync-all -r <path> remote set-url origin" work
Simon Marlow [Fri, 21 Dec 2012 15:06:11 +0000 (15:06 +0000)] 
make "./sync-all -r <path> remote set-url origin" work

7 years agoMerge branch 'master' of
Simon Peyton Jones [Mon, 7 Jan 2013 10:45:08 +0000 (10:45 +0000)] 
Merge branch 'master' of

7 years agoRefactor invariants for FamInsts.
Richard Eisenberg [Sat, 5 Jan 2013 05:04:54 +0000 (00:04 -0500)] 
Refactor invariants for FamInsts.

This commit mirrors work done in the commit for ClsInsts, 5efe9b...

- All FamInsts have *fresh* type variables. So, no more freshness work
in addLocalFamInst

- Some pretty-printing code around FamInsts was cleaned up a bit
This caused location information to be added to CoAxioms and index
information to be added to FamInstBranches.

7 years agoAdd a -rpath entry for the RTS library, so that it can find libffi
Ian Lynagh [Fri, 4 Jan 2013 18:43:19 +0000 (18:43 +0000)] 
Add a -rpath entry for the RTS library, so that it can find libffi

This fixes dynamic library resolution when --enable-new-dtags is used

When --enable-new-dtags is used when linking an executable, a RUNPATH as
well as RPATH is set. The linker then ignores RPATH, and RUNPATH is only
used for directly (not transitively) needed libraries. As the program
doesn't directly need libffi, it isn't found.

7 years agoAdded note explaining the lambdas generated by functor deriving code, and how it...
Twan van Laarhoven [Thu, 3 Jan 2013 15:24:42 +0000 (16:24 +0100)] 
Added note explaining the lambdas generated by functor deriving code, and how it compares to the old deriving code which used eta expansion.

7 years agoChanged deriving of Functor, Foldable, Traversable to fix #7436. Added foldMap to...
Twan van Laarhoven [Fri, 23 Nov 2012 14:03:45 +0000 (15:03 +0100)] 
Changed deriving of Functor, Foldable, Traversable to fix #7436. Added foldMap to derived Foldable instance.

The derived instances will no longer eta-expand the function. I.e. instead of
    fmap f (Foo a) = Foo (fmap (\x -> f x) a)
we now derive
    fmap f (Foo a) = Foo (fmap f a)

Some superflous lambdas are generated as a result. For example
    data X a = X (a,a)
    fmap f (X x) = (\y -> case y of (a,b) -> (f a, f b)) x
The optimizer should be able to simplify this code, as it is just beta reduction.

The derived Foldable instance now includes foldMap in addition to foldr.

7 years agoMerge branch 'master' of
Simon Peyton Jones [Fri, 4 Jan 2013 10:31:25 +0000 (10:31 +0000)] 
Merge branch 'master' of

7 years agoSwitch on -XEmptyCase when renaming derived declarations
Simon Peyton Jones [Fri, 4 Jan 2013 10:30:53 +0000 (10:30 +0000)] 
Switch on -XEmptyCase when renaming derived declarations

Compiler-generated code can have empty cases

7 years agoAdd an ASSERT
Simon Peyton Jones [Fri, 4 Jan 2013 10:30:26 +0000 (10:30 +0000)] 

7 years agoRefactor HsExpr.MatchGroup
Simon Peyton Jones [Fri, 4 Jan 2013 10:30:14 +0000 (10:30 +0000)] 
Refactor HsExpr.MatchGroup

 * Make MatchGroup into a record, and use the record fields

 * Split the type field into two: mg_arg_tys and mg_res_ty
   This makes life much easier for the desugarer when the
   case alterantives are empty

A little bit of this change unavoidably ended up in the preceding
commit about empty case alternatives

7 years agoAllow empty case expressions (and lambda-case) with -XEmptyCase
Simon Peyton Jones [Fri, 4 Jan 2013 10:27:38 +0000 (10:27 +0000)] 
Allow empty case expressions (and lambda-case) with -XEmptyCase

The main changes are:
  * Parser accepts empty case alternatives
  * Renamer checks that -XEmptyCase is on in that case
  * (Typechecker is pretty much unchanged.)
  * Desugarer desugars empty case alternatives, esp:
      - Match.matchWrapper and Match.match now accept empty eqns
      - New function matchEmpty deals with the empty case
      - See Note [Empty case alternatives] in Match

This patch contains most of the work, but it's a bit mixed up
with a refactoring of MatchGroup that I did at the same time
(next commit).

7 years agoMake CaseElim a bit less aggressive
Simon Peyton Jones [Fri, 4 Jan 2013 10:18:49 +0000 (10:18 +0000)] 
Make CaseElim a bit less aggressive

See Note [Case elimination: lifted case]:

We used to do case elimination if
        (c) the scrutinee is a variable and 'x' is used strictly
But that changes
    case x of { _ -> error "bad" }
    --> error "bad"
which is very puzzling if 'x' is later bound to (error "good").
Where the order of evaluation is specified (via seq or case)
we should respect it.

c.f. Note [Empty case alternatives] in CoreSyn, which is how
I came across this.

7 years agoSet DBLATEX_OPTS to -P '' (fixes #7486)
Ian Lynagh [Fri, 4 Jan 2013 01:46:21 +0000 (01:46 +0000)] 
Set DBLATEX_OPTS to -P '' (fixes #7486)

Apparently this fixes the build with dblatex 0.3.4.

7 years agoMake validating with GhcProfiled=YES Just Work
Ian Lynagh [Thu, 3 Jan 2013 23:54:43 +0000 (23:54 +0000)] 
Make validating with GhcProfiled=YES Just Work

It now takes care of adding p to the GhcLibWays, rather than just
complaining that it's missing.

7 years agoFix LLVM code generated for word2Float# and word2Double#.
Geoffrey Mainland [Thu, 3 Jan 2013 16:59:03 +0000 (16:59 +0000)] 
Fix LLVM code generated for word2Float# and word2Double#.

7 years agoShip transformers with GHC
Ian Lynagh [Wed, 2 Jan 2013 20:49:07 +0000 (20:49 +0000)] 
Ship transformers with GHC

This means that we can use the standard MonadIO class, rather than
needing our own copy.

7 years agoWhitespace only in utils/MonadUtils.hs
Ian Lynagh [Wed, 2 Jan 2013 20:18:21 +0000 (20:18 +0000)] 
Whitespace only in utils/MonadUtils.hs

7 years agoMerge branch 'master' of
Simon Peyton Jones [Wed, 2 Jan 2013 16:40:13 +0000 (16:40 +0000)] 
Merge branch 'master' of

7 years agoAdd an extra error check in DEBUG mode for ill-typed unfoldings
Simon Peyton Jones [Wed, 2 Jan 2013 16:39:54 +0000 (16:39 +0000)] 
Add an extra error check in DEBUG mode for ill-typed unfoldings

7 years agoCrucial bug fix: use scrut' rather than scrut!
Simon Peyton Jones [Wed, 2 Jan 2013 16:39:34 +0000 (16:39 +0000)] 
Crucial bug fix: use scrut' rather than scrut!

7 years agoRefactoring; no change in behaviour
Simon Peyton Jones [Wed, 2 Jan 2013 16:39:12 +0000 (16:39 +0000)] 
Refactoring; no change in behaviour

7 years agoDefine ListSetOps.getNth, and use it
Simon Peyton Jones [Wed, 2 Jan 2013 16:38:46 +0000 (16:38 +0000)] 
Define ListSetOps.getNth, and use it

I was tracking down an error looking like
  Prelude.(!!): index too large
which is very unhelpful.  This patch replaces at least some uses
of (!!) in GHC with getNth, which has a more helpful error
message (with DEBUG anyway)

7 years agoTidy the type in badInstSigErr (fixes Trac #7545)
Simon Peyton Jones [Wed, 2 Jan 2013 16:24:14 +0000 (16:24 +0000)] 
Tidy the type in badInstSigErr (fixes Trac #7545)

7 years agoDe-tab PprExternalCore
Simon Peyton Jones [Wed, 2 Jan 2013 15:48:29 +0000 (15:48 +0000)] 
De-tab PprExternalCore

7 years agoFix bug in External Core pretty printer (fixes Trac #7547)
Simon Peyton Jones [Wed, 2 Jan 2013 15:47:31 +0000 (15:47 +0000)] 
Fix bug in External Core pretty printer (fixes Trac #7547)

This bug was making GHC loop when printing external core from test T7239.

7 years agoUpdate strictness documentation (Trac #7546)
Simon Peyton Jones [Wed, 2 Jan 2013 15:43:34 +0000 (15:43 +0000)] 
Update strictness documentation (Trac #7546)

7 years agoImprove HsSyn pretty-printing of instance declarations (fixes Trac #7532)
Simon Peyton Jones [Wed, 2 Jan 2013 12:37:07 +0000 (12:37 +0000)] 
Improve HsSyn pretty-printing of instance declarations (fixes Trac #7532)

7 years agoMinor refactoring plus comments
Simon Peyton Jones [Wed, 2 Jan 2013 11:58:35 +0000 (11:58 +0000)] 
Minor refactoring plus comments

7 years agoAdd flag -fwarn-duplicate-constraints
Simon Peyton Jones [Wed, 2 Jan 2013 11:57:00 +0000 (11:57 +0000)] 
Add flag -fwarn-duplicate-constraints

This fixes Trac #7541, and is on by default.
Use -fno-warn-duplicate-constraints to switch it off.

7 years agoRemove unnecessary import
Simon Peyton Jones [Wed, 2 Jan 2013 09:32:12 +0000 (09:32 +0000)] 
Remove unnecessary import

7 years agoAdd a reference to Note [SingI and EvLit] in the new SingI stuff
Simon Peyton Jones [Wed, 2 Jan 2013 09:17:56 +0000 (09:17 +0000)] 
Add a reference to Note [SingI and EvLit] in the new SingI stuff

7 years agoMerge branch 'master' of
Simon Peyton Jones [Wed, 2 Jan 2013 08:36:09 +0000 (08:36 +0000)] 
Merge branch 'master' of

7 years agoMake the fib_tvs field of FamInstBranch into a *list* not a *set*
Simon Peyton Jones [Wed, 2 Jan 2013 08:35:38 +0000 (08:35 +0000)] 
Make the fib_tvs field of FamInstBranch into a *list* not a *set*

This follows the correspondig change in ClsInst

7 years agoMerge branch 'master' of
Simon Peyton Jones [Wed, 2 Jan 2013 08:26:53 +0000 (08:26 +0000)] 
Merge branch 'master' of

7 years agoIn type or data instances, check that all variables are bound
Simon Peyton Jones [Wed, 2 Jan 2013 08:26:28 +0000 (08:26 +0000)] 
In type or data instances, check that all variables are bound

Trac #7536 points out that it's possible for the LHS to *look*
as if it binds variables, but does not acutally do so

         type T a = Int
         type instance F (T a) = a

This patch makes it an error.

7 years agoMake the comments about SingI and EvLit match current reality
Simon Peyton Jones [Tue, 1 Jan 2013 23:13:20 +0000 (23:13 +0000)] 
Make the comments about SingI and EvLit match current reality

See Note [SingI and EvLit] in TcEvidence.

7 years agoComments and white space only
Simon Peyton Jones [Tue, 1 Jan 2013 23:11:09 +0000 (23:11 +0000)] 
Comments and white space only

7 years agoRefactor the invariants for ClsInsts
Simon Peyton Jones [Tue, 1 Jan 2013 23:09:32 +0000 (23:09 +0000)] 
Refactor the invariants for ClsInsts

We now have the invariant for a ClsInst that the is_tvs field
is always completely fresh type variables. See
Note [Template tyvars are fresh] in InstEnv.

(Previously we frehened them when extending the instance environment,
but that seems messier because it was an invariant only when the
ClsInst was in an InstEnv.  Moreover, there was an invariant that
thet tyvars of the DFunid in the ClsInst had to match, and I have
removed that invariant altogether; there is no need for it.)

Other changes I made at the same time:

 * Make is_tvs into a *list*, in the right order for the dfun type
   arguments.  This removes the wierd need for the dfun to have the
   same tyvars as the ClsInst template, an invariant I have always
   hated. The cost is that we need to make it a VarSet when matching.
   We could cache an is_tv_set instead.

 * Add a cached is_cls field to the ClsInst, to save fishing
   the Class out of the DFun.  (Renamed is_cls to is_cls_nm.)

 * Make tcSplitDFunTy return the dfun args, not just the *number*
   of dfun args

 * Make InstEnv.instanceHead return just the *head* of the
   instance declaration.  Add instanceSig to return the whole

7 years agoFix typo in comment (Trac #7526)
Simon Peyton Jones [Tue, 1 Jan 2013 22:40:45 +0000 (22:40 +0000)] 
Fix typo in comment (Trac #7526)

7 years agoRemove references to GHC 6.6 in docs
Ben Millwood [Wed, 26 Dec 2012 23:24:49 +0000 (23:24 +0000)] 
Remove references to GHC 6.6 in docs

7 years agoMerge branch 'master' of
Ian Lynagh [Tue, 1 Jan 2013 13:24:58 +0000 (13:24 +0000)] 
Merge branch 'master' of

7 years agoFix dictionaries for SingI.
Iavor S. Diatchki [Sat, 29 Dec 2012 00:14:31 +0000 (16:14 -0800)] 
Fix dictionaries for SingI.

This adds the missing coercions in the constructed evidence for SingI.
Previously we simply passed an integer or a string for the evidence,
which was not quite correct and causes errors when the core lint is
enabled.   This patch corrects this by inserting the necessary

7 years agoMake the treatment of addAltUnfoldings handle casts
Simon Peyton Jones [Mon, 24 Dec 2012 13:43:30 +0000 (13:43 +0000)] 
Make the treatment of addAltUnfoldings handle casts

This minor refactoring re-attaches Note [Add unfolding for scrutinee].
It had become detached, which led me on a bit of a wild goose

While I was at it, I made the code work right for the case where
the scrutinee is of form (x |> co); I don't think this is an important

I also make simplAlt unconditionally zap occurrence information on
case-alternative binders (see Note [Case alternative occ info]);
it was almost always being zapped and the additional complexity seems
not worth it.

7 years agoMake combine-identical-alternatives work again (Trac #7360)
Simon Peyton Jones [Mon, 24 Dec 2012 13:25:12 +0000 (13:25 +0000)] 
Make combine-identical-alternatives work again (Trac #7360)

Move the "combine indentical alternatives" transformation *before*
simplifying the alternatives.  For example
     case x of y
        [] -> length y
        (_:_) -> length y }

If we look *post* simplification, since 'y' is used in the
alterantives, the case binders *might* be (see the keep_occ_info test
in Simplify.simplAlt); and hence the combination of the two
alteranatives does not happen.  But if we do it *pre* simplification
there is no problem.

This fixes Trac #7360.

7 years agoAdd traceSmpl for simplifier tracing, now that the simplifier has the IO monad
Simon Peyton Jones [Mon, 24 Dec 2012 13:20:59 +0000 (13:20 +0000)] 
Add traceSmpl for simplifier tracing, now that the simplifier has the IO monad

7 years agoSimplify the binder-swap transformation
Simon Peyton Jones [Mon, 24 Dec 2012 11:34:51 +0000 (11:34 +0000)] 
Simplify the binder-swap transformation

The occurrence analyser implements the "binder-swap" transformation,
described in Note [Binder swap] in OccAnal. For some reason I had
implemeted an extremely complicated version, I believe intended to get
as much as possible done in single simplifier pass.  But it turned
out (Trac #7258) that the 'getProxies' bit of this complicated code
scaled rather non-linearly, and all by itself could consume half of
the entire compile time.

The patch dramatically simplifies the transformation, so that
we simply swizzle
     case x of y { I# v -> e }
     case x of y { I# v -> let x = y in e }

I can't see any reason not to do this

  * Compiler allocation for #7258 with 200 fields goes down by 25%
    and compile time by 20%

  * The nofib figures do not budge

  * Quite a bit of complicated code goes away

7 years agoComment typo only
Simon Peyton Jones [Mon, 24 Dec 2012 11:20:30 +0000 (11:20 +0000)] 
Comment typo only

7 years agoMerge branch 'master' of
Simon Peyton Jones [Mon, 24 Dec 2012 09:49:54 +0000 (09:49 +0000)] 
Merge branch 'master' of

7 years agoRemember to zonk when taking free variables in simpl_top
Simon Peyton Jones [Mon, 24 Dec 2012 09:46:55 +0000 (09:46 +0000)] 
Remember to zonk when taking free variables in simpl_top

Forgetting this meant that we were upating the same
meta-tyvar twice.  Fixes Trac #7525.

7 years agoA bit more tracing
Simon Peyton Jones [Mon, 24 Dec 2012 09:38:43 +0000 (09:38 +0000)] 
A bit more tracing

7 years agoMerge branch 'master' of
Simon Peyton Jones [Sun, 23 Dec 2012 15:49:29 +0000 (15:49 +0000)] 
Merge branch 'master' of


7 years agoMake {-# UNPACK #-} work for type/data family invocations
Simon Peyton Jones [Sun, 23 Dec 2012 15:38:48 +0000 (15:38 +0000)] 
Make {-# UNPACK #-} work for type/data family invocations

This fixes most of Trac #3990.  Consider
  data family D a
  data instance D Double = CD Int Int
  data T = T {-# UNPACK #-} !(D Double)
Then we want the (D Double unpacked).

To do this we need to construct a suitable coercion, and it's much
safer to record that coercion in the interface file, lest the in-scope
instances differ somehow.  That in turn means elaborating the HsBang
type to include a coercion.

To do that I moved HsBang from BasicTypes to DataCon, which caused
quite a few minor knock-on changes.

Interface-file format has changed!

Still to do: need to do knot-tying to allow instances to take effect
within the same module.

7 years agorename do_map_arrow as do_premap (no semantic change)
Ross Paterson [Sun, 23 Dec 2012 12:59:41 +0000 (12:59 +0000)] 
rename do_map_arrow as do_premap (no semantic change)

7 years agoImplement overlapping type family instances.
Richard Eisenberg [Sat, 22 Dec 2012 01:54:15 +0000 (20:54 -0500)] 
Implement overlapping type family instances.

An ordered, overlapping type family instance is introduced by 'type
where', followed by equations. See the new section in the user manual
( for details. The canonical example is Boolean equality at the

type family Equals (a :: k) (b :: k) :: Bool
type instance where
  Equals a a = True
  Equals a b = False

A branched family instance, such as this one, checks its equations in
and applies only the first the matches. As explained in the note
checking within groups] in FamInstEnv.lhs, we must be careful not to
say, (Equals Int b) to False, because b might later unify with Int.

This commit includes all of the commits on the overlapping-tyfams
branch. SPJ
requested that I combine all my commits over the past several months
into one
monolithic commit. The following GHC repos are affected: ghc, testsuite,
utils/haddock, libraries/template-haskell, and libraries/dph.

Here are some details for the interested:

- The definition of CoAxiom has been moved from TyCon.lhs to a
  new file CoAxiom.lhs. I made this decision because of the
  number of definitions necessary to support BranchList.

- BranchList is a GADT whose type tracks whether it is a
  singleton list or not-necessarily-a-singleton-list. The reason
  I introduced this type is to increase static checking of places
  where GHC code assumes that a FamInst or CoAxiom is indeed a
  singleton. This assumption takes place roughly 10 times
  throughout the code. I was worried that a future change to GHC
  would invalidate the assumption, and GHC might subtly fail to
  do the right thing. By explicitly labeling CoAxioms and
  FamInsts as being Unbranched (singleton) or
  Branched (not-necessarily-singleton), we make this assumption
  explicit and checkable. Furthermore, to enforce the accuracy of
  this label, the list of branches of a CoAxiom or FamInst is
  stored using a BranchList, whose constructors constrain its
  type index appropriately.

I think that the decision to use BranchList is probably the most
controversial decision I made from a code design point of view.
Although I provide conversions to/from ordinary lists, it is more
efficient to use the brList... functions provided in CoAxiom than
always to convert. The use of these functions does not wander far
from the core CoAxiom/FamInst logic.

BranchLists are motivated and explained in the note [Branched axioms] in

- The CoAxiom type has changed significantly. You can see the new
  type in CoAxiom.lhs. It uses a CoAxBranch type to track
  branches of the CoAxiom. Correspondingly various functions
  producing and consuming CoAxioms had to change, including the
  binary layout of interface files.

- To get branched axioms to work correctly, it is important to have a
  of type "apartness": two types are apart if they cannot unify, and no
  substitution of variables can ever get them to unify, even after type
  simplification. (This is different than the normal failure to unify
  of the type family bit.) This notion in encoded in tcApartTys, in
  Because apartness is finer-grained than unification, the tcUnifyTys
  calls tcApartTys.

- CoreLinting axioms has been updated, both to reflect the new
  form of CoAxiom and to enforce the apartness rules of branch
  application. The formalization of the new rules is in

- The FamInst type (in types/FamInstEnv.lhs) has changed
  significantly, paralleling the changes to CoAxiom. Of course,
  this forced minor changes in many files.

- There are several new Notes in FamInstEnv.lhs, including one
  discussing confluent overlap and why we're not doing it.

- lookupFamInstEnv, lookupFamInstEnvConflicts, and
  lookup_fam_inst_env' (the function that actually does the work)
  have all been more-or-less completely rewritten. There is a
  Note [lookup_fam_inst_env' implementation] describing the
  implementation. One of the changes that affects other files is
  to change the type of matches from a pair of (FamInst, [Type])
  to a new datatype (which now includes the index of the matching
  branch). This seemed a better design.

- The TySynInstD constructor in Template Haskell was updated to
  use the new datatype TySynEqn. I also bumped the TH version
  number, requiring changes to DPH cabal files. (That's why the
  DPH repo has an overlapping-tyfams branch.)

- As SPJ requested, I refactored some of the code in HsDecls:

 * splitting up TyDecl into SynDecl and DataDecl, correspondingly
   changing HsTyDefn to HsDataDefn (with only one constructor)

 * splitting FamInstD into TyFamInstD and DataFamInstD and
   splitting FamInstDecl into DataFamInstDecl and TyFamInstDecl

 * making the ClsInstD take a ClsInstDecl, for parallelism with
   InstDecl's other constructors

 * changing constructor TyFamily into FamDecl

 * creating a FamilyDecl type that stores the details for a family
   declaration; this is useful because FamilyDecls can appear in classes
   other decls cannot

 * restricting the associated types and associated type defaults for a
 * class
   to be the new, more restrictive types

 * splitting cid_fam_insts into cid_tyfam_insts and cid_datafam_insts,
   according to the new types

 * perhaps one or two more that I'm overlooking

None of these changes has far-reaching implications.

- The user manual, section, is updated to describe the new type

7 years agoUse expectP in deriving( Read )
Simon Peyton Jones [Fri, 21 Dec 2012 17:39:33 +0000 (17:39 +0000)] 
Use expectP in deriving( Read )

Note [Use expectP]   in TcGenDeriv
Note that we use
   expectP (Ident "T1")
rather than
   Ident "T1" <- lexP
The latter desugares to inline code for matching the Ident and the
string, and this can be very voluminous. The former is much more
compact.  Cf Trac #7258, although that also concerned non-linearity in
the occurrence analyser, a separate issue.

7 years agoClarify documentation of [~] syntax on RULE activations
Simon Peyton Jones [Fri, 21 Dec 2012 13:17:26 +0000 (13:17 +0000)] 
Clarify documentation of [~] syntax on RULE activations

7 years agoOnly allow special NeverActive syntax for RULES.
Andrew Farmer [Thu, 6 Dec 2012 21:47:33 +0000 (15:47 -0600)] 
Only allow special NeverActive syntax for RULES.

7 years agoClarify promotion rules for newtypes in the documentation
Simon Peyton Jones [Fri, 21 Dec 2012 09:14:19 +0000 (09:14 +0000)] 
Clarify promotion rules for newtypes in the documentation

7 years agoLikely fix to uninitialized DynFlags in plugins.
Daniel Vainsencher [Thu, 13 Dec 2012 18:19:43 +0000 (18:19 +0000)] 
Likely fix to uninitialized DynFlags in plugins.

7 years agoMerge branch 'master' of
Simon Peyton Jones [Fri, 21 Dec 2012 08:06:16 +0000 (08:06 +0000)] 
Merge branch 'master' of

7 years agoAllow newtypes to be promoted
Simon Peyton Jones [Fri, 21 Dec 2012 08:05:58 +0000 (08:05 +0000)] 
Allow newtypes to be promoted

Fixes Trac #7488

7 years agoMerge branch 'master' of
Simon Peyton Jones [Thu, 20 Dec 2012 20:14:05 +0000 (20:14 +0000)] 
Merge branch 'master' of

7 years agoFix over-zealous ASSERT in TcUnify
Simon Peyton Jones [Thu, 20 Dec 2012 20:13:36 +0000 (20:13 +0000)] 
Fix over-zealous ASSERT in TcUnify

7 years agoRedirect asynchronous exceptions to the sandbox thread in runStmt (#1381)
Simon Marlow [Thu, 20 Dec 2012 09:18:49 +0000 (09:18 +0000)] 
Redirect asynchronous exceptions to the sandbox thread in runStmt (#1381)

See comment for details.

We no longer use pushInterruptTargetThread/popInterruptTargetThread,
so these could go away in due course.

7 years ago'sync-all get -q' also passes -q to 'git submodule'
Simon Marlow [Wed, 19 Dec 2012 10:13:09 +0000 (10:13 +0000)] 
'sync-all get -q' also passes -q to 'git submodule'

7 years agoRename all of the 'cmmz' flags and make them more consistent.
Austin Seipp [Mon, 17 Dec 2012 10:21:50 +0000 (04:21 -0600)] 
Rename all of the 'cmmz' flags and make them more consistent.

There's only a single compiler backend now, so the 'z' suffix means
nothing. Also, the flags were confusingly named ('cmm-foo' vs
'foo-cmm',) and counter-intuitively, '-ddump-cmm' did not do at all what
you expected since the new backend went live.

Basically, all of the -ddump-cmmz-* flags are now -ddump-cmm-*. Some were
renamed to be more consistent.

This doesn't update the manual; it already mentions '-ddump-cmm' and
that flag implies all the others anyway, which is probably what you

Signed-off-by: Austin Seipp <>
7 years agoMerge branch 'master' of
Simon Peyton Jones [Wed, 19 Dec 2012 23:50:38 +0000 (23:50 +0000)] 
Merge branch 'master' of

7 years agoFix TcUnify.matchExpectedTyConApp so that it returns types of compatible kinds
Simon Peyton Jones [Wed, 19 Dec 2012 23:49:47 +0000 (23:49 +0000)] 
Fix TcUnify.matchExpectedTyConApp so that it returns types of compatible kinds

This fixes Trac #7368. The problem was that we were matching
   Bad w ~ f (Bad f)
where (f :: * -> *).  Thta leads to (w ~ Bad f), which is
ill-kinded, but matchExpectedTyConApp was returning the (Bad f)
as the argument type, and that was being used to instanatiate
w in the data constructor type, which is very bad.

The code also becomes simpler and easier to understand, which is
an excellent thing.

7 years agoPass the correct inst_tys argument to dataConCannotMatch, in mkRecSelBinds
Simon Peyton Jones [Wed, 19 Dec 2012 17:37:27 +0000 (17:37 +0000)] 
Pass the correct inst_tys argument to dataConCannotMatch, in mkRecSelBinds

This fixes Trac #7503.

7 years agoAdd some ASSERTs to calls of zipTopTvSubst
Simon Peyton Jones [Wed, 19 Dec 2012 17:36:34 +0000 (17:36 +0000)] 
Add some ASSERTs to calls of zipTopTvSubst

7 years agoMove the kind Nat and Symbol out of TysPrim and into TysWiredIn
Simon Peyton Jones [Wed, 19 Dec 2012 17:35:51 +0000 (17:35 +0000)] 
Move the kind Nat and Symbol out of TysPrim and into TysWiredIn

They properly belong in TysWiredIn, since they are defined in Haskell
in GHC.TypeLits.

Moveover, make them WiredIn (again as they should be) and use
checkWiredInTyCon when encountering them in TcHsType.tc_hs_type,
so that the interface file is loaded.  This fixes Trac #7502.

7 years agoMerge branch 'master' of
Simon Peyton Jones [Wed, 19 Dec 2012 15:15:47 +0000 (15:15 +0000)] 
Merge branch 'master' of

7 years agoFix Trac #7506 (missing check for form of FFI type)
Simon Peyton Jones [Wed, 19 Dec 2012 13:23:21 +0000 (13:23 +0000)] 
Fix Trac #7506 (missing check for form of FFI type)

7 years agospelling in doc
Gabor Greif [Wed, 19 Dec 2012 12:37:08 +0000 (13:37 +0100)] 
spelling in doc

7 years agotypo
Gabor Greif [Fri, 14 Dec 2012 09:00:55 +0000 (10:00 +0100)] 

7 years agoMerge branch 'master' of
Simon Peyton Jones [Wed, 19 Dec 2012 10:32:09 +0000 (10:32 +0000)] 
Merge branch 'master' of

7 years agoWibbles to faa8ff40 (UNPACK pragmas)
Simon Peyton Jones [Wed, 19 Dec 2012 10:28:34 +0000 (10:28 +0000)] 
Wibbles to faa8ff40 (UNPACK pragmas)

Nothing big here, just tidying up deetails

7 years agoTidy up documtation of monomorphsim restriction etc
Simon Peyton Jones [Wed, 19 Dec 2012 09:10:26 +0000 (09:10 +0000)] 
Tidy up documtation of monomorphsim restriction etc

7 years agoDocument the behavior of "info!".
Iavor S. Diatchki [Wed, 19 Dec 2012 00:21:54 +0000 (16:21 -0800)] 
Document the behavior of "info!".

7 years agoMerge branch 'master' of
Ian Lynagh [Tue, 18 Dec 2012 16:09:41 +0000 (16:09 +0000)] 
Merge branch 'master' of

7 years agoA better fix for #7493 (see comment for details)
Simon Marlow [Tue, 18 Dec 2012 09:10:26 +0000 (09:10 +0000)] 
A better fix for #7493 (see comment for details)

7 years agoRevert "Fix a bug in the handling of nested orElse"
Simon Marlow [Tue, 18 Dec 2012 08:43:29 +0000 (08:43 +0000)] 
Revert "Fix a bug in the handling of nested orElse"

This reverts commit f184d9caffa09750ef6a374a7987b9213d6db28e.

The next commit will fix it in a better way.

7 years agoRemove some redundant parentheses
Ian Lynagh [Sun, 16 Dec 2012 21:30:26 +0000 (21:30 +0000)] 
Remove some redundant parentheses

7 years agoSmall refactoring: makes it easier to see what nativeCodeGen actually does
Ian Lynagh [Sun, 16 Dec 2012 14:06:53 +0000 (14:06 +0000)] 
Small refactoring: makes it easier to see what nativeCodeGen actually does

7 years agoPPC: Implement stack resizing for the linear register allocator.
Erik de Castro Lopo [Sat, 15 Dec 2012 17:40:54 +0000 (04:40 +1100)] 
PPC: Implement stack resizing for the linear register allocator.

Fixes #7498.

7 years agoDe-tab compiler/nativeGen/PPC/Instr.hs.
Erik de Castro Lopo [Sat, 15 Dec 2012 09:55:21 +0000 (20:55 +1100)] 
De-tab compiler/nativeGen/PPC/Instr.hs.