3 years agoRenaming and comments in CorePrep
Simon Peyton Jones [Wed, 2 Nov 2016 16:48:38 +0000 (16:48 +0000)] 
Renaming and comments in CorePrep

In particular I renamed
  'triv' to 'arg'
  CpeTriv to CpeArg
in Note [CorePrep invariants], with knock on consequences.

This is groundwork for the fix to Trac #11158

3 years agoFix Trac #12797: approximateWC
Simon Peyton Jones [Wed, 2 Nov 2016 11:53:21 +0000 (11:53 +0000)] 
Fix Trac #12797: approximateWC

This patch makes approximateWC a bit more gung-ho when called
from the defaulting code.  See Note [ApproximateWC], item (1).

3 years agoUse substTyUnchecked in TcMType.new_meta_tv_x
Simon Peyton Jones [Wed, 2 Nov 2016 11:50:10 +0000 (11:50 +0000)] 
Use substTyUnchecked in TcMType.new_meta_tv_x

Sadly, one of the indirect callers of this function doesn't yet
enforce the in-scope set.  It's in the TcHsType.tc_infer_args swamp,
so I'm not going to wade in there today.

The assertion tripped when investigating Trac #12785; but this patch
does NOT fix the actual bug reported there.

3 years agoSimplify the API for TcHsType.kcHsTyVarBndrs
Simon Peyton Jones [Wed, 2 Nov 2016 11:48:51 +0000 (11:48 +0000)] 
Simplify the API for TcHsType.kcHsTyVarBndrs

Pass in a Bool rather than return a funcion!

No change in behaviour.

3 years agoGet rid of TcTyVars more assiduously
Simon Peyton Jones [Wed, 2 Nov 2016 11:42:37 +0000 (11:42 +0000)] 
Get rid of TcTyVars more assiduously

* I found a bug in 'generalize' in TcTyClsDecls.kcTyClGroup, where
  the kind variables weren't being turned into proper TyVars, so
  we got (skolem) TcTyVars in TyCons, which shouldn't happen.  Fix
  was easy.

* Similarly TcHsType.kindGeneralizeType wasn't turning the forall'd
  TcTyVars into TyVars.  To achieve this I defined TcHsTyn.zonkSigType.

* All this allowed me to remove awkward and ill-explained bit of
  footwork on DFunIds in Inst.newClsInst

This is just refactoring, but it does make the printout from
-ddump-deriv make a bit more sense by not grautuitiously cloning
type variables.  In the display I was seeing

   instance C [a_df4] where
      f x = ...a_dx5...

where actually the d_df4 and a_dx5 were the same.

3 years agoTiny refactor
Simon Peyton Jones [Tue, 1 Nov 2016 14:03:57 +0000 (14:03 +0000)] 
Tiny refactor

Swap order of calls in genInst just to make
the two cases the same

Plus some alpha-renaming

3 years agoSparc*: Prevent GHC from doing unaligned accesses
Erik de Castro Lopo [Tue, 1 Nov 2016 19:26:22 +0000 (06:26 +1100)] 
Sparc*: Prevent GHC from doing unaligned accesses

This is specifically for the C backend on Sparc64 (which has
no native backend) but is also required for Sparc when building

Bug reported via Debian (patch included):

Test Plan: validate

Reviewers: hvr, Phyx, bgamari, austin, simonmar

Reviewed By: Phyx

Subscribers: jrtc27, thomie

Differential Revision:

GHC Trac Issues: #12793

3 years agoHave static pointers work with -fno-full-laziness.
Facundo Domínguez [Fri, 28 Oct 2016 22:25:05 +0000 (19:25 -0300)] 
Have static pointers work with -fno-full-laziness.

Before this patch, static pointers wouldn't be floated to
the top-level.

Test Plan: ./validate

Reviewers: simonpj, bgamari, austin

Subscribers: mboes, thomie

Differential Revision:

GHC Trac Issues: #11656

3 years agoAlign GHCi's library search order more closely with LDs
Tamar Christina [Mon, 31 Oct 2016 21:03:14 +0000 (21:03 +0000)] 
Align GHCi's library search order more closely with LDs

Given a static library and an import library in the same folder. e.g.


running `ghci -lfoo` we should prefer the import library `libfoo.dll.a`
over `libfoo.a` because we prefer having to just load the DLL.
And not having to do any linking.

This also more closely emulated the behaviour of LD, which has a search order of

cygxxx.dll (*)

Test Plan: ./validate

Reviewers: RyanGlScott, austin, hvr, bgamari, erikd, simonmar

Reviewed By: RyanGlScott

Subscribers: thomie, #ghc_windows_task_force

Differential Revision:

GHC Trac Issues: #12771

3 years agoTypos in comments
Gabor Greif [Mon, 31 Oct 2016 11:08:50 +0000 (12:08 +0100)] 
Typos in comments

3 years agoZap redundant imports
Gabor Greif [Sun, 30 Oct 2016 18:02:33 +0000 (19:02 +0100)] 
Zap redundant imports

3 years agoFix a bug in parallel GC synchronisation
Simon Marlow [Fri, 28 Oct 2016 15:30:14 +0000 (08:30 -0700)] 
Fix a bug in parallel GC synchronisation

The problem boils down to global variables: in particular gc_threads[],
which was being modified by a subsequent GC before the previous GC had
finished with it.  The fix is to not use global variables.

This was causing setnumcapabilities001 to fail (again!).  It's an old
bug though.

Test Plan:
Ran setnumcapabilities001 in a loop for a couple of hours.  Before this
patch it had been failing after a few minutes.  Not a very scientific
test, but it's the best I have.

Reviewers: bgamari, austin, fryguybob, niteria, erikd

Subscribers: thomie

Differential Revision:

3 years agoMinor refactoring in stg_unpackClosurezh
Ömer Sinan Ağacan [Fri, 28 Oct 2016 19:39:11 +0000 (15:39 -0400)] 
Minor refactoring in stg_unpackClosurezh

