4 years agoSpit out a little more info with -dppr-debug
Simon Peyton Jones [Wed, 29 Jul 2015 15:39:14 +0000 (16:39 +0100)] 
Spit out a little more info with -dppr-debug

4 years agoDefine DsUtils.mkCastDs and use it
Simon Peyton Jones [Wed, 29 Jul 2015 15:38:44 +0000 (16:38 +0100)] 
Define DsUtils.mkCastDs and use it

This change avoids a spurious WARNing from mkCast.  In the output of
the desugarer (only, I think) we can have a cast where the type of the
expression and cast don't syntactically match, because of an enclosing
type-let binding.

4 years agoDeal with phantom type variables in rules
Simon Peyton Jones [Wed, 29 Jul 2015 15:06:29 +0000 (16:06 +0100)] 
Deal with phantom type variables in rules

See Note [Unbound template type variables] in Rules.hs
This fixes Trac #10689.

The problem was a rule LHS that mentioned a type variable
in a phantom argument to a type synonym.  Then matching the
LHS didn't bind the type variable, and the rule matcher

This patch fixes the problem, as described by the Note.

I also went back to not-cloning the template varaibles during
rule matching.  I'm convinced that it's not necessary now
(if it ever was), and cloning makes the fix for #10689 much more

4 years agoComments only
Simon Peyton Jones [Wed, 29 Jul 2015 15:02:25 +0000 (16:02 +0100)] 
Comments only

4 years agoAdd a missing check for -fcpr-off
Reid Barton [Wed, 29 Jul 2015 16:27:50 +0000 (12:27 -0400)] 
Add a missing check for -fcpr-off

Test Plan: validate

Reviewers: austin, bgamari, simonpj

Reviewed By: simonpj

Subscribers: simonpj, thomie

Differential Revision:

GHC Trac Issues: #10696

4 years agoEliminate zero_static_objects_list()
Simon Marlow [Tue, 28 Jul 2015 19:58:25 +0000 (20:58 +0100)] 
Eliminate zero_static_objects_list()

[Revised version of D1076 that was committed and then backed out]

In a workload with a large amount of code, zero_static_objects_list()
takes a significant amount of time, and furthermore it is in the
single-threaded part of the GC.

This patch uses a slightly fiddly scheme for marking objects on the
static object lists, using a flag in the low 2 bits that flips between
two states to indicate whether an object has been visited during this
GC or not.  We also have to take into account objects that have not
been visited yet, which might appear at any time due to runtime linking.

Test Plan: validate

Reviewers: austin, ezyang, rwbarton, bgamari, thomie

Reviewed By: bgamari, thomie

Subscribers: thomie

Differential Revision:

4 years agoFallout from more assiduous RULE warnings
Simon Peyton Jones [Tue, 28 Jul 2015 15:00:20 +0000 (16:00 +0100)] 
Fallout from more assiduous RULE warnings

GHC now warns if rules compete, so that it's not predicatable
which will work and which will not. E.g.

  f (g x) = ...
  g True  = ...

If we had (f (g True)) it's not clear which rule would fire.

This showed up fraility in the libraries.

* Suppress warnigns in Control.Arrow, Control.Category for class
  methods. At the moment we simply don't have a good way to write a
  RULE with a class method in the LHS.  See Trac #1595.  Arrow and
  Category attempt to do so; I have silenced the complaints with
  -fno-warn-inline-rule-shadowing, but it's not a great solution.

* Adjust the NOINLINE pragma on '' to account for the
  map/coerce rule

* Adjust the rewrite rules in Enum, especially for the "literal 1"
  case.  See Note [Enum Integer rules for literal 1].

* Suppress warnings for 'bytestring' e.g.
   libraries/bytestring/Data/ByteString.hs:895:1: warning:
      Rule "ByteString specialise break (x==)" may never fire
        because rule "Class op ==" for ‘==’ might fire first
      Probable fix: add phase [n] or [~n] to the competing rule

4 years agoTest case for #10698
Joachim Breitner [Tue, 28 Jul 2015 11:19:34 +0000 (13:19 +0200)] 
Test case for #10698

the expected error message is from an older version of GHC; I don’t know
the exact error message that we should get here until the bug is

4 years agoRevert "Eliminate zero_static_objects_list()"
Simon Marlow [Mon, 27 Jul 2015 14:51:16 +0000 (15:51 +0100)] 
Revert "Eliminate zero_static_objects_list()"

This reverts commit b949c96b4960168a3b399fe14485b24a2167b982.

4 years agoRevert "RetainerProfile: Add missing UNTAG_STATIC_LIST_PTR"
Simon Marlow [Mon, 27 Jul 2015 14:51:08 +0000 (15:51 +0100)] 
Revert "RetainerProfile: Add missing UNTAG_STATIC_LIST_PTR"

This reverts commit 09d05050346c1be7bac20ba3f40861e05217368b.

4 years agoImprove warnings for rules that might not fire
Simon Peyton Jones [Fri, 24 Jul 2015 11:50:42 +0000 (12:50 +0100)] 
Improve warnings for rules that might not fire

Two main things here

* Previously we only warned about the "head" function of the rule,
  but actually the warning applies to any free variable on the LHS.