- Reuse `clos` local variable
- Rename labels for clarity

3 years agoDocument unpackClosure# primop
Ömer Sinan Ağacan [Fri, 28 Oct 2016 19:36:55 +0000 (15:36 -0400)] 
Document unpackClosure# primop

3 years agoAdd test for #12732
Ryan Scott [Fri, 28 Oct 2016 21:00:29 +0000 (17:00 -0400)] 
Add test for #12732

3 years agoMake it possible to use +RTS -qn without -N
Simon Marlow [Fri, 28 Oct 2016 15:34:44 +0000 (16:34 +0100)] 
Make it possible to use +RTS -qn without -N

It's entirely reasonable to set +RTS -qn without setting -N, because the
program might later call setNumCapabilities.  If we disallow it, there's
no way to use -qn on programs that use setNumCapabilities.

3 years agoClarify comments on kinds (Trac #12536)
Simon Peyton Jones [Fri, 28 Oct 2016 11:08:49 +0000 (12:08 +0100)] 
Clarify comments on kinds (Trac #12536)

- Remove misleading comments from TyCoRep.
- Remove 'check_lifted' calls (which were no-ops) from TcValidity.

3 years agoMinor doc addition as requested in #12774.
Edward Z. Yang [Fri, 28 Oct 2016 01:09:40 +0000 (18:09 -0700)] 
Minor doc addition as requested in #12774.

Signed-off-by: Edward Z. Yang <>
3 years agoRevert "rts/linker: Move loadArchive to new source file"
Matthew Pickering [Thu, 27 Oct 2016 08:47:55 +0000 (09:47 +0100)] 
Revert "rts/linker: Move loadArchive to new source file"

This reverts commit 488a9ed3440fe882ae043ba7f44fed4e84e679ce.

3 years agoFix typo in comment
Simon Peyton Jones [Thu, 27 Oct 2016 07:33:06 +0000 (08:33 +0100)] 
Fix typo in comment

3 years agoAllow levity-polymorpic arrows
Simon Peyton Jones [Wed, 26 Oct 2016 14:34:56 +0000 (15:34 +0100)] 
Allow levity-polymorpic arrows

This cures Trac #12668 (and cures the Lint errors you get from
Trac #12718).

The idea is explained in Note [Levity polymorphism], in Kind.hs

3 years agoCollect coercion variables, not type variables
Simon Peyton Jones [Wed, 26 Oct 2016 13:58:59 +0000 (14:58 +0100)] 
Collect coercion variables, not type variables

...when tracking which constraints are used.

Previously we were gathering type variables too, which meant that the
ics_need field was (stupidly) non-empty, which meant that we kept hold
of solved implications for no purpose.  Better just to get rid of them,
which setImplicationStatus is all ste up to to do.

No change in behaviour; a bit more efficient.

3 years agoSimple refactor to remove misleading comment
Simon Peyton Jones [Wed, 26 Oct 2016 13:57:57 +0000 (14:57 +0100)] 
Simple refactor to remove misleading comment

3 years agoCmmUtils: remove the last dataflow functions
Michal Terepeta [Wed, 26 Oct 2016 15:20:33 +0000 (11:20 -0400)] 
CmmUtils: remove the last dataflow functions

This commit:
- Moves the remaining few methods concerned with dataflow analysis
  from `CmmUtils` to `Hoopl.Dataflow`.
- Refactors the code to not use `FwdPass` and simply pass `FwdTransfer`
  and `DataflowLattice` directly.

Signed-off-by: Michal Terepeta <>
Test Plan: validate

Reviewers: austin, simonmar, bgamari

Reviewed By: simonmar, bgamari

Subscribers: thomie

Differential Revision:

3 years agoRemove -dtrace-level
Matthew Pickering [Wed, 26 Oct 2016 15:20:06 +0000 (11:20 -0400)] 
Remove -dtrace-level

The flag was:

1. Not documented.
2. Only used as a boolean flag.
3. Has overlapping functionality with -dno-debug-output
4. My poll of #ghc concluded that people didn't know it existed.

Reviewers: austin, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #12691

3 years agoRefine ASSERT in buildPatSyn for the nullary case.
Matthew Pickering [Wed, 26 Oct 2016 15:19:48 +0000 (11:19 -0400)] 
Refine ASSERT in buildPatSyn for the nullary case.

For a nullary pattern synonym we add an extra void argument to the
matcher in order to preserve laziness. The check in buildPatSyn
wasn't aware of this special case which was causing the assertion to

Reviewers: austin, simonpj, bgamari

Reviewed By: simonpj, bgamari

Subscribers: simonpj, thomie

Differential Revision:

GHC Trac Issues: #12746

3 years agorts/linker: Move loadArchive to new source file
Ben Gamari [Wed, 26 Oct 2016 15:19:01 +0000 (11:19 -0400)] 
rts/linker: Move loadArchive to new source file

Test Plan: Validate

Reviewers: erikd, simonmar, austin, DemiMarie

Reviewed By: erikd, simonmar, DemiMarie

Subscribers: hvr, thomie

Differential Revision:

GHC Trac Issues: #12388

3 years agoMake traceRn behave more like traceTc
Matthew Pickering [Wed, 26 Oct 2016 15:18:39 +0000 (11:18 -0400)] 
Make traceRn behave more like traceTc

Reviewers: bgamari, austin

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #12617

3 years agoDelete extraneous backtick in users' guide
Ryan Scott [Wed, 26 Oct 2016 14:18:49 +0000 (10:18 -0400)] 
Delete extraneous backtick in users' guide

[ci skip]

3 years agoFundeps work even for unary type classes
Simon Peyton Jones [Wed, 26 Oct 2016 09:54:16 +0000 (10:54 +0100)] 
Fundeps work even for unary type classes

The functional-dependency improvement functions,
had a side-condition that said the type class has to have at
least two arguments.  But not so, as Trac #12763 shows:

   class C a | -> a where ...

is perfectly legal, albeit a bit of a corner case.

3 years agotestsuite: Bump peak_megabytes_allocated for T3064
Ben Gamari [Tue, 25 Oct 2016 13:50:29 +0000 (09:50 -0400)] 
testsuite: Bump peak_megabytes_allocated for T3064

3 years agoTest Trac #12081
Simon Peyton Jones [Mon, 24 Oct 2016 16:37:16 +0000 (17:37 +0100)] 
Test Trac #12081

3 years agoTest Trac #12174
Simon Peyton Jones [Mon, 24 Oct 2016 16:31:43 +0000 (17:31 +0100)] 
Test Trac #12174

3 years agoTake account of kinds in promoteTcType
Simon Peyton Jones [Mon, 24 Oct 2016 16:01:41 +0000 (17:01 +0100)] 
Take account of kinds in promoteTcType

One of the ASSERT failures in Trac #12762, namely the one for T4439,
showed that I had not dealt correctly with promoting the kind of
a type in promoteTcType.

Happily I could fix this by simplifying InferRes (eliminating the
ir_kind field), so things get better. And the ASSERT is fixed.

3 years agoDon't instantaite when typechecking a pattern synonym
Simon Peyton Jones [Mon, 24 Oct 2016 15:59:03 +0000 (16:59 +0100)] 
Don't instantaite when typechecking a pattern synonym

Fixes most of the cases in Trac #12762

3 years agoPrioritise class-level equality costraints
Simon Peyton Jones [Mon, 24 Oct 2016 15:55:49 +0000 (16:55 +0100)] 
Prioritise class-level equality costraints

This patch fixes Trac #12734 by prioritising the class-level
variants of equality constraints, namely (a~b) and (a~~b).

See comment:10 of Trac #12734 for a description of what
went wrong, and Note [Prioritise class equalities] in TcSMonad.

The fix is still not great, but it's a definite step forward, and
cures the particular problem.

Worth merging to 8.0.

3 years agorts: Move path utilities to separate source file
Ben Gamari [Sun, 23 Oct 2016 18:03:48 +0000 (14:03 -0400)] 
rts: Move path utilities to separate source file

Test Plan: Validate

Reviewers: simonmar, austin, erikd

Reviewed By: simonmar

Subscribers: thomie

Differential Revision:

3 years agoRefactoring: Replace when (not ...) with unless in ErrUtils
Matthew Pickering [Sat, 22 Oct 2016 23:22:30 +0000 (00:22 +0100)] 
Refactoring: Replace when (not ...) with unless in ErrUtils

[skip ci]

3 years agorts/ Fix CPP usage
Erik de Castro Lopo [Sat, 22 Oct 2016 23:16:10 +0000 (00:16 +0100)] 
rts/ Fix CPP usage

The configure script sets `HAVE_LIBNUMA` to either `0` or `1` but this
file had `#ifdef HAVE_LIBNUMA`. This surfaced as a side-effect of
1050e46b5b. CPP is really hard to get right.

Test Plan: Validate on harbourmaster

Reviewers: simonmar, bgamari, austin, mpickering

Reviewed By: mpickering

Subscribers: thomie

Differential Revision:

3 years agocmm/Hoopl/Dataflow: minor cleanup
Michal Terepeta [Sat, 22 Oct 2016 19:42:04 +0000 (15:42 -0400)] 
cmm/Hoopl/Dataflow: minor cleanup

This doesn't have any functional changes, it simply removes one
unnecessary top binding and improves the comments.

Signed-off-by: Michal Terepeta <>
Test Plan: ./validate

Reviewers: austin, bgamari, simonmar

Reviewed By: simonmar

Subscribers: thomie

Differential Revision:

3 years agoRefactoring: Delete copied function in backpack/NameShape
Matthew Pickering [Sat, 22 Oct 2016 19:40:51 +0000 (15:40 -0400)] 
Refactoring: Delete copied function in backpack/NameShape

Also moved a few utility functions which work with Avails into
the Avail module to avoid import loops and increase discoverability.

Reviewers: austin, bgamari, ezyang

Reviewed By: ezyang

Subscribers: thomie

Differential Revision:

3 years agoAdd -Wcpp-undef warning flag
Erik de Castro Lopo [Sat, 22 Oct 2016 19:38:41 +0000 (15:38 -0400)] 
Add -Wcpp-undef warning flag

When enabled, this new warning flag passes `-Wundef` to the C
pre-processor which causes the pre-processor to warn on uses of
the `#if` directive on undefined identifiers.

It is not currently enabled in any of the standard warning groups.

Test Plan: Make sure the two tests pass on all major platforms.

Reviewers: hvr, carter, Phyx, bgamari, austin

Reviewed By: Phyx

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #12752

3 years agoSkip T5611 on OSX as it fails non-deterministically.
Matthew Pickering [Sat, 22 Oct 2016 19:36:42 +0000 (15:36 -0400)] 
Skip T5611 on OSX as it fails non-deterministically.

Reviewers: austin, bgamari

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #12751

3 years agorts: should populate HAVE_LIBNUMA instead of USE_LIBNUMA
Darshan Kapashi [Fri, 21 Oct 2016 16:03:19 +0000 (12:03 -0400)] 
rts: should populate HAVE_LIBNUMA instead of USE_LIBNUMA

Code in rts/ which deals with numa checks for `#if HAVE_LIBNUMA`,
however this macro is not populated during `./configure`. changed this code last and we
instead set `USE_LIBNUMA` which fails to setup numa correctly.

Test Plan:
From main directory in ghc,

  ./configure && make clean && make boot && make
  cd nofib/parallel/queens
  ../../../inplace/bin/ghc-stage2 Main.hs -rtsopts -threaded
  ./Main 15 +RTS -N24 -s -A64m --numa

This fails before this patch with

  Main: --numa: OS reports NUMA is not available

After the fix, it works as expected.

Run the validation script,


(It fails with an error in `compiler/utils/Util.hs` saying
`GHC.Stack.CallStack` not found, once I remove this 1 line from this
file , the script works)

Reviewers: hvr, austin, bgamari, erikd, simonmar

Reviewed By: erikd, simonmar

Subscribers: mpickering, thomie, erikd, niteria

Differential Revision:

GHC Trac Issues: #12741

3 years agoFix failure in setnumcapabilities001 (#12728)
Simon Marlow [Fri, 21 Oct 2016 16:02:57 +0000 (12:02 -0400)] 
Fix failure in setnumcapabilities001 (#12728)

The value of enabled_capabilities can change across a call to
requestSync(), and we were erroneously using an old value, causing
things to go wrong later.  It manifested as an assertion failure, I'm
not sure whether there are worse consequences or not, but we should
get this fix into 8.0.2 anyway.

The failure didn't happen for me because it only shows up on machines
with fewer than 4 processors, due to the new logic to enable -qn
automatically.  I've bumped the test parameter 8 to make it more
likely to exercise that code.

Test Plan: Ran setnumcapabilities001 many times

Reviewers: niteria, austin, erikd, rwbarton, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #12728

3 years agoAdd and use a new dynamic-library-dirs field in the ghc-pkg info
Duncan Coutts [Fri, 21 Oct 2016 21:32:02 +0000 (14:32 -0700)] 
Add and use a new dynamic-library-dirs field in the ghc-pkg info

Build systems / package managers want to be able to control the file
layout of installed libraries. In general they may want/need to be able
to put the static libraries and dynamic libraries in different places.
The ghc-pkg library regisrtation needs to be able to handle this.

This is already possible in principle by listing both a static lib dir
and a dynamic lib dir in the library-dirs field (indeed some previous
versions of Cabal did this for shared libs on ELF platforms).

The downside of listing both dirs is twofold. There is a lack of
precision, if we're not careful with naming then we could end up
picking up the wrong library. The more immediate problem however is
that if we list both directories then both directories get included
into the ELF and Mach-O shared object runtime search paths. On ELF this
merely slows down loading of shared libs (affecting prog startup time).
On the latest OSX versions this provokes a much more serious problem:
that there is a rather low limit on the total size of the section
containing the runtime search path (and lib names and related) and thus
listing any unnecessary directories wastes the limited space.

So the solution in this patch is fairly straightforward: split the
static and dynamic library search paths in the ghc-pkg db and its use
within ghc. This is a traditional solution: pkg-config has the same
static / dynamic split (though it describes in in terms of private and
public, but it translates into different behaviour for static and
dynamic linking).

Indeed it would make perfect sense to also have a static/dynamic split
for the list of the libraries to use i.e. to have dynamic variants of
the hs-libraries and extra-libraries fields. These are not immediately
required so this patch does not add it, but it is a reasonable
direction to follow.

To handle compatibility, if the new dynamic-library-dirs field is not
specified then its value is taken from the library-dirs field.

Contains Cabal submodule update.

Test Plan:
Run ./validate

Get christiaanb and carter to test it on OSX Sierra, in combination
with Cabal/cabal-install changes to the default file layout for

Reviewers: carter, austin, hvr, christiaanb, bgamari

Reviewed By: christiaanb, bgamari

Subscribers: ezyang, Phyx, thomie

Differential Revision:

GHC Trac Issues: #12479

3 years agoImprove TcCanonical.unifyWanted and unifyDerived
Simon Peyton Jones [Fri, 14 Oct 2016 16:35:38 +0000 (17:35 +0100)] 
Improve TcCanonical.unifyWanted and unifyDerived

When debugging something else I noticed that these functions
were emitting constraints like
   [W] a ~ a
which is plain stupid.  So I fixed it not to do that.  Should
result in fewer constraints getting generated.

3 years agoDefine emitNewWantedEq, and use it
Simon Peyton Jones [Fri, 14 Oct 2016 16:35:04 +0000 (17:35 +0100)] 
Define emitNewWantedEq, and use it

This is just a minor refactoring

3 years agoRefactor occurrence-check logic
Simon Peyton Jones [Sun, 25 Sep 2016 02:50:13 +0000 (03:50 +0100)] 
Refactor occurrence-check logic

This patch does two related things

* Combines the occurrence-check logic in the on-the-fly unifier with
  that in the constraint solver.  They are both doing the same job,
  after all.  The resulting code is now in TcUnify:
     occCheckForErrors (called in TcErrors)

* In doing this I disovered checking for family-free-ness and foralls
  can be unnecessarily inefficient, because it expands type synonyms.
  It's easy just to cache this info in the type syononym TyCon, which
  I am now doing.

3 years agoAccept 20% dedgradation in Trac #5030 compile time
Simon Peyton Jones [Mon, 17 Oct 2016 09:39:25 +0000 (10:39 +0100)] 
Accept 20% dedgradation in Trac #5030 compile time

In commit

  31621b12 * A collection of type-inference refactorings.

I fixed a bug in the on-the-fly unifier.  Usually the
on-the-fly unifier (TcUnify) defers type function
applications to the constraint solver.  But in one situation
it inconsistently did not defer, so a unification happened
without reducing a type function.  By a fluke this makes
T5030 (specifcially the definition of cnst) much better.

It turns out that consistently non-deferring type functions
makes the test for #3064 go bad.  So somehow the current,
inconsistent situation was an accidental sweet spot.

But it's a horrible sweet spot, relying on what was essentially
a bug.  So I've accepted the worsening (it's an exotic case),
and opened #12724 to deal with the underlying cause.

3 years agoA collection of type-inference refactorings.
Simon Peyton Jones [Tue, 20 Sep 2016 22:31:07 +0000 (23:31 +0100)] 
A collection of type-inference refactorings.

This patch does a raft of useful tidy-ups in the type checker.
I've been meaning to do this for some time, and finally made
time to do it en route to ICFP.

1. Modify TcType.ExpType to make a distinct data type,
   InferResult for the Infer case, and consequential

2. Define a new function TcUnify.fillInferResult, to fill in
   an InferResult. It uses TcMType.promoteTcType to promote
   the type to the level of the InferResult.
   See TcMType Note [Promoting a type]
   This refactoring is in preparation for an improvement
   to typechecking pattern bindings, coming next.

   I flirted with an elaborate scheme to give better
   higher rank inference, but it was just too complicated.
   See TcMType Note [Promotion and higher rank types]

3. Add to InferResult a new field ir_inst :: Bool to say
   whether or not the type used to fill in the
   InferResult should be deeply instantiated.  See
   TcUnify Note [Deep instantiation of InferResult].

4. Add a TcLevel to SkolemTvs. This will be useful generally

    - it's a fast way to see if the type
      variable escapes when floating (not used yet)

    - it provides a good consistency check when updating a
      unification variable (TcMType.writeMetaTyVarRef, the
      level_check_ok check)

   I originally had another reason (related to the flirting
   in (2), but I left it in because it seems like a step in
   the right direction.

5. Reduce and simplify the plethora of uExpType,
   tcSubType and related functions in TcUnify.  It was
   such an opaque mess and it's still not great, but it's

6. Simplify the uo_expected field of TypeEqOrigin.  Richard
   had generatlised it to a ExpType, but it was almost always
   a Check type.  Now it's back to being a plain TcType which
   is much, much easier.

7. Improve error messages by refraining from skolemisation when
   it's clear that there's an error: see
   TcUnify Note [Don't skolemise unnecessarily]

8. Type.isPiTy and isForAllTy seem to be missing a coreView check,
   so I added it

9. Kill off tcs_used_tcvs.  Its purpose is to track the
   givens used by wanted constraints.  For dictionaries etc
   we do that via the free vars of the /bindings/ in the
   implication constraint ic_binds.  But for coercions we
   just do update-in-place in the type, rather than
   generating a binding.  So we need something analogous to
   bindings, to track what coercions we have added.

   That was the purpose of tcs_used_tcvs.  But it only
   worked for a /single/ iteration, whereas we may have
   multiple iterations of solving an implication.  Look
   at (the old) 'setImplicationStatus'.  If the constraint
   is unsolved, it just drops the used_tvs on the floor.
   If it becomes solved next time round, we'll pick up
   coercions used in that round, but ignore ones used in
   the first round.

   There was an outright bug.  Result = (potentialy) bogus
   unused-constraint errors.  Constructing a case where this
   actually happens seems quite trick so I did not do so.

   Solution: expand EvBindsVar to include the (free vars of
   the) coercions, so that the coercions are tracked in
   essentially the same way as the bindings.

   This turned out to be much simpler.  Less code, more

10. Make the ic_binds field in an implication have type
      ic_binds :: EvBindsVar
    instead of (as previously)
       ic_binds :: Maybe EvBindsVar
    This is notably simpler, and faster to use -- less
    testing of the Maybe.  But in the occaional situation
    where we don't have anywhere to put the bindings, the
    belt-and-braces error check is lost.  So I put it back
    as an ASSERT in 'setImplicationStatus' (see the use of

All these changes led to quite bit of error message wibbling

3 years agoMake TcLevel increase by 1 not 2
Simon Peyton Jones [Tue, 20 Sep 2016 22:29:51 +0000 (23:29 +0100)] 
Make TcLevel increase by 1 not 2

Make the TcLevel of a flatten-meta-var be always zero.
See TcType.fmvTcLevel.

This allows the levels of implication constraints to to
up by 1 each time instead of 2, which is less confusing.

This change has no effect on type checking.

3 years agoTest Trac #12507
Simon Peyton Jones [Wed, 21 Sep 2016 14:51:52 +0000 (15:51 +0100)] 
Test Trac #12507

This is now working apparently.  It relates to when a
polymorphic function gets instantiated, under some
implicit paramter bindings.

3 years agoComments and trivial refactoring
Simon Peyton Jones [Mon, 19 Sep 2016 09:08:29 +0000 (10:08 +0100)] 
Comments and trivial refactoring

3 years agoRefactor typechecking of pattern bindings
Simon Peyton Jones [Wed, 31 Aug 2016 08:28:39 +0000 (09:28 +0100)] 
Refactor typechecking of pattern bindings

This patch fixes a regression introduced, post 8.0.1, by
this major commit:

     commit 15b9bf4ba4ab47e6809bf2b3b36ec16e502aea72
     Author: Simon Peyton Jones <>
     Date:   Sat Jun 11 23:49:27 2016 +0100

         Improve typechecking of let-bindings

         This major commit was initially triggered by #11339, but it
         spiraled into a major review of the way in which type
         signatures for bindings are handled, especially partial type

I didn't get the typechecking of pattern bindings right, leading
to Trac #12427.

In fixing this I found that this program doesn't work:

  data T where
    T :: a -> ((forall b. [b]->[b]) -> Int) -> T

  h1 y = case y of T _ v -> v

Works in 7.10, but not in 8.0.1.

There's a happy ending. I found a way to fix this, and improve
pattern bindings too.  Not only does this fix #12427, but it also

In particular,we now can accept

  data T where MkT :: a -> Int -> T

  ... let { MkT _ q = t } in ...

Previously this elicited "my head exploded" but it's really
fine since q::Int.

The approach is described in detail in TcBinds
   Note [Typechecking pattern bindings]
Super cool.  And not even a big patch!

3 years agoTypos in comments
Gabor Greif [Fri, 21 Oct 2016 14:55:02 +0000 (16:55 +0200)] 
Typos in comments

3 years agocheck-cpp: Make it more robust
Ben Gamari [Thu, 20 Oct 2016 20:13:46 +0000 (16:13 -0400)] 
check-cpp: Make it more robust

Catch more than one space

3 years agoFix Mac OS X build by removing space after ASSERT.
Edward Z. Yang [Thu, 20 Oct 2016 20:06:51 +0000 (13:06 -0700)] 
Fix Mac OS X build by removing space after ASSERT.

Signed-off-by: Edward Z. Yang <>
3 years agoMark previously failing backpack tests as passing, with correct output.
Edward Z. Yang [Fri, 14 Oct 2016 07:13:44 +0000 (00:13 -0700)] 
Mark previously failing backpack tests as passing, with correct output.

Signed-off-by: Edward Z. Yang <>
3 years agoOnly delete instances when merging when there is an exact match.
Edward Z. Yang [Fri, 14 Oct 2016 07:11:10 +0000 (00:11 -0700)] 
Only delete instances when merging when there is an exact match.

Previously, we deleted if the heads matched, which meant that
we effectively were picking an arbitrary instance if there
were incompatible instances.  The new behavior makes more sense,
although without incoherent instances you are unlikely to
be able to do anything useful with the instances.

Signed-off-by: Edward Z. Yang <>
Test Plan: validate

Reviewers: austin, bgamari

Subscribers: thomie

Differential Revision:

3 years agoSupport constraint synonym implementations of abstract classes.
Edward Z. Yang [Fri, 14 Oct 2016 04:34:17 +0000 (21:34 -0700)] 
Support constraint synonym implementations of abstract classes.


Test Plan: validate

Reviewers: goldfire, simonpj, austin, bgamari

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #12679

3 years agoNew story for abstract data types in hsig files.
Edward Z. Yang [Thu, 13 Oct 2016 06:55:41 +0000 (23:55 -0700)] 
New story for abstract data types in hsig files.

In the old implementation of hsig files, we directly
reused the implementation of abstract data types from
hs-boot files.  However, this was WRONG.  Consider the
following program (an abridged version of bkpfail24):

    {-# LANGUAGE GADTs #-}
    unit p where
        signature H1 where
            data T
        signature H2 where
            data T
        module M where
            import qualified H1
            import qualified H2

            f :: H1.T ~ H2.T => a -> b
            f x = x

Prior to this patch, M was accepted, because the type
inference engine concluded that H1.T ~ H2.T does not
hold (indeed, *presently*, it does not).  However, if
we subsequently instantiate p with the same module for
H1 and H2, H1.T ~ H2.T does hold!  Unsound.

The key is that abstract types from signatures need to
be treated like *skolem variables*, since you can interpret
a Backpack unit as a record which is universally quantified
over all of its abstract types, as such (with some fake
syntax for structural records):

    p :: forall t1 t2. { f :: t1 ~ t2 => a -> b }
    p = { f = \x -> x } -- ill-typed

Clearly t1 ~ t2 is not solvable inside p, and also clearly
it could be true at some point in the future, so we better
not treat the lambda expression after f as inaccessible.

The fix seems to be simple: do NOT eagerly fail when trying
to simplify the given constraints.  Instead, treat H1.T ~ H2.T
as an irreducible constraint (rather than an insoluble
one); this causes GHC to treat f as accessible--now we will
typecheck the rest of the function (and correctly fail).
Per the OutsideIn(X) paper, it's always sound to fail less
when simplifying givens.

We do NOT apply this fix to hs-boot files, where abstract
data is also guaranteed to be nominally distinct (since
it can't be implemented via a reexport or a type synonym.)
This is a somewhat unnatural state of affairs (there's
no way to really interpret this in Haskell land) but
no reason to change behavior.

I deleted "representationally distinct abstract data",
which is never used anywhere in GHC.

In the process of constructing this fix, I also realized
our implementation of type synonym matching against abstract
data was not sufficiently restrictive.  In order for
a type synonym T to be well-formed type, it must be a
nullary synonym (i.e., type T :: * -> *, not type T a = ...).
Furthermore, since we use abstract data when defining
instances, they must not have any type family applications.

More details in #12680.  This probably deserves some sort
of short paper report.

Signed-off-by: Edward Z. Yang <>
Test Plan: validate

Reviewers: goldfire, simonpj, austin, bgamari

Subscribers: thomie

Differential Revision:

3 years Report Unregisterised setting
Erik de Castro Lopo [Wed, 19 Oct 2016 18:21:25 +0000 (05:21 +1100)] Report Unregisterised setting

Showing the value of this configure option in the configure output
can help debugging issues in build bots etc.

Test Plan: N/A

Reviewers: hvr, austin, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

3 years agoStgCmmPrim: Add missing write barrier.
Peter Trommler [Wed, 19 Oct 2016 13:02:54 +0000 (09:02 -0400)] 
StgCmmPrim: Add missing write barrier.

On architectures with weak memory consistency a write barrier
is needed before the write to the pointer array.

Fixes #12469

Test Plan: rebuilt Stackage nightly twice on powerpc64le

Reviewers: hvr, rrnewton, erikd, austin, simonmar, bgamari

Reviewed By: erikd, bgamari

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #12469

3 years agoTest for newtype with unboxed argument
Simon Peyton Jones [Wed, 19 Oct 2016 11:22:11 +0000 (12:22 +0100)] 
Test for newtype with unboxed argument

Newtypes cannot (currently) have an unboxed argument type.
But Trac #12729 showed that this was only being checked for
newtypes in H98 syntax; in GADT snytax they were let through.

This patch moves the test to checkValidDataCon, where it properly

3 years agocmm/Hoopl/Dataflow: remove unused code
Michal Terepeta [Wed, 19 Oct 2016 02:17:49 +0000 (22:17 -0400)] 
cmm/Hoopl/Dataflow: remove unused code

We had *a lot* of code copied from Hoopl that is for rewriting. But GHC
doesn't use it (it only uses some forked Hoopl code for analysis).

So we can safely kill all this code and make it much easier to refactor
and improve the parts that we do use.

Signed-off-by: Michal Terepeta <>
Test Plan: ./validate

Reviewers: austin, simonmar, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

3 years agoCompute export hash based on ALL transitive orphan modules.
Edward Z. Yang [Wed, 19 Oct 2016 02:17:10 +0000 (22:17 -0400)] 
Compute export hash based on ALL transitive orphan modules.

Previously we pruned out orphan modules from external packages but this
was wrong.  Fixes #12733 (which has more discussion.)

Signed-off-by: Edward Z. Yang <>
Test Plan: validate

Reviewers: simonpj, bgamari, austin

Reviewed By: simonpj

Subscribers: simonpj, thomie

Differential Revision:

GHC Trac Issues: #12733

3 years agoAdd some missing RTS symbols
Simon Marlow [Wed, 19 Oct 2016 02:13:55 +0000 (22:13 -0400)] 
Add some missing RTS symbols

Test Plan: validate

Reviewers: austin, bgamari, erikd

Reviewed By: bgamari, erikd

Subscribers: thomie

Differential Revision:

3 years agofix build failure on Solaris caused by usage of --export-dynamic
Karel Gardas [Tue, 18 Oct 2016 19:47:35 +0000 (21:47 +0200)] 
fix build failure on Solaris caused by usage of --export-dynamic

This patch fixes build failure on Solaris which is caused
by usage --export-dynamic linker parameter. This parameter is not
supported by Solaris linker. The param itself was added by D2590

Reviewers: bgamari, simonmar, austin

Subscribers: thomie

Differential Revision:

3 years agoghc/Main.hs: Add import list to DynamicLoading
Ömer Sinan Ağacan [Tue, 18 Oct 2016 19:24:23 +0000 (15:24 -0400)] 
ghc/Main.hs: Add import list to DynamicLoading

3 years agoDynamicLoading: Replace map + zip with zipWith
Ömer Sinan Ağacan [Tue, 18 Oct 2016 19:05:16 +0000 (15:05 -0400)] 
DynamicLoading: Replace map + zip with zipWith

3 years agofixup! Add option to not retain CAFs to the linker API
Simon Marlow [Tue, 18 Oct 2016 14:18:28 +0000 (15:18 +0100)] 
fixup! Add option to not retain CAFs to the linker API

3 years agoremove unnecessary ifdef
Simon Marlow [Tue, 18 Oct 2016 10:35:12 +0000 (11:35 +0100)] 
remove unnecessary ifdef

3 years agoAdd option to not retain CAFs to the linker API
Simon Marlow [Thu, 13 Oct 2016 11:51:33 +0000 (12:51 +0100)] 
Add option to not retain CAFs to the linker API

3 years agoTrack dep_finsts in exports hash, as it affects downstream deps.
Edward Z. Yang [Mon, 17 Oct 2016 21:06:18 +0000 (14:06 -0700)] 
Track dep_finsts in exports hash, as it affects downstream deps.

I also added some more comments about the orphan and family instance
hashing business.

Fixes #12723.

Signed-off-by: Edward Z. Yang <>
Test Plan: validate

Reviewers: bgamari, austin

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #12723

3 years agoBump parallel submodule
Ben Gamari [Mon, 17 Oct 2016 18:34:25 +0000 (14:34 -0400)] 
Bump parallel submodule

Includes testsuite fix for Python 3.

3 years agotestsuite: Mark T7037 as broken on Windows
Ben Gamari [Mon, 17 Oct 2016 12:57:12 +0000 (08:57 -0400)] 
testsuite: Mark T7037 as broken on Windows

Due to #12725.

3 years agotestsuite/driver: Allow threading on Windows
Ben Gamari [Mon, 17 Oct 2016 00:49:57 +0000 (20:49 -0400)] 
testsuite/driver: Allow threading on Windows

It seems that threading now works fine. The only caveat here is that it
makes some race conditions more likely (e.g. #12554), although these
also appear to affect single-threaded runs.

Test Plan: Validate on Windows

Reviewers: austin, Phyx

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #10510

3 years agotestsuite: Eliminate unnecessary compile_timeout_multiplier
Ben Gamari [Mon, 17 Oct 2016 00:49:46 +0000 (20:49 -0400)] 
testsuite: Eliminate unnecessary compile_timeout_multiplier

tc266 was failing intermittently on Windows due to a very small
compile_timeout_multiplier. This test was added in
e907e1f12f4dedc0ec13c7a501c8810bcfc03583 which doesn't appear to have
any timng dependence, so I see no reason to retain the multiplier at

Test Plan: Validate

Reviewers: ezyang, austin

Subscribers: thomie

Differential Revision:

3 years agotestsuite/driver: More Unicode awareness
Ben Gamari [Mon, 17 Oct 2016 00:49:36 +0000 (20:49 -0400)] 
testsuite/driver: More Unicode awareness

Explicitly specify utf8 encoding in a few spots which were failing on
Windows with Python 3.

Test Plan: Validate

Reviewers: austin, thomie

Differential Revision:

GHC Trac Issues: #9184

3 years agovalidate: Allow user to override Python interpreter
Ben Gamari [Mon, 17 Oct 2016 00:49:26 +0000 (20:49 -0400)] 
validate: Allow user to override Python interpreter

Due to #12554 and #12661 we must be quite picky about our choice of
Python interpreter on Windows. Allow the user to override it.

Test Plan: `PYTHON=/usr/bin/python2 ./validate` on Windows

Reviewers: austin, Phyx

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #12554, #12661

3 years agotestsuite/timeout: Ensure that processes are cleaned up on Windows
Ben Gamari [Mon, 17 Oct 2016 00:49:15 +0000 (20:49 -0400)] 
testsuite/timeout: Ensure that processes are cleaned up on Windows

Previously if the test is interrupted (e.g. with Ctrl-C) any processes
which it spawned may not be properly terminated. Here we catch any
exception and ensure that we job is terminated.

Test Plan: Validate on Windows

Reviewers: Phyx, austin

Subscribers: thomie

Differential Revision:

3 years agotestsuite/driver: Never symlink on Windows
Ben Gamari [Mon, 17 Oct 2016 00:49:00 +0000 (20:49 -0400)] 
testsuite/driver: Never symlink on Windows

While msys' mingw Python 3 does indeed export `os.symlink`, it is
unusable since creating symbolic links on Windows requires permissions
that essentially no one has.

Test Plan: Validate on Windows

Reviewers: austin, Phyx, thomie

Differential Revision:

3 years agotestsuite: Mark T9405 as broken on Windows
Ben Gamari [Sun, 16 Oct 2016 02:53:06 +0000 (02:53 +0000)] 
testsuite: Mark T9405 as broken on Windows

There seems to be a runtime system bug here, as described in #12714.

3 years agotestsuite: Mark T10858 as broken on Windows
Ben Gamari [Sun, 16 Oct 2016 02:25:50 +0000 (02:25 +0000)] 
testsuite: Mark T10858 as broken on Windows

Strangely the allocation numbers on Windows differ significantly from
those on Linux. Usually I would just update the number, but I would
really like to understand why this is the case. This is a rather large
deviation in the compilation of a program which really shouldn't have
any appreciable platform dependence.

3 years agotestsuite: Mark break011 as broken
Ben Gamari [Sun, 16 Oct 2016 02:05:50 +0000 (02:05 +0000)] 
testsuite: Mark break011 as broken

See #12712.

3 years agotestsuite: Work around #12554
Ben Gamari [Sat, 15 Oct 2016 18:18:14 +0000 (18:18 +0000)] 
testsuite: Work around #12554

It seems that Python 2.7.11 and "recent" msys2 releases are broken,
holding open file locks unexpected. This causes rmtree to intermittently
fail. Even worse, it would fail silently (since we pass
ignore_errors=True), causing makedirs to fail later.

We now explicitly check for the existence of the test directory before
attempting to delete it and disable ignore_errors. Moreover, on Windows
we now try multiple times to rmtree the testdir, working around the
apparently msys bug.

This is all just terrible, but Phyx and I spent several hours trying to
track down the issue to no available. The workaround is better than

3 years agoRe-add accidentally-deleted line
Simon Peyton Jones [Mon, 17 Oct 2016 08:23:50 +0000 (09:23 +0100)] 
Re-add accidentally-deleted line

This adds a line I deleted by mistake in

  commit db71d971379c74dd1d2b958c11dc6c9e718a3e61
  Author: Simon Peyton Jones <>
  Date:   Fri Oct 14 17:40:51 2016 +0100

      Reduce trace output slightly

Sorry about that!

3 years agoTypos in comments
Gabor Greif [Mon, 17 Oct 2016 08:05:45 +0000 (10:05 +0200)] 
Typos in comments

3 years agoComments only
Simon Peyton Jones [Fri, 14 Oct 2016 16:50:28 +0000 (17:50 +0100)] 
Comments only

3 years agoAdd more variants of T3064 (in comments)
Simon Peyton Jones [Fri, 14 Oct 2016 16:42:00 +0000 (17:42 +0100)] 
Add more variants of T3064 (in comments)

3 years agoReduce trace output slightly
Simon Peyton Jones [Fri, 14 Oct 2016 16:40:51 +0000 (17:40 +0100)] 
Reduce trace output slightly

3 years agoTest Trac #12681
Simon Peyton Jones [Mon, 17 Oct 2016 07:40:16 +0000 (08:40 +0100)] 
Test Trac #12681

3 years agoFix wrapping order in matchExpectedConTy
Simon Peyton Jones [Fri, 14 Oct 2016 16:13:43 +0000 (17:13 +0100)] 
Fix wrapping order in matchExpectedConTy

The wrappers in matchExpectedConTy were being composed back
to front, resulting in a Core Lint error.  Yikes!  This has
been here a long time.

Fixes Trac #12676.

3 years agoCorrect order of existentials in pattern synonyms
Simon Peyton Jones [Fri, 14 Oct 2016 14:54:14 +0000 (15:54 +0100)] 
Correct order of existentials in pattern synonyms

Trac #12698 exposed a nasty bug in the typechecking for
pattern synonmys: the existential type variables weren't
being put in properly-scoped order.

For some reason TcPatSyn.tcCollectEx was colleting them as a
set, not as a list!  Easily fixed.

3 years agoTypo in comment
Simon Peyton Jones [Fri, 14 Oct 2016 14:52:15 +0000 (15:52 +0100)] 
Typo in comment

3 years agoFix shadowing in mkWwBodies
Simon Peyton Jones [Fri, 14 Oct 2016 11:05:46 +0000 (12:05 +0100)] 
Fix shadowing in mkWwBodies

This bug, exposed by Trac #12562 was very obscure, and has been
lurking for a long time.  What happened was that, in the
worker/wrapper split

  a tyvar binder for a worker function
  accidentally shadowed an in-scope term variable
  that was mentioned in the body of the function

It's jolly hard to provoke, so I have not even attempted to make
a test case.  There's a Note [Freshen WW arguments] to explain.

Interestingly, fixing the bug (which meant fresher type variables)
revealed a second lurking bug: I'd failed to apply the substitution to
the coercion in the second last case of mkWWArgs, which introduces a

3 years agoFix comment typo
Simon Peyton Jones [Fri, 14 Oct 2016 09:41:45 +0000 (10:41 +0100)] 
Fix comment typo

3 years agoComments about -Wredundant-constraints
Simon Peyton Jones [Fri, 14 Oct 2016 09:41:14 +0000 (10:41 +0100)] 
Comments about -Wredundant-constraints

3 years agoCorrect name of makeStableName in haddock
Reid Barton [Sun, 16 Oct 2016 17:40:11 +0000 (13:40 -0400)] 
Correct name of makeStableName in haddock