* We now warn not only when one of these free vars can inline, but
  also if it has an active RULE (c.f. Trac #10528)

See Note [Rules and inlining/other rules] in Desugar

This actually shows up quite a few warnings in the libraries, notably
in Control.Arrow, where it correctly points out that rules like
    "compose/arr"   forall f g .
                    (arr f) . (arr g) = arr (f . g)
might never fire, because the rule for 'arr' (dictionary selection)
might fire first.  I'm not really sure what to do here; there is some
discussion in Trac #10595.

A minor change is adding BasicTypes.pprRuleName to pretty-print RuleName.

4 years agoDo not inline or apply rules on LHS of rules
Simon Peyton Jones [Mon, 27 Jul 2015 12:56:31 +0000 (13:56 +0100)] 
Do not inline or apply rules on LHS of rules

This is the right thing to do anyway, and fixes Trac #10528

4 years agoRemove runSTRep from PrelNames
Reid Barton [Mon, 27 Jul 2015 11:20:01 +0000 (13:20 +0200)] 
Remove runSTRep from PrelNames

It has no special treatment in the compiler any more. The last use
was removed in 99d4e5b4a0bd "Implement cardinality analysis".

Test Plan: validate

Reviewers: austin, bgamari, simonpj

Reviewed By: simonpj

Subscribers: thomie

Differential Revision:

4 years agoAdd UInfixT to TH types (fixes #10522)
Michael Smith [Mon, 27 Jul 2015 11:19:01 +0000 (13:19 +0200)] 
Add UInfixT to TH types (fixes #10522)

UInfixT is like UInfixE or UInfixP but for types. Template Haskell
splices can use it to punt fixity handling to GHC when constructing

UInfixT is converted in compiler/hsSyn/Convert to a right-biased tree of
HsOpTy, which is already rearranged in compiler/rename/RnTypes to match
operator fixities.

This patch consists of (1) adding UInfixT to the AST, (2) implementing
the conversion and updating relevant comments, (3) updating
pretty-printing and library support, and (4) adding tests.

Test Plan: validate

Reviewers: austin, goldfire, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #10522

4 years agoImplementation of StrictData language extension
Adam Sandberg Eriksson [Mon, 27 Jul 2015 11:18:36 +0000 (13:18 +0200)] 
Implementation of StrictData language extension

This implements the `StrictData` language extension, which lets the
programmer default to strict data fields in datatype declarations on a
per-module basis.

Specification and motivation can be found at

This includes a tricky parser change due to conflicts regarding `~` in
the type level syntax: all ~'s are parsed as strictness annotations (see
`strict_mark` in Parser.y) and then turned into equality constraints at
the appropriate places using `RdrHsSyn.splitTilde`.

Updates haddock submodule.

Test Plan: Validate through Harbormaster.

Reviewers: goldfire, austin, hvr, simonpj, tibbe, bgamari

Reviewed By: simonpj, tibbe, bgamari

Subscribers: lelf, simonpj, alanz, goldfire, thomie, bgamari, mpickering

Differential Revision:

GHC Trac Issues: #8347

4 years agoComment tweaks only
Reid Barton [Sun, 26 Jul 2015 03:36:29 +0000 (23:36 -0400)] 
Comment tweaks only

4 years agoAdd missing parentheses in eqBigNatWord#
Reid Barton [Sun, 26 Jul 2015 03:01:49 +0000 (23:01 -0400)] 
Add missing parentheses in eqBigNatWord#

I'm pretty sure that parentheses were intended here. But oddly, they
make very little difference.

The presumably intended expression
    (sizeofBigNat# bn ==# 1#) `andI#` (bigNatToWord bn `eqWord#` w#)
is 1# exactly when bn consists of a single limb equal to w#, clearly.

In the original expression
    sizeofBigNat# bn ==# 1# `andI#` (bigNatToWord bn `eqWord#` w#)
the right-hand side of ==# is always 0# or 1#. So it is 1# when bn
consists of a single limb equal to w#. It is also 1# when bn has
zero limbs and the word past the end of bn does not happen to be
equal to w#. So in practice the difference is that nullBigNat was
eqBigNatWord# to almost everything, but eqBigNatWord# is never
supposed to be called on nullBigNat anyways.

Note that even the corrected version might perform an out-of-bounds
memory access if passed nullBigNat, because `andI#` is not guaranteed
to short-circuit, though in fact GHC does convert isZeroBigNat to a
series of branches in my local build.

Test Plan: validate

Reviewers: hvr, bgamari, goldfire, austin

Reviewed By: hvr, bgamari

Subscribers: thomie

Differential Revision:

4 years agoUse isTrue# around primitive comparisons in integer-gmp
Reid Barton [Sun, 26 Jul 2015 03:00:52 +0000 (23:00 -0400)] 
Use isTrue# around primitive comparisons in integer-gmp

The form
  case na# ==# nb# of
    0# -> ...
    _  -> ...
sometimes generates convoluted assembly, see #10676.
timesInt2Integer was the most spectacular offender, especially as
it is a rather cheap function overall (no calls to gmp).

I checked a few instances and some of the old generated assembly
was fine already, but I changed them all for consistency. The new
form is also more consistent with use of these primops in general.

Test Plan: validate

Reviewers: hvr, bgamari, goldfire, austin

Reviewed By: hvr

Subscribers: thomie

Differential Revision:

4 years ago-include-pkg-deps takes only one hyphen.
Edward Z. Yang [Sat, 25 Jul 2015 21:28:11 +0000 (14:28 -0700)] 
-include-pkg-deps takes only one hyphen.

Signed-off-by: Edward Z. Yang <>
4 years agorenamer: fix module-level deprecation message
Sergei Trofimovich [Sat, 25 Jul 2015 08:37:44 +0000 (09:37 +0100)] 
renamer: fix module-level deprecation message

Noticed today that deprecation warnings are
slightly broken in -HEAD:

  mtl-2.2.1/Control/Monad/Error/Class.hs:46:1: warning:
    Module ‘Control.Monad.Trans.Error’ is deprecated:
      ([", U, s, e,  , C, o, n, t, r, o, l, ., M, o, n, a, d, ., T, r, a,
        n, s, ., E, x, c, e, p, t,  , i, n, s, t, e, a, d, "],
       Use Control.Monad.Trans.Except instead)

Commit e6191d1cc37e98785af8b309100ea840084fa3ba
slightly changed WarningTxt declaration:

-data WarningTxt = WarningTxt (Located SourceText) [Located FastString]
-                | DeprecatedTxt (Located SourceText) [Located FastString]
+data WarningTxt = WarningTxt (Located SourceText)
+                             [Located (SourceText,FastString)]
+                | DeprecatedTxt (Located SourceText)
+                                [Located (SourceText,FastString)]

But 'moduleWarn' function was not updated to do the stripping.

Signed-off-by: Sergei Trofimovich <>
Reviewers: austin, bgamari, hvr, goldfire, rwbarton, alanz

Reviewed By: rwbarton, alanz

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #10313

4 years agoRetainerProfile: Add missing UNTAG_STATIC_LIST_PTR
Ben Gamari [Fri, 24 Jul 2015 15:41:59 +0000 (11:41 -0400)] 
RetainerProfile: Add missing UNTAG_STATIC_LIST_PTR

4 years agoImprove instanceCantMatch
Simon Peyton Jones [Fri, 24 Jul 2015 09:42:05 +0000 (10:42 +0100)] 
Improve instanceCantMatch

When staring at instanceCantMatch I realised that it
was returning False (safe but inefficient) when it could
validly return True, on arguments like
   [Nothing,   Just Int]
   [Just Bool, Just Bool]

This patch makes it a bit cleverer.

4 years agoRefactoring around FunDeps
Simon Peyton Jones [Fri, 24 Jul 2015 09:40:35 +0000 (10:40 +0100)] 
Refactoring around FunDeps

This refactoring was triggered by Trac #10675.

We were using 'improveClsFD' (previously called 'checkClsFD') for
  * Improvement: improving a constraint against top-level instances
  * Consistency: checking when two top-level instances are

Using the same code for both seemed attractive at the time, but
it's just too complicated.  So I've split it:
 * Improvement: improveClsFD
 * Consistency: checkFunDeps

Much clearer now!

4 years agoComments about stricteness of catch#
Simon Peyton Jones [Fri, 24 Jul 2015 09:32:01 +0000 (10:32 +0100)] 
Comments about stricteness of catch#

In "Improve strictness analysis for exceptions"
   commit 7c0fff41789669450b02dc1db7f5d7babba5dee6
   Author: Simon Peyton Jones <>
   Date:   Tue Jul 21 12:28:42 2015 +0100

I made catch# strict in its first argument.  But today I found
a very old comment suggesting the opposite.  I disagree with the
old comment, but I've elaborated the Note, which I reproduce here:

    {- Note [Strictness for mask/unmask/catch]
    Consider this example, which comes from GHC.IO.Handle.Internals:
       wantReadableHandle3 f ma b st
         = case ... of
             DEFAULT -> case ma of MVar a -> ...
             0#      -> maskAsynchExceptions#
                           (\st -> case ma of MVar a -> ...)
    The outer case just decides whether to mask exceptions, but we
    don't want thereby to hide the strictness in 'ma'!  Hence the use
    of strictApply1Dmd.

    For catch, we know that the first branch will be evaluated, but
    not necessarily the second.  Hence strictApply1Dmd and

    Howver, consider
        catch# (\st -> case x of ...) (..handler..) st
    We'll see that the entire thing is strict in 'x', so 'x' may be
    evaluated before the catch#.  So fi evaluting 'x' causes a
    divide-by-zero exception, it won't be caught.  This seems
      - x might be evaluated somewhere else outside the catch# anyway
      - It's an imprecise eception anyway.  Synchronous exceptions (in
        the IO monad) will never move in this way.
    There was originally a comment
      "Catch is actually strict in its first argument
       but we don't want to tell the strictness
       analyser about that, so that exceptions stay inside it."
    but tracing it back through the commit logs did not give any
    rationale.  And making catch# lazy has performance costs for

4 years agoComments only
Simon Peyton Jones [Thu, 23 Jul 2015 11:49:06 +0000 (12:49 +0100)] 
Comments only

4 years agoFix line number in T10018 testcase
Ben Gamari [Fri, 24 Jul 2015 07:25:27 +0000 (03:25 -0400)] 
Fix line number in T10018 testcase

4 years agoLibrary names, with Cabal submodule update
Edward Z. Yang [Tue, 23 Jun 2015 20:15:17 +0000 (13:15 -0700)] 
Library names, with Cabal submodule update

A library name is a package name, package version, and hash of the
version names of all textual dependencies (i.e. packages which were included.) A library
name is a coarse approximation of installed package IDs, which are suitable for
inclusion in package keys (you don't want to put an IPID in a package key, since
it means the key will change any time the source changes.)

    - We define ShPackageKey, which is the semantic object which
      is hashed into a PackageKey.  You can use 'newPackageKey'
      to hash a ShPackageKey to a PackageKey

    - Given a PackageKey, we can lookup its ShPackageKey with
      'lookupPackageKey'.  The way we can do this is by consulting
      the 'pkgKeyCache', which records a reverse mapping from
      every hash to the ShPackageKey.  This means that if you
      load in PackageKeys from external sources (e.g. interface
      files), you also need to load in a mapping of PackageKeys
      to their ShPackageKeys so we can populate the cache.

    - We define a 'LibraryName' which encapsulates the full
      depenency resolution that Cabal may have selected; this
      is opaque to GHC but can be used to distinguish different
      versions of a package.

    - Definite packages don't have an interesting PackageKey,
      so we rely on Cabal to pass them to us.

    - We can pretty-print package keys while displaying the
      instantiation, but it's not wired up to anything (e.g.
      the Outputable instance of PackageKey).

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

Reviewers: austin, bgamari

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #10566

4 years agoAdd a few comments from SPJ on fixity declarations
Ben Gamari [Tue, 21 Jul 2015 20:27:18 +0000 (22:27 +0200)] 
Add a few comments from SPJ on fixity declarations

4 years agoghci: fixity declarations for infix data constructors (#10018)
Thomas Miedema [Tue, 21 Jul 2015 20:01:49 +0000 (22:01 +0200)] 
ghci: fixity declarations for infix data constructors (#10018)

Declaring a custom fixity for an infix data constructor should work:

    Prelude> data Infix a b = a :@: b; infixl 4 :@:

This is a followup to #2947, which handled fixity declarations in ghci
statements (e.g. let add = (+); infixl 6 `add`).

Support for declarations (data, type, newtype, class, instance,
deriving, and foreign) was added to GHCi in #4929.

Reviewers: simonpj, austin, thomie

Subscribers: thomie, bgamari

Differential Revision:

GHC Trac Issues: #10018

4 years agoDocument type functions in the Paterson conditions
Simon Peyton Jones [Thu, 23 Jul 2015 11:24:14 +0000 (12:24 +0100)] 
Document type functions in the Paterson conditions

4 years agoSlight refactoring to the fix for #4012
Simon Peyton Jones [Thu, 23 Jul 2015 11:23:22 +0000 (12:23 +0100)] 
Slight refactoring to the fix for #4012

Add CoreSyn.chooseOrphanAnchor, and use it

4 years agorts/sm: Add missing argument names in function definitions
Ben Gamari [Thu, 23 Jul 2015 12:49:13 +0000 (08:49 -0400)] 
rts/sm: Add missing argument names in function definitions

C99 does not allow unnamed parameters in definition argument lists [1].


4 years agoDataCon: Fix redundant import
Ben Gamari [Thu, 23 Jul 2015 10:53:49 +0000 (12:53 +0200)] 
DataCon: Fix redundant import

4 years agoParenthesise TypeOperator in import hints
Thomas Winant [Thu, 23 Jul 2015 09:43:21 +0000 (11:43 +0200)] 
Parenthesise TypeOperator in import hints

When a constructor was mistakenly imported directly instead of as a
constructor of a data type, a hint will be shown on how to correctly
it. Just like the constructor, the data type should be surrounded in
parentheses if it is an operator (TypeOperator in this case).

Instead of:

        In module ‘Data.Type.Equality’:
          ‘Refl’ is a data constructor of ‘:~:’
        To import it use
          ‘import’ Data.Type.Equality( :~:( Refl ) )
          ‘import’ Data.Type.Equality( :~:(..) )


        In module ‘Data.Type.Equality’:
          ‘Refl’ is a data constructor of ‘(:~:)’
        To import it use
          ‘import’ Data.Type.Equality( (:~:)( Refl ) )
          ‘import’ Data.Type.Equality( (:~:)(..) )

Test Plan: pass new test

Reviewers: austin, bgamari, simonpj

Reviewed By: simonpj

Subscribers: simonpj, thomie

Differential Revision:

GHC Trac Issues: #10668

4 years agoUpdate encoding001 to test the full range of non-surrogate code points
Reid Barton [Thu, 23 Jul 2015 09:43:07 +0000 (11:43 +0200)] 
Update encoding001 to test the full range of non-surrogate code points

GHC has used surrogate code points for roundtripping since 7.4.
See Note [Roundtripping].

Also, improve the wording of that Note slightly.

Test Plan: validate still passes

Reviewers: austin, hvr, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

4 years agoAccept next-docstrings on GADT constructors.
Ben Gamari [Thu, 23 Jul 2015 09:42:07 +0000 (11:42 +0200)] 
Accept next-docstrings on GADT constructors.

Accept next docstrings (`-- | Docstring`) on GADT constructors.

I have confirmed that this adds no shift/reduce conflicts.

Test Plan: haddockA034

Reviewers: austin, simonpj, simonmar

Reviewed By: simonmar

Subscribers: Fuuzetsu, simonmar, thomie, mpickering, edsko

Differential Revision:

4 years agoGenerate .dyn_o files for .hsig files with -dynamic-too
Michael Smith [Thu, 23 Jul 2015 09:41:16 +0000 (11:41 +0200)] 
Generate .dyn_o files for .hsig files with -dynamic-too

With -dynamic-too, .dyn_o files were not being generated for .hsig
files.  Normally, this is handled in the pipeline; however, the branch
for .hsig files called compileEmptyStub directly instead of going
through runPipeline.  When compiling a Cabal package that included .hsig
files, this triggered a linker error later on, as it expected a .dyn_o
file to have been generated for each .hsig.

The fix is to use runPipeline for .hsig files, just as with .hs files.
Alternately, one could duplicate the logic for handling -dynamic-too in
the .hsig branch, but simply calling runPipeline ends up being much

Test Plan: validate

Reviewers: austin, ezyang, bgamari, thomie

Reviewed By: ezyang, thomie

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #10660

4 years agoLexer: support consecutive references to Haddock chunks (#10398)
Thomas Miedema [Thu, 23 Jul 2015 09:40:37 +0000 (11:40 +0200)] 
Lexer: support consecutive references to Haddock chunks (#10398)

Reviewers: austin, bgamari, Fuuzetsu

Reviewed By: bgamari

Subscribers: thomie, bgamari

Differential Revision:

GHC Trac Issues: #10398

4 years agoComments only
Simon Peyton Jones [Thu, 23 Jul 2015 07:34:10 +0000 (08:34 +0100)] 
Comments only

4 years agoFix Trac #10670
Simon Peyton Jones [Thu, 23 Jul 2015 07:33:43 +0000 (08:33 +0100)] 
Fix Trac #10670

In dataConCannotMatch we were using a GADT data con without
properly instantiating the existential type variables.
The fix is easy, and the code is tighter.

4 years agoUse lookupIfaceTop for loading IfaceDecls.
Edward Z. Yang [Wed, 22 Jul 2015 00:16:52 +0000 (17:16 -0700)] 
Use lookupIfaceTop for loading IfaceDecls.

It's shorter!  And then when Backpack overrides lookupIfaceTop
everyone will see the right information.

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

Reviewers: simonpj, austin, bgamari

Subscribers: thomie

Differential Revision:

4 years agoSome utility functions for testing IfaceType equality.
Edward Z. Yang [Wed, 22 Jul 2015 00:04:38 +0000 (17:04 -0700)] 
Some utility functions for testing IfaceType equality.

These are going to be used by Backpack, but someone else
might find them useful.  They do the "obvious thing".

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

Reviewers: goldfire, bgamari, austin

Subscribers: thomie

Differential Revision:

4 years agoExport alwaysQualifyPackages and neverQualifyPackages.
Edward Z. Yang [Wed, 22 Jul 2015 00:09:38 +0000 (17:09 -0700)] 
Export alwaysQualifyPackages and neverQualifyPackages.

Signed-off-by: Edward Z. Yang <>
4 years agoGive more informative panic for checkFamInstConsistency.
Edward Z. Yang [Wed, 22 Jul 2015 00:06:39 +0000 (17:06 -0700)] 
Give more informative panic for checkFamInstConsistency.

Signed-off-by: Edward Z. Yang <>
4 years agoAdd ExceptionMonad instance for IOEnv.
Edward Z. Yang [Wed, 22 Jul 2015 00:05:16 +0000 (17:05 -0700)] 
Add ExceptionMonad instance for IOEnv.

Signed-off-by: Edward Z. Yang <>
4 years agoSwitch from recording IsBootInterface to recording full HscSource.
Edward Z. Yang [Tue, 21 Jul 2015 23:51:51 +0000 (16:51 -0700)] 
Switch from recording IsBootInterface to recording full HscSource.

Note: ModIface format change is BC, no need to recompile.

Signed-off-by: Edward Z. Yang <>
4 years agoTravis: do pass `--quiet` to validate
Thomas Miedema [Tue, 21 Jul 2015 23:54:40 +0000 (01:54 +0200)] 
Travis: do pass `--quiet` to validate

It's failing at the moment with "The log length has exceeded the limit
of 4 Megabytes".

We don't seem to have periods of >10 minutes without output after all,
which was the initial reason of not using `--quiet`.

4 years agoValidate: explain THREADS instead of CPUS in --help
Thomas Miedema [Tue, 21 Jul 2015 23:34:17 +0000 (01:34 +0200)] 
Validate: explain THREADS instead of CPUS in --help

4 years agoTwo step allocator for 64-bit systems
Giovanni Campagna [Fri, 17 Jul 2015 10:55:49 +0000 (11:55 +0100)] 
Two step allocator for 64-bit systems

The current OS memory allocator conflates the concepts of allocating
address space and allocating memory, which makes the HEAP_ALLOCED()
implementation excessively complicated (as the only thing it cares
about is address space layout) and slow. Instead, what we want
is to allocate a single insanely large contiguous block of address
space (to make HEAP_ALLOCED() checks fast), and then commit subportions
of that in 1MB blocks as we did before.
This is currently behind a flag, USE_LARGE_ADDRESS_SPACE, that is only enabled for
certain OSes.

Test Plan: validate

Reviewers: simonmar, ezyang, austin

Subscribers: thomie, carter

Differential Revision:

GHC Trac Issues: #9706

4 years agoEliminate zero_static_objects_list()
Simon Marlow [Thu, 16 Jul 2015 14:01:49 +0000 (15:01 +0100)] 
Eliminate zero_static_objects_list()

In a workload with a large amount of code, zero_static_objects_list()
takes a significant amount of time, and furthermore it is in the
single-threaded part of the GC.

This patch uses a slightly fiddly scheme for marking objects on the
static object lists, using a flag in the low 2 bits that flips between
two states to indicate whether an object has been visited during this
GC or not.  We also have to take into account objects that have not
been visited yet, which might appear at any time due to runtime linking.

Test Plan: validate

Reviewers: austin, bgamari, ezyang, rwbarton

Subscribers: thomie

Differential Revision:

4 years agoTestsuite: recenter haddock.base allocation numbers
Thomas Miedema [Wed, 22 Jul 2015 16:21:44 +0000 (18:21 +0200)] 
Testsuite: recenter haddock.base allocation numbers

4 years agoRevert "Trac #4945 is working again"
Thomas Miedema [Wed, 22 Jul 2015 16:10:42 +0000 (18:10 +0200)] 
Revert "Trac #4945 is working again"

This reverts commit 5d98b6828f65ce6eea45e93880928b7031955d38.

4 years agoAdd utility function isHoleName.
Edward Z. Yang [Tue, 21 Jul 2015 23:15:32 +0000 (16:15 -0700)] 
Add utility function isHoleName.

Signed-off-by: Edward Z. Yang <>
4 years agoValidate: document --quiet [skip ci]
Thomas Miedema [Tue, 21 Jul 2015 22:00:01 +0000 (00:00 +0200)] 
Validate: document --quiet [skip ci]

4 years agoValidate: by default do show commands
Thomas Miedema [Tue, 21 Jul 2015 20:45:07 +0000 (22:45 +0200)] 
Validate: by default do show commands

Show commands being run by default, so you can copy/paste and rerun them
on build failures/warnings.

See Note [Default build system verbosity].

4 years agoTravis: use ghc-7.8.4 as stage0 to fix the build
Thomas Miedema [Tue, 21 Jul 2015 12:05:32 +0000 (14:05 +0200)] 
Travis: use ghc-7.8.4 as stage0 to fix the build

4 years agoWhen iconv is unavailable, use an ASCII encoding to encode ASCII
Reid Barton [Tue, 21 Jul 2015 17:13:20 +0000 (19:13 +0200)] 
When iconv is unavailable, use an ASCII encoding to encode ASCII

D898 and D1059 implemented a fallback behavior to handle the case
that the end user's iconv installation is broken (typically due to
running inside a chroot in which the necessary locale files and/or
gconv modules have not been installed). In this case, if the
program requests an ASCII locale, GHC's char8 encoding is used
rather than the program failing.

However, silently mangling data like char8 does when the programmer
did not ask for it is poor behavior, for reasons described in D1059.

This commit implements an ASCII encoding and uses it in the fallback
case when iconv is unavailable and the user has requested ASCII.

Test Plan:
Added tests for the encodings defined in Latin1.
Also, manually ran a statically-linked executable of that test
in a chroot and the tests passed (up to the ones that call
mkTextEncoding "LATIN1", since there is no fallback from iconv
for that case yet).

Reviewers: austin, hvr, hsyl20, bgamari

Reviewed By: hsyl20, bgamari

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #7695, #10623

4 years agoconfigure: Bump minimum bootstrap GHC version to 7.8
Ben Gamari [Tue, 21 Jul 2015 16:23:01 +0000 (18:23 +0200)] 
configure: Bump minimum bootstrap GHC version to 7.8

4 years agotestsuite: Show killed command line on timeout
Ben Gamari [Tue, 21 Jul 2015 15:37:03 +0000 (17:37 +0200)] 
testsuite: Show killed command line on timeout

4 years agoT4945 is working again
Simon Peyton Jones [Tue, 21 Jul 2015 16:39:49 +0000 (17:39 +0100)] 
T4945 is working again

This test keeps flipping between ok and not-ok.  In some ways
this isn't surprising, since it greps in the output of
-ddump-simpl, but I wish I knew exactly why.  Anyway,
it's currently working again.

4 years agoMake seq-of-cast rule generate a case
Simon Peyton Jones [Tue, 21 Jul 2015 14:05:42 +0000 (15:05 +0100)] 
Make seq-of-cast rule generate a case

Previously it generated another call to seq, which triggered
a lint failure (Trac #10659)

4 years agoDo occurrence analysis on result of BuiltInRule
Simon Peyton Jones [Tue, 21 Jul 2015 13:41:08 +0000 (14:41 +0100)] 
Do occurrence analysis on result of BuiltInRule

Previously we did occurrence analysis on the result of a
non-built-in RULE, but not of a built-in one.  It makes a
difference if the rule returns something with binders
(which admittedly it usually does not).  I'm about to
introduce just such a rule for 'seq'.

4 years agoFix test T2497 to avoid infinite loop in RULES
Simon Peyton Jones [Tue, 21 Jul 2015 13:39:17 +0000 (14:39 +0100)] 
Fix test T2497 to avoid infinite loop in RULES

4 years agoComments only
Simon Peyton Jones [Tue, 21 Jul 2015 13:34:31 +0000 (14:34 +0100)] 
Comments only

4 years agoAvoid out-of-scope top-level Ids
Simon Peyton Jones [Tue, 21 Jul 2015 13:34:05 +0000 (14:34 +0100)] 
Avoid out-of-scope top-level Ids

Pass the top-level SpecEnv to specImports/specImport, so
that top-level Ids are in scope.  Otherwise we get annoying
(but correct) WARNINGS.

4 years agoComments and white space only
Simon Peyton Jones [Thu, 9 Jul 2015 12:23:08 +0000 (13:23 +0100)] 
Comments and white space only

4 years agoImplement -dsuppress-unfoldings
Simon Peyton Jones [Thu, 9 Jul 2015 12:22:24 +0000 (13:22 +0100)] 
Implement -dsuppress-unfoldings

This extra "suppress" flag helps when there are a lot of Ids
with big unfoldings that clutter up the dump

Also slightly refactor printing of coercions in Core

4 years agoComments and layout only
Simon Peyton Jones [Thu, 9 Jul 2015 12:19:53 +0000 (13:19 +0100)] 
Comments and layout only

This patch adds a lot of visual structure to this key module

4 years agoDocuments -dsuppress-unfoldings
Simon Peyton Jones [Thu, 9 Jul 2015 12:19:03 +0000 (13:19 +0100)] 
Documents -dsuppress-unfoldings

4 years agoAdd NOINLINE for hs-boot functions
Simon Peyton Jones [Mon, 20 Jul 2015 15:18:05 +0000 (16:18 +0100)] 
Add NOINLINE for hs-boot functions

This fixes Trac #10083.

The key change is in TcBinds.tcValBinds, where we construct
the prag_fn.  With this patch we add a NOINLINE pragma for
any functions that were exported by the hs-boot file for this

See Note [Inlining and hs-boot files], and #10083, for details.

The commit touches several other files becuase I also changed the
representation of the "pragma function" from a function TcPragFun
to an environment, TcPragEnv. This makes it easer to extend
during construction.

4 years agoRefactor self-boot info
Simon Peyton Jones [Mon, 20 Jul 2015 14:38:12 +0000 (15:38 +0100)] 
Refactor self-boot info

This patch is a simple refactoring that prepares for a later one,
related to Trac #10083.

* Add a field tcg_self_boot :: SelfBootInfo to TcGblEnv,
  where SelfBootInfo is a new data type, describing the
  hi-boot file, if any, for the module being compiled.

* Make tcHiBootIface return SelfBootInfo, a new data type

* Make other functions get SelfBootInfo from the monad.

* Remove tcg_mod_name from TcGblEnv; it was barely used and
  simpler to pass around explicitly.

4 years agoComments and white space only
Simon Peyton Jones [Mon, 20 Jul 2015 13:40:20 +0000 (14:40 +0100)] 
Comments and white space only

4 years agoImprove strictness analysis for exceptions
Simon Peyton Jones [Tue, 21 Jul 2015 11:28:42 +0000 (12:28 +0100)] 
Improve strictness analysis for exceptions

Two things here:

* For exceptions-catching primops like catch#, we know
  that the main argument function will be called, so
  we can use strictApply1Dmd, rather than lazy

  Changes in primops.txt.pp

* When a 'case' scrutinises a I/O-performing primop,
  the Note [IO hack in the demand analyser] was
  throwing away all strictness from the code that

  I found that this was causing quite a bit of unnecessary
  reboxing in the (heavily used) function

  So this patch prevents the hack applying when the
  case scrutinises a primop.  See the revised
  Note [IO hack in the demand analyser]

Thse two things buy us quite a lot in programs that do a lot of IO.

        Program           Size    Allocs   Runtime   Elapsed  TotalMem
            hpg          -0.4%     -2.9%     -0.9%     -1.0%     +0.0%
reverse-complem          -0.4%    -10.9%    +10.7%    +10.9%     +0.0%
         simple          -0.3%     -0.0%    +26.2%    +26.2%     +3.7%
         sphere          -0.3%     -6.3%      0.09      0.09     +0.0%
            Min          -0.7%    -10.9%     -4.6%     -4.7%     -1.7%
            Max          -0.2%     +0.0%    +26.2%    +26.2%     +6.5%
 Geometric Mean          -0.4%     -0.3%     +2.1%     +2.1%     +0.1%

I think the increase in runtime for 'simple' is measurement error.

4 years agoRefactor newSCWorkFromFlavoured
Simon Peyton Jones [Mon, 20 Jul 2015 22:39:44 +0000 (23:39 +0100)] 
Refactor newSCWorkFromFlavoured

No change in behaviour is intended here

4 years agoComments only (superclasses and improvement)
Simon Peyton Jones [Mon, 20 Jul 2015 22:37:42 +0000 (23:37 +0100)] 
Comments only (superclasses and improvement)

4 years agoUse varToCoreExpr in mkWWcpr_help
Simon Peyton Jones [Mon, 20 Jul 2015 22:34:31 +0000 (23:34 +0100)] 
Use varToCoreExpr in mkWWcpr_help

Lacking this cuased Trac #10658.
The fix is easy; it was a simple omission.

4 years agoDelete __GLASGOW_HASKELL__ ifdefs for stage0 < 7.8
Thomas Miedema [Tue, 21 Jul 2015 11:02:29 +0000 (13:02 +0200)] 
Delete __GLASGOW_HASKELL__ ifdefs for stage0 < 7.8

Reviewers: austin, goldfire, bgamari

Reviewed By: bgamari

Subscribers: bgamari, thomie

Differential Revision:

4 years agoprimops: Fix spelling mistake
Ben Gamari [Tue, 21 Jul 2015 10:27:28 +0000 (12:27 +0200)] 
primops: Fix spelling mistake

4 years agoRevert "Revert "Support for multiple signature files in scope.""
Edward Z. Yang [Tue, 21 Jul 2015 03:16:40 +0000 (20:16 -0700)] 
Revert "Revert "Support for multiple signature files in scope.""

This reverts commit bac927b9770ff769128b66d13a3e72bf5a9bc514.

As it turns out, we need these commits for separate compilation
and accurate dependency tracking.  So back in they go!

4 years agoRevert "Revert "Change loadSrcInterface to return a list of ModIface""
Edward Z. Yang [Tue, 21 Jul 2015 03:16:35 +0000 (20:16 -0700)] 
Revert "Revert "Change loadSrcInterface to return a list of ModIface""

This reverts commit c60704fc405149407c155e297433f1cc299ae58a.

4 years agoUpdate submodule hpc with fix for #10529
Thomas Miedema [Thu, 16 Jul 2015 15:40:50 +0000 (17:40 +0200)] 
Update submodule hpc with fix for #10529

4 years agoTestsuite: simplify T8089 (#8089)
Thomas Miedema [Thu, 16 Jul 2015 18:16:17 +0000 (20:16 +0200)] 
Testsuite: simplify T8089 (#8089)

The previous implementation wasn't working for the `ghci` test way,
causing a fulltest failure.

Differential Revision:

4 years agoTestsuite: mark concprog002 expect_broken_for(#10661, ['threaded2_hT'])
Thomas Miedema [Sun, 19 Jul 2015 19:43:55 +0000 (21:43 +0200)] 
Testsuite: mark concprog002 expect_broken_for(#10661, ['threaded2_hT'])

4 years agoTestsuite: fix concprog002 (AMP)
Thomas Miedema [Sun, 19 Jul 2015 17:44:56 +0000 (19:44 +0200)] 
Testsuite: fix concprog002 (AMP)

Requires random to be installed.

4 years agoFix primops documentation syntax
Ben Gamari [Mon, 20 Jul 2015 16:39:54 +0000 (12:39 -0400)] 
Fix primops documentation syntax

4 years agoDo not treat prim and javascript imports as C imports in TH and QQ
Luite Stegeman [Mon, 20 Jul 2015 15:01:06 +0000 (17:01 +0200)] 
Do not treat prim and javascript imports as C imports in TH and QQ

Reviewers: austin, hvr, goldfire, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #10638

4 years agoprimops: Add haddocks to BCO primops
Ben Gamari [Mon, 20 Jul 2015 14:45:01 +0000 (16:45 +0200)] 
primops: Add haddocks to BCO primops

Test Plan: none

Reviewers: simonmar, austin, hvr

Subscribers: hvr, thomie

Differential Revision:

GHC Trac Issues: #10640

4 years agoSupport wild cards in TH splices
Thomas Winant [Mon, 20 Jul 2015 13:43:53 +0000 (15:43 +0200)] 
Support wild cards in TH splices

- Declaration splices: partial type signatures are fully supported in TH
  declaration splices.

  For example, the wild cards in the example below will unify with `Eq
  and `a -> a -> Bool`, as expected:

[d| foo :: _ => _
    foo x y = x == y |]

- Expression splices: anonymous and named wild cards are supported in
  expression signatures, but extra-constraints wild cards aren't. Just
  as is the case for regular expression signatures.

[e | Just True :: _a _ |]

- Typed expression splices: the same wildcards as in (untyped)
  expression splices are supported.

- Pattern splices: TH doesn't support type signatures in pattern
  splices, consequently, partial type signatures aren't supported

- Type splices: partial type signatures are only partially supported in
  type splices, specifically: only anonymous wild cards are allowed.

  So `[t| _ |]`, `[t| _ -> Maybe _ |]` will work, but `[t| _ => _ |]` or
  `[| _a |]` won't (without `-XNamedWildCards`, the latter will work as
  the named wild card is treated as a type variable).

  Normally, named wild cards are collected before renaming a (partial)
  type signature. However, TH type splices are run during renaming, i.e.
  after the initial traversal, leading to out of scope errors for named
  wild cards. We can't just extend the initial traversal to collect the
  named wild cards in TH type splices, as we'd need to expand them,
  which is supposed to happen only once, during renaming.

  Similarly, the extra-constraints wild card is handled right before
  renaming too, and is therefore also not supported in a TH type splice.
  Another reason not to support extra-constraints wild cards in TH type
  splices is that a single signature can contain many TH type splices,
  whereas it mustn't contain more than one extra-constraints wild card.
  Enforcing would this be hard the way things are currently organised.

  Anonymous wild cards pose no problem, because they start without names
  and are given names during renaming. These names are collected right
  after renaming. The names generated for anonymous wild cards in TH
  type splices will thus be collected as well.

  With a more invasive refactoring of the renaming, partial type
  signatures could be fully supported in TH type splices. As only
  anonymous wild cards have been requested so far, these small changes
  satisfying this request will do for now. Also don't forget that a TH
  declaration splices support all kinds of wild cards.

- Extra-constraints wild cards were silently ignored in expression and
  pattern signatures, appropriate error messages are now generated.

Test Plan: run new tests

Reviewers: austin, goldfire, adamgundry, bgamari

Reviewed By: goldfire, adamgundry, bgamari

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #10094, #10548

4 years agoLlvmCodeGen: add support for MO_U_Mul2 CallishMachOp
Michal Terepeta [Mon, 20 Jul 2015 13:43:31 +0000 (15:43 +0200)] 
LlvmCodeGen: add support for MO_U_Mul2 CallishMachOp

This adds support MO_U_Mul2 to the LLVM backend by simply using 'mul'
instruction but operating at twice the bit width (e.g., for 64 bit
words we will generate mul that operates on 128 bits and then extract
the two 64 bit values for the result of the CallishMachOp).

Test Plan: validate

Reviewers: rwbarton, austin, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #9430

4 years agoTestsuite: add regression test for missing class constraint
Thomas Miedema [Mon, 20 Jul 2015 13:40:59 +0000 (15:40 +0200)] 
Testsuite: add regression test for missing class constraint

The following program is accepted by ghc-7.0 to ghc-7.10, but rejected
by ghc-6.12.3 and HEAD (and rightfully so):

    class Class1 a
    class Class1 a => Class2 a
    class Class2 a => Class3 a
    instance Class3 a => Class2 a

The last line is missing a `Class1 a` constraint. Add a regression test
for this (typechecker/should_fail/tcfail223).

Add similar missing class constraints to T7126 and T5751. I verified
that the these changes don't interfer with the intention of the tests
(they still result in a loop with ghc-7.4.1).

Reviewers: austin, simonpj, bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie

Differential Revision:

4 years agoTestsuite: add -XUndecidableInstances to T3500a
Thomas Miedema [Mon, 20 Jul 2015 13:40:26 +0000 (15:40 +0200)] 
Testsuite: add -XUndecidableInstances to T3500a

This makes the test pass again with HEAD (7.11), instead of resulting

  T3500a.hs:11:10: error:
      The constraint ‘C (F a)’ is no smaller than the instance head
      (Use UndecidableInstances to permit this)
      In the instance declaration for ‘C (a, b)’

Test Plan: I verified that ghc-6.12.3's typechecker still loops on this

Reviewers: austin, bgamari, simonpj

Reviewed By: simonpj

Subscribers: thomie

Differential Revision:

4 years agoTestsuite: add ImpredicativeTypes to T7861 (#7861)
Thomas Miedema [Mon, 20 Jul 2015 13:39:52 +0000 (15:39 +0200)] 
Testsuite: add ImpredicativeTypes to T7861 (#7861)

The test was failing with:

    T7861: T7861.hs:15:13:
        Cannot instantiate unification variable ‘t0’
        with a type involving foralls: A a0 -> a0
          GHC doesn't yet support impredicative polymorphism
        In the first argument of ‘seq’, namely ‘f’
        In a stmt of a 'do' block: f `seq` print "Hello 2"

It requires ImpredicativeTypes, at least since 7.8, because we
instantiate seq's type (c->d->d) with f's type (c:= (forall b. a) -> a),
which is polymorphic (it has foralls).

I simplified the test a bit by removing the type synonym, and verified
that ghc-7.6.3 still panics on this test.

Reviewers: simonpj, austin, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

GHC Trac Issues: #7861

4 years agoAdd regression test for unused implicit parameter warning (#10632)
Reid Barton [Mon, 20 Jul 2015 02:36:08 +0000 (22:36 -0400)] 
Add regression test for unused implicit parameter warning (#10632)

4 years agoTestsuite: mark array001 and conc034 expect_broken_for(#10659, ['optasm',...])
Thomas Miedema [Sat, 18 Jul 2015 20:19:01 +0000 (22:19 +0200)] 
Testsuite: mark array001 and conc034 expect_broken_for(#10659, ['optasm',...])

Update submodule array.

4 years agoTestsuite: mark gadt/termination expect_broken_for(#10658, ['optasm','optllvm'])
Thomas Miedema [Sat, 18 Jul 2015 19:28:10 +0000 (21:28 +0200)] 
Testsuite: mark gadt/termination expect_broken_for(#10658, ['optasm','optllvm'])

4 years agoTestsuite: mark qq007 and qq008 expect_broken(#10047)
Thomas Miedema [Sat, 18 Jul 2015 18:55:24 +0000 (20:55 +0200)] 
Testsuite: mark qq007 and qq008 expect_broken(#10047)

This fixes the wrong ticket number in
16a87397295fa92bcbe7a2c6277f938622b93969 (#10181).

4 years agoTestsuite: mark qq007 and qq008 expect_broken(#10181)
Thomas Miedema [Sat, 18 Jul 2015 18:45:14 +0000 (20:45 +0200)] 
Testsuite: mark qq007 and qq008 expect_broken(#10181)

4 years agoTestsuite: mark 3 tests expect_broken_for(#10181, ['optasm', 'optllvm'])
Thomas Miedema [Sat, 18 Jul 2015 18:38:57 +0000 (20:38 +0200)] 
Testsuite: mark 3 tests expect_broken_for(#10181, ['optasm', 'optllvm'])

4 years agoTestsuite: mark T7919 expect_broken_for(#7919, ['optasm','dyn','optllvm'])
Thomas Miedema [Sat, 18 Jul 2015 17:25:37 +0000 (19:25 +0200)] 
Testsuite: mark T7919 expect_broken_for(#7919, ['optasm','dyn','optllvm'])

It fails with a segmentation fault. Occasionally also for WAY=threaded2.

4 years agoTestsuite: mark T2497 expect_broken_for(#10657, ['optasm', 'optllvm'])
Thomas Miedema [Sat, 18 Jul 2015 17:01:13 +0000 (19:01 +0200)] 
Testsuite: mark T2497 expect_broken_for(#10657, ['optasm', 'optllvm'])