ghc.git
4 years agoUse TypeLits in the meta-data encoding of GHC.Generics wip/GenericsMetaData2
Jose Pedro Magalhaes [Thu, 2 Oct 2014 07:38:05 +0000 (08:38 +0100)] 
Use TypeLits in the meta-data encoding of GHC.Generics

The following wiki page contains more information about this:
https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/GenericDeriving#Amoreconservativefirstapproachtothisproblem

4 years agoCall `popCountBigNat` directly (#9818)
Herbert Valerio Riedel [Sat, 22 Nov 2014 14:09:46 +0000 (15:09 +0100)] 
Call `popCountBigNat` directly (#9818)

This calls the `popCountBigNat` primitive directly instead of going
through `Integer`'s `popCount`.

4 years agoImplement {gcd,lcm}/Natural optimisation (#9818)
Herbert Valerio Riedel [Sat, 22 Nov 2014 14:03:33 +0000 (15:03 +0100)] 
Implement {gcd,lcm}/Natural optimisation (#9818)

This provides the equivalent of the existing `{gcd,lcm}/Integer`
optimisations for the `Natural` type, when using the `integer-gmp2`
backend.

4 years agoFix `fromInteger` constructing invalid `Natural`
Herbert Valerio Riedel [Sat, 22 Nov 2014 13:56:53 +0000 (14:56 +0100)] 
Fix `fromInteger` constructing invalid `Natural`

This fixes a case where `isValidNatural . fromInteger` would be `False`.

Re #9818

4 years agoAdd `isValidNatural` predicate (#9818)
Herbert Valerio Riedel [Sat, 22 Nov 2014 13:52:04 +0000 (14:52 +0100)] 
Add `isValidNatural` predicate (#9818)

This predicate function encodes the internal `Natural` invariants, and
is useful for testsuites or code that directly constructs `Natural`
values.

C.f. `integer-gmp2`'s `isValidBigNat#` and `isValidInteger#` predicates
for testing internal invariants.

4 years agoAdd gcd/Word RULE-based optimisation
Herbert Valerio Riedel [Sat, 22 Nov 2014 12:28:25 +0000 (13:28 +0100)] 
Add gcd/Word RULE-based optimisation

This makes use of the `gcdWord` primitive provided by
be7fb7e58c70cd9b0a933fb26cd5f2607d6dc4b2 which should make the
`Word`-variant of `gcd` as performant as the `Int`-variant.

4 years agoRemove reference to `MIN_VERSION_integer_gmp2`
Herbert Valerio Riedel [Sat, 22 Nov 2014 12:22:03 +0000 (13:22 +0100)] 
Remove reference to `MIN_VERSION_integer_gmp2`

This is slipped in by accident as part of
c774b28f76ee4c220f7c1c9fd81585e0e3af0e8a (re #9281)

4 years agointeger-gmp2: export `Word`-counterpart of gcdInt
Herbert Valerio Riedel [Sat, 22 Nov 2014 12:18:34 +0000 (13:18 +0100)] 
integer-gmp2: export `Word`-counterpart of gcdInt

It's trivial for `integer-gmp2` (#9281) to provide it, and it'll be
useful for a future 'Natural'-related commit, as well as providing a
`Word` optimised `gcd`-RULE.

4 years agoRevert "Test Trac #9318"
Herbert Valerio Riedel [Sat, 22 Nov 2014 09:15:29 +0000 (10:15 +0100)] 
Revert "Test Trac #9318"

This reverts commit 5760eb598e0dfa451407195f15072204c15233ed
because the very same test was already added via
5eebd990ea7a5bc1937657b101ae83475e20fc7a and is causing
`./validate` to fail due to "framework failure".

4 years agoRe-center bytes-allocated for `haddock.compiler`
Herbert Valerio Riedel [Sat, 22 Nov 2014 00:18:22 +0000 (01:18 +0100)] 
Re-center bytes-allocated for `haddock.compiler`

This should silence the

   perf/haddock  haddock.compiler [stat not good enough] (normal)

test-failure...

4 years agoImplement `Natural` number type (re #9818)
Herbert Valerio Riedel [Fri, 21 Nov 2014 23:15:42 +0000 (00:15 +0100)] 
Implement `Natural` number type (re #9818)

This implements a `Natural` type for representing unsigned arbitrary
precision integers.

When available, `integer-gmp>=1.0.0`'s `BigNat` type is used as
building-block to construct `Natural` as an algebraic data-type.
Otherwise, `Natural` falls back being a `newtype`-wrapper around
`Integer` (as is done in Edward Kmett's `nats` package).

The `GHC.Natural` module exposes an internal GHC-specific API, while
`Numeric.Natural` provides the official & portable API.

Reviewed By: austin, ekmett

Differential Revision: https://phabricator.haskell.org/D473

4 years agoDeprecate Data.Version.versionTags (#2496)
Thomas Miedema [Fri, 21 Nov 2014 23:03:19 +0000 (00:03 +0100)] 
Deprecate Data.Version.versionTags (#2496)

The library submission was accepted:

  http://www.haskell.org/pipermail/libraries/2014-September/023777.html

The T5892ab testcases were changed to use `Data.Tree` instead of `Data.Version`

Reviewed By: ekmett

Differential Revision: https://phabricator.haskell.org/D395

4 years agoAdd -fdefer-typed-holes flag which defers hole errors to runtime.
Merijn Verstraaten [Fri, 21 Nov 2014 21:32:38 +0000 (15:32 -0600)] 
Add -fdefer-typed-holes flag which defers hole errors to runtime.

Summary:
As proposed by Richard on Trac. This patch adds a new flag -fdefer-typed-holes
and changes the semantics of the -fno-warn-typed-holes flag.

To summarise, by default GHC has typed holes enabled and produces a compile
error when it encounters a typed hole.

When -fdefer-type-errors OR -fdefer-typed-holes is enabled, hole errors are
converted to warnings and result in runtime errors when evaluated.

The warning flag -fwarn-typed-holes is on by default. Without -fdefer-type-errors
or -fdefer-typed-holes this flag is a no-op, since typed holes are an error
under these conditions. If either of the defer flags are enabled (converting
typed hole errors into warnings) the -fno-warn-typed-holes flag disables the
warnings. This means compilation silently succeeds and evaluating a hole will
produce a runtime error.

The rationale behind allowing typed holes warnings to be silenced is that tools
like Syntastic for vim highlight warnings and hole warnings may be undesirable.

Signed-off-by: Merijn Verstraaten <merijn@inconsistent.nl>
Test Plan: validate

Reviewers: austin, simonpj, thomie

Reviewed By: simonpj, thomie

Subscribers: Fuuzetsu, thomie, carter

Differential Revision: https://phabricator.haskell.org/D442

GHC Trac Issues: #9497

Conflicts:
compiler/main/DynFlags.hs

4 years agoghc: allow --show-options and --interactive together
Lennart Kolmodin [Fri, 21 Nov 2014 21:31:54 +0000 (15:31 -0600)] 
ghc: allow --show-options and --interactive together

Summary:
Previously 'ghc --show-options' showed all options that GHC can possibly
accept. With this patch, it'll only show the options that have effect in
non-interactive modes.
This change also adds support for using 'ghc --interactive --show-options'
which previously was disallowed. This command will show all options that have
effect in the interactive mode.
The CmdLineParser is updated to know about the GHC modes, and then each flag
is annotated with which mode it has effect.
This fixes #9259.

Test Plan:
Try out --show-options with --interactive on the command line. With and without
--interactive should give different results.
Run the test suite, mode001 has been updated to verify this new flag
combination.

Reviewers: austin, jstolarek

Reviewed By: austin, jstolarek

Subscribers: jstolarek, thomie, carter, simonmar

Differential Revision: https://phabricator.haskell.org/D337

GHC Trac Issues: #9259

4 years agoAdd function for size-checked conversion of Integral types
Sean Leather [Fri, 21 Nov 2014 22:34:41 +0000 (23:34 +0100)] 
Add function for size-checked conversion of Integral types

The new function `Data.Bits.toIntegralSized` provides a similar
functionality to `fromIntegral` but adds validation that the
argument fits in the result type's size.

The implementation of `toIntegralSized` has been derived from `intCastMaybe`
(which is part of Herbert Valerio Riedel's `int-cast` package,
see http://hackage.haskell.org/package/int-cast)

Addresses #9816

Reviewed By: ekmett, austin

Differential Revision: https://phabricator.haskell.org/D512

4 years agoAdd displayException method to Exception (#9822)
Michael Snoyman [Fri, 21 Nov 2014 22:26:09 +0000 (23:26 +0100)] 
Add displayException method to Exception (#9822)

Defaults to using `show` to prevent any breakage of existing code.  Also
provide a custom implementation for `SomeException` which uses the
underlying exception's `displayException`.

Differential Revision: https://phabricator.haskell.org/D517

4 years agollvmGen: Compatibility with LLVM 3.5 (re #9142)
Ben Gamari [Fri, 21 Nov 2014 20:05:25 +0000 (21:05 +0100)] 
llvmGen: Compatibility with LLVM 3.5 (re #9142)

Due to changes in LLVM 3.5 aliases now may only refer to definitions.
Previously to handle symbols defined outside of the current commpilation
unit GHC would emit both an `external` declaration, as well as an alias
pointing to it, e.g.,

    @stg_BCO_info = external global i8
    @stg_BCO_info$alias = alias private i8* @stg_BCO_info

Where references to `stg_BCO_info` will use the alias
`stg_BCO_info$alias`. This is not permitted under the new alias
behavior, resulting in errors resembling,

    Alias must point to a definition
    i8* @"stg_BCO_info$alias"

To fix this, we invert the naming relationship between aliases and
definitions. That is, now the symbol definition takes the name
`@stg_BCO_info$def` and references use the actual name, `@stg_BCO_info`.
This means the external symbols can be handled by simply emitting an
`external` declaration,

    @stg_BCO_info = external global i8

Whereas in the case of a forward declaration we emit,

    @stg_BCO_info = alias private i8* @stg_BCO_info$def

Reviewed By: austin

Differential Revision: https://phabricator.haskell.org/D155

4 years agoBe consistent with placement of Safe Haskell mode at top of file
David Terei [Thu, 20 Nov 2014 02:29:51 +0000 (18:29 -0800)] 
Be consistent with placement of Safe Haskell mode at top of file

4 years agoImprove Safe Haskell bounds for changes to base over time
David Terei [Thu, 20 Nov 2014 02:02:30 +0000 (18:02 -0800)] 
Improve Safe Haskell bounds for changes to base over time

4 years agoUpdate Foreign.* for Safe Haskell now that they're safe by default
David Terei [Thu, 20 Nov 2014 02:00:11 +0000 (18:00 -0800)] 
Update Foreign.* for Safe Haskell now that they're safe by default

4 years agoUpdate Control.Monad.ST.* for Safe Haskell as now they're safe by default
David Terei [Thu, 20 Nov 2014 01:58:43 +0000 (17:58 -0800)] 
Update Control.Monad.ST.* for Safe Haskell as now they're safe by default

4 years agoAdd T7220a.stderr
Joachim Breitner [Fri, 21 Nov 2014 20:55:37 +0000 (21:55 +0100)] 
Add T7220a.stderr

which presumably was just forgotten when creating the testcase in
commit 7b1a856.

4 years agoAdd 'fillBytes' to Foreign.Marshal.Utils.
Alex Petrov [Fri, 21 Nov 2014 18:24:37 +0000 (19:24 +0100)] 
Add 'fillBytes' to Foreign.Marshal.Utils.

fillBytes uses 'memset' to fill a memory area with a given byte value.

Reviewed By: austin, hvr

Differential Revision: https://phabricator.haskell.org/D465

4 years agoCapture original source for literals
Alan Zimmerman [Fri, 21 Nov 2014 19:24:30 +0000 (13:24 -0600)] 
Capture original source for literals

Summary:
Make HsLit and OverLitVal have original source strings, for source to
source conversions using the GHC API

This is part of the ongoing AST Annotations work, as captured in
https://ghc.haskell.org/trac/ghc/wiki/GhcAstAnnotations and
https://ghc.haskell.org/trac/ghc/ticket/9628#comment:28

The motivations for the literals is as follows

```lang=haskell
x,y :: Int
x = 0003
y = 0x04

s :: String
s = "\x20"

c :: Char
c = '\x20'

d :: Double
d = 0.00

blah = x
  where
    charH = '\x41'#
    intH = 0004#
    wordH = 005##
    floatH = 3.20#
    doubleH = 04.16##
    x = 1
```

Test Plan: ./sh validate

Reviewers: simonpj, austin

Reviewed By: simonpj, austin

Subscribers: thomie, goldfire, carter, simonmar

Differential Revision: https://phabricator.haskell.org/D412

GHC Trac Issues: #9628

4 years agoAdd Data.Void to base (re #9814)
Herbert Valerio Riedel [Fri, 21 Nov 2014 17:30:14 +0000 (18:30 +0100)] 
Add Data.Void to base (re #9814)

This adds the module `Data.Void` (formerly provided by Edward Kmett's `void`
package) to `base`.

The original Haskell98 compatible implementation has been modified to use
modern GHC features (among others this makes use of `EmptyCase` as
motivated by #2431), and `vacuousM` was dropped since it's redundant now
with the AMP in place.  Instances for classes not part of `base` had to be
dropped as well.

TODO: Documentation could be improved

Reviewed By: ekmett, austin

Differential Revision: https://phabricator.haskell.org/D506

4 years agoExport more Packages functions
Luite Stegeman [Fri, 21 Nov 2014 17:33:00 +0000 (11:33 -0600)] 
Export more Packages functions

Summary:
This patch exports functions for finding the active package
databases and their locations from the Packages module. This
allows GHC API clients to use other tools, like Cabal, to gather
package information that's not directly available from the
binary package db.

Reviewers: duncan, austin

Reviewed By: austin

Subscribers: thomie, carter

Differential Revision: https://phabricator.haskell.org/D514

4 years agoFixes ghci :unset -X<ext> so that it doesn't fail to reverse option. (fixes trac...
Muhaimin Ahsan [Fri, 21 Nov 2014 17:31:44 +0000 (11:31 -0600)] 
Fixes ghci :unset -X<ext> so that it doesn't fail to reverse option. (fixes trac #9293)

Summary: ghci unset could not reverse language extensions.

Reviewers: hvr, thomie, austin

Reviewed By: hvr, thomie, austin

Subscribers: goldfire, hvr, thomie, carter

Differential Revision: https://phabricator.haskell.org/D516

GHC Trac Issues: #9293

4 years agoAdd API Annotations
Alan Zimmerman [Fri, 21 Nov 2014 17:20:13 +0000 (11:20 -0600)] 
Add API Annotations

Summary:
The final design and discussion is captured at
https://ghc.haskell.org/trac/ghc/wiki/GhcAstAnnotations

This is a proof of concept implementation of a completely
separate annotation structure, populated in the parser,and tied to the
AST by means of a virtual "node-key" comprising the surrounding
SrcSpan and a value derived from the specific constructor used for the
node.

The key parts of the design are the following.

== The Annotations ==

In `hsSyn/ApiAnnotation.hs`

```lang=haskell
type ApiAnns = (Map.Map ApiAnnKey SrcSpan, Map.Map SrcSpan [Located Token])

type ApiAnnKey = (SrcSpan,AnnKeywordId)

-- ---------------------------------------------------------------------

-- | Retrieve an annotation based on the @SrcSpan@ of the annotated AST
-- element, and the known type of the annotation.
getAnnotation :: ApiAnns -> SrcSpan -> AnnKeywordId -> Maybe SrcSpan
getAnnotation (anns,_) span ann = Map.lookup (span,ann) anns

-- |Retrieve the comments allocated to the current @SrcSpan@
getAnnotationComments :: ApiAnns -> SrcSpan -> [Located Token]
getAnnotationComments (_,anns) span =
  case Map.lookup span anns of
    Just cs -> cs
    Nothing -> []

-- | Note: in general the names of these are taken from the
-- corresponding token, unless otherwise noted
data AnnKeywordId
         = AnnAs
         | AnnBang
         | AnnClass
         | AnnClose -- ^ } or ] or ) or #) etc
         | AnnComma
         | AnnDarrow
         | AnnData
         | AnnDcolon
         ....
```

== Capturing in the lexer/parser ==

The annotations are captured in the lexer / parser by extending PState to include a field

In `parser/Lexer.x`

```lang=haskell
data PState = PState {
        ....
        annotations :: [(ApiAnnKey,SrcSpan)]
        -- Annotations giving the locations of 'noise' tokens in the
        -- source, so that users of the GHC API can do source to
        -- source conversions.
     }
```

The lexer exposes a helper function to add an annotation

```lang=haskell
addAnnotation :: SrcSpan -> Ann -> SrcSpan -> P ()
addAnnotation l a v = P $ \s -> POk s {
  annotations = ((AK l a), v) : annotations s
  } ()

```

The parser also has some helper functions of the form

```lang=haskell
type MaybeAnn = Maybe (SrcSpan -> P ())

gl = getLoc
gj x = Just (gl x)

ams :: Located a -> [MaybeAnn] -> P (Located a)
ams a@(L l _) bs = (mapM_ (\a -> a l) $ catMaybes bs) >> return a
```

This allows annotations to be captured in the parser by means of

```
ctypedoc :: { LHsType RdrName }
        : 'forall' tv_bndrs '.' ctypedoc {% hintExplicitForall (getLoc $1) >>
                                            ams (LL $ mkExplicitHsForAllTy $2 (noLoc []) $4)
                                                [mj AnnForall $1,mj AnnDot $3] }
        | context '=>' ctypedoc         {% ams (LL $ mkQualifiedHsForAllTy   $1 $3)
                                               [mj AnnDarrow $2] }
        | ipvar '::' type               {% ams (LL (HsIParamTy (unLoc $1) $3))
                                               [mj AnnDcolon $2] }
        | typedoc                       { $1 }
```

== Parse result ==

```lang-haskell
data HsParsedModule = HsParsedModule {
    hpm_module    :: Located (HsModule RdrName),
    hpm_src_files :: [FilePath],
       -- ^ extra source files (e.g. from #includes).  The lexer collects
       -- these from '# <file> <line>' pragmas, which the C preprocessor
       -- leaves behind.  These files and their timestamps are stored in
       -- the .hi file, so that we can force recompilation if any of
       -- them change (#3589)
    hpm_annotations :: ApiAnns
  }

-- | The result of successful parsing.
data ParsedModule =
  ParsedModule { pm_mod_summary   :: ModSummary
               , pm_parsed_source :: ParsedSource
               , pm_extra_src_files :: [FilePath]
               , pm_annotations :: ApiAnns }
```

This diff depends on D426

Test Plan: sh ./validate

Reviewers: austin, simonpj, Mikolaj

Reviewed By: simonpj, Mikolaj

Subscribers: Mikolaj, goldfire, thomie, carter

Differential Revision: https://phabricator.haskell.org/D438

GHC Trac Issues: #9628

4 years agoAST changes to prepare for API annotations, for #9628
Alan Zimmerman [Fri, 21 Nov 2014 17:20:06 +0000 (11:20 -0600)] 
AST changes to prepare for API annotations, for #9628

Summary:
AST changes to prepare for API annotations

Add locations to parts of the AST so that API annotations can
then be added.

The outline of the whole process is captured here
https://ghc.haskell.org/trac/ghc/wiki/GhcAstAnnotations

This change updates the haddock submodule.

Test Plan: sh ./validate

Reviewers: austin, simonpj, Mikolaj

Reviewed By: simonpj, Mikolaj

Subscribers: thomie, goldfire, carter

Differential Revision: https://phabricator.haskell.org/D426

GHC Trac Issues: #9628

4 years agoUpdate manual for pattern splices (#1476)
Richard Eisenberg [Fri, 21 Nov 2014 15:51:38 +0000 (10:51 -0500)] 
Update manual for pattern splices (#1476)

4 years agoFix #9824 by not warning about unused matches in pattern quotes.
Richard Eisenberg [Fri, 21 Nov 2014 15:33:37 +0000 (10:33 -0500)] 
Fix #9824 by not warning about unused matches in pattern quotes.

4 years agoTest #9824 in th/T9824
Richard Eisenberg [Fri, 21 Nov 2014 15:31:40 +0000 (10:31 -0500)] 
Test #9824 in th/T9824

4 years agoRelease notes for #1476, #7484.
Richard Eisenberg [Tue, 4 Nov 2014 17:20:25 +0000 (12:20 -0500)] 
Release notes for #1476, #7484.

4 years agoFix #1476 by making splice patterns work.
Richard Eisenberg [Tue, 4 Nov 2014 16:34:53 +0000 (11:34 -0500)] 
Fix #1476 by making splice patterns work.

Unfortunately, splice patterns in brackets still do not work
because we don't run splices in brackets. Without running a pattern
splice, we can't know what variables it binds, so we're stuck.

This is still a substantial improvement, and it may be the best
we can do. Still must document new behavior.

4 years agoTest that nested pattern splices don't scope (#1476).
Richard Eisenberg [Tue, 4 Nov 2014 18:06:56 +0000 (13:06 -0500)] 
Test that nested pattern splices don't scope (#1476).

Test case: th/T1476b.

4 years agoTest #1476 in th/T1476
Richard Eisenberg [Tue, 4 Nov 2014 01:26:14 +0000 (20:26 -0500)] 
Test #1476 in th/T1476

4 years agoFix #7484, checking for good binder names in Convert.
Richard Eisenberg [Mon, 3 Nov 2014 20:34:53 +0000 (15:34 -0500)] 
Fix #7484, checking for good binder names in Convert.

This commit also refactors a bunch of lexeme-oriented code into
a new module Lexeme, and includes a submodule update for haddock.

4 years agoTest #7484 in th/T7484
Richard Eisenberg [Mon, 3 Nov 2014 20:33:51 +0000 (15:33 -0500)] 
Test #7484 in th/T7484

4 years agoComments only
Simon Peyton Jones [Fri, 21 Nov 2014 13:29:42 +0000 (13:29 +0000)] 
Comments only

4 years agoTest Trac #8149
Simon Peyton Jones [Fri, 21 Nov 2014 13:03:08 +0000 (13:03 +0000)] 
Test Trac #8149

4 years agoFix Trac #9815
Simon Peyton Jones [Fri, 21 Nov 2014 13:02:45 +0000 (13:02 +0000)] 
Fix Trac #9815

Dot-dot record-wildcard notation is simply illegal for constructors
without any named fields, but that was neither documented nor checked.
This patch does so

- Make the check in RnPat
- Add test T9815
- Fix CmmLayoutStack which was using the illegal form (!)
- Document in user manual

4 years agoWibbles (usually improvements) to error messages
Simon Peyton Jones [Fri, 21 Nov 2014 11:33:16 +0000 (11:33 +0000)] 
Wibbles (usually improvements) to error messages

4 years agoTest T2239 actually succeeds without impredicativity, because of the new co/contra...
Simon Peyton Jones [Fri, 21 Nov 2014 11:31:25 +0000 (11:31 +0000)] 
Test T2239 actually succeeds without impredicativity, because of the new co/contra subsumption check

4 years agoFix up tests for Trac #7220; the old test really was ambiguous
Simon Peyton Jones [Fri, 21 Nov 2014 11:29:47 +0000 (11:29 +0000)] 
Fix up tests for Trac #7220; the old test really was ambiguous

4 years agoTest Trac #9569
Simon Peyton Jones [Fri, 21 Nov 2014 11:22:52 +0000 (11:22 +0000)] 
Test Trac #9569

4 years agoDelete duplicated tests
Simon Peyton Jones [Fri, 21 Nov 2014 11:18:10 +0000 (11:18 +0000)] 
Delete duplicated tests

4 years agoTrac #9222 is actually an ambiguous type, now detected
Simon Peyton Jones [Fri, 21 Nov 2014 11:16:19 +0000 (11:16 +0000)] 
Trac #9222 is actually an ambiguous type, now detected

4 years agoTest Trac #9318
Simon Peyton Jones [Fri, 21 Nov 2014 11:12:16 +0000 (11:12 +0000)] 
Test Trac #9318

4 years agoRemove TcMType from compiler_stage2_dll0_MODULES
Simon Peyton Jones [Fri, 21 Nov 2014 11:07:57 +0000 (11:07 +0000)] 
Remove TcMType from compiler_stage2_dll0_MODULES

I can't say I really understand this DLL-split thing, but the build fails
if I don't remove TcMType here.

I've put this in a commit on its own, but it's a knock-on effect of the
immediately preceding wave of typechecker changes

4 years agoFix a latent promotion bug in TcSimplify.simplifyInfer
Simon Peyton Jones [Fri, 21 Nov 2014 11:06:12 +0000 (11:06 +0000)] 
Fix a latent promotion bug in TcSimplify.simplifyInfer

We weren't promoting enough type variables, with unpredictable consequences.
The new code is, if anything, simpler.

4 years agoMake the on-the-fly unifier defer forall/forall unification
Simon Peyton Jones [Fri, 21 Nov 2014 11:04:28 +0000 (11:04 +0000)] 
Make the on-the-fly unifier defer forall/forall unification

This has to be done by the full constraint solver anyway, and it's
rare, so there's really no point in doing it twice.  This change
just deletes some (tricky) code.

4 years agoPut the decision of when a unification variable can unify with a polytype
Simon Peyton Jones [Fri, 21 Nov 2014 10:59:49 +0000 (10:59 +0000)] 
Put the decision of when a unification variable can unify with a polytype

This was being doing independently in two places. Now it's done in one
place, TcType.canUnifyWithPolyType

4 years agoImplement full co/contra-variant subsumption checking (fixes Trac #9569)
Simon Peyton Jones [Fri, 21 Nov 2014 10:58:10 +0000 (10:58 +0000)] 
Implement full co/contra-variant subsumption checking (fixes Trac #9569)

This is a pretty big patch, but which substantially iproves the subsumption
check.  Trac #9569 was the presenting example, showing how type inference could
depend rather delicately on eta expansion.  But there are other less exotic
examples; see Note [Co/contra-variance of subsumption checking] in TcUnify.

The driving change is to TcUnify.tcSubType.  But also

* HsWrapper gets a new constructor WpFun, which behaves very like CoFun:
       if     wrap1 :: exp_arg <= act_arg
              wrap2 :: act_res <= exp_res
       then   WpFun wrap1 wrap2 : (act_arg -> arg_res) <= (exp_arg -> exp_res)

* I generalised TcExp.tcApp to call tcSubType on the result,
  rather than tcUnifyType.  I think this just makes it consistent
  with everything else, notably tcWrapResult.

As usual I ended up doing some follow-on refactoring

* AmbigOrigin is gone (in favour of TypeEqOrigin)
* Combined BindPatSigCtxt and PatSigCxt into one
* Improved a bit of error message generation

4 years agoMove all the zonk/tidy stuff together into TcMType (refactoring only)
Simon Peyton Jones [Fri, 21 Nov 2014 10:15:04 +0000 (10:15 +0000)] 
Move all the zonk/tidy stuff together into TcMType (refactoring only)

4 years agoRejig builders for pattern synonyms, especially unlifted ones
Simon Peyton Jones [Fri, 21 Nov 2014 10:04:09 +0000 (10:04 +0000)] 
Rejig builders for pattern synonyms, especially unlifted ones

When a pattern synonym is for an unlifted pattern, its "builder" would
naturally be a top-level unlifted binding, which isn't allowed.  So we
give it an extra Void# argument.

Our Plan A involved then making *two* Ids for these builders, with
some consequential fuss in the desugarer.  This was more pain than I
liked, so I've re-jigged it.

 * There is just one builder for a pattern synonym.

 * It may have an extra Void# arg, but this decision is signalled
   by the Bool in the psBuilder field.

   I did the same for the psMatcher field.

   Both Bools are serialised into interface files, so there is
   absolutely no doubt whether that extra Void# argument is required.

 * I renamed "wrapper" to "builder".  We have too may "wrappers"

 * In order to deal with typecchecking occurrences of P in expressions,
   I refactored the tcInferId code in TcExpr.

All of this allowed me to revert 5fe872
   "Apply compulsory unfoldings during desugaring, except for `seq` which is special."
which turned out to be a rather messy hack in DsBinds

4 years agoComments only
Simon Peyton Jones [Thu, 20 Nov 2014 17:16:30 +0000 (17:16 +0000)] 
Comments only

4 years agoRewrite Note [Deriving any class]
Joachim Breitner [Fri, 21 Nov 2014 10:07:40 +0000 (11:07 +0100)] 
Rewrite Note [Deriving any class]

Phrases like “Currently, you can...” are going to sound strange in a few
years; I rephrased the note to sound less like a proposal and more like
an explanation.

4 years agoRevert change to alias handling in ppLlvmGlobal introduced in d87fa34, which requires...
Luke Iannini [Fri, 21 Nov 2014 05:10:57 +0000 (21:10 -0800)] 
Revert change to alias handling in ppLlvmGlobal introduced in d87fa34, which requires LLVM 3.6.

Signed-off-by: Austin Seipp <austin@well-typed.com>
4 years agoUnbreak build (fallout from 067f1e4f20e)
Austin Seipp [Fri, 21 Nov 2014 06:23:40 +0000 (00:23 -0600)] 
Unbreak build (fallout from 067f1e4f20e)

Signed-off-by: Austin Seipp <austin@well-typed.com>
4 years agoImplement #5462 (deriving clause for arbitrary classes)
Jose Pedro Magalhaes [Fri, 21 Nov 2014 04:41:28 +0000 (22:41 -0600)] 
Implement #5462 (deriving clause for arbitrary classes)

Summary: (this has been submitted on behalf on @dreixel)

Reviewers: simonpj, hvr, austin

Reviewed By: simonpj, austin

Subscribers: goldfire, thomie, carter, dreixel

Differential Revision: https://phabricator.haskell.org/D476

GHC Trac Issues: #5462

4 years agoAdd flag `-fwarn-missing-exported-sigs`
Eric Seidel [Fri, 21 Nov 2014 04:39:32 +0000 (22:39 -0600)] 
Add flag `-fwarn-missing-exported-sigs`

Summary: add `-fwarn-missing-exported-sigs` to only warn about missing signatures if the name is exported

Test Plan: validate, see testsuite/tests/warnings/should_compile/T2526.hs

Reviewers: ezyang, austin, thomie

Reviewed By: austin, thomie

Subscribers: ezyang, thomie, carter

Differential Revision: https://phabricator.haskell.org/D482

GHC Trac Issues: #2526

Conflicts:
docs/users_guide/7.10.1-notes.xml

4 years agoExport scanl' from Data.OldList and Data.List
David Feuer [Fri, 21 Nov 2014 04:38:57 +0000 (22:38 -0600)] 
Export scanl' from Data.OldList and Data.List

Summary: Fixes #9368

Reviewers: nomeata, hvr, ekmett, austin

Reviewed By: ekmett, austin

Subscribers: thomie, carter

Differential Revision: https://phabricator.haskell.org/D498

GHC Trac Issues: #9368

4 years agoHide `Data.OldList` module
Herbert Valerio Riedel [Fri, 21 Nov 2014 04:21:06 +0000 (22:21 -0600)] 
Hide `Data.OldList` module

Summary:
The `Data.OldList` module was originally created in
3daf0023d2dcf7caf85d61f2dc177f8e9421b2fd to provide a way to access the
original list-specialised functions from `Data.List`. It was also made
an exposed module in order to facilitate adapting the
`haskell2010`/`haskell98` packages. However, since the
`haskell2010`/`haskell98` packages were dropped, we no longer need to
expose `Data.OldList`.

Depends on D511

Reviewers: ekmett, austin

Reviewed By: ekmett, austin

Subscribers: thomie, carter

Differential Revision: https://phabricator.haskell.org/D513

4 years agoDelete old-{time,locale} and haskell{98,2010}
Austin Seipp [Thu, 20 Nov 2014 19:30:56 +0000 (13:30 -0600)] 
Delete old-{time,locale} and haskell{98,2010}

Summary:
Depends on D510. This is the final blow and removes them from
the tree completely.

Signed-off-by: Austin Seipp <austin@well-typed.com>
Test Plan: I looked really hard but didn't see them.

Reviewers: hvr, ekmett

Subscribers: thomie, carter

Differential Revision: https://phabricator.haskell.org/D511

GHC Trac Issues: #9590

4 years agoDon't build old-{time,locale} and haskell{98,2010}
Austin Seipp [Fri, 21 Nov 2014 03:29:04 +0000 (21:29 -0600)] 
Don't build old-{time,locale} and haskell{98,2010}

Summary:
As discussed on ghc-devs@haskell.org and the trac ticket, we're removing
these packages from the 7.10 release as they no longer work correctly,
and can't easily be made to properly follow the standard as `base`
changes over time.

This does not remove the packages from the tree, only the build system.

https://www.haskell.org/pipermail/ghc-devs/2014-November/007357.html

Signed-off-by: Austin Seipp <austin@well-typed.com>
Test Plan: iiam

Reviewers: hvr, ekmett

Reviewed By: hvr, ekmett

Subscribers: thomie, carter

Differential Revision: https://phabricator.haskell.org/D510

GHC Trac Issues: #9590

4 years agoTest #9109 in typecheck/should_fail/T9109
Richard Eisenberg [Tue, 18 Nov 2014 20:19:20 +0000 (15:19 -0500)] 
Test #9109 in typecheck/should_fail/T9109

4 years agoUpdate manual to get rid of bogus `coerce` example (#9788)
Richard Eisenberg [Tue, 18 Nov 2014 19:22:30 +0000 (14:22 -0500)] 
Update manual to get rid of bogus `coerce` example (#9788)

4 years agoTest #9201 in typecheck/should_fail/T9201
Richard Eisenberg [Tue, 18 Nov 2014 18:19:42 +0000 (13:19 -0500)] 
Test #9201 in typecheck/should_fail/T9201

4 years agoTest #9318 in typecheck/should_fail/T9318
Richard Eisenberg [Tue, 18 Nov 2014 18:16:01 +0000 (13:16 -0500)] 
Test #9318 in typecheck/should_fail/T9318

4 years agoAdd release notes for #8100, #9527, and #9064.
Richard Eisenberg [Wed, 12 Nov 2014 20:13:34 +0000 (15:13 -0500)] 
Add release notes for #8100, #9527, and #9064.

4 years agoTest #9151 in typecheck/should_compile/T9151.
Richard Eisenberg [Wed, 12 Nov 2014 19:48:25 +0000 (14:48 -0500)] 
Test #9151 in typecheck/should_compile/T9151.

This test case should pass right now -- the bug is fixed,
presumably by #9200.

4 years agoFix #9220 by adding role annotations.
Richard Eisenberg [Fri, 7 Nov 2014 22:34:59 +0000 (17:34 -0500)] 
Fix #9220 by adding role annotations.

This includes a submodule update for `array`.
There is also an added test in libraries/array/tests/T9220.

4 years agoFix #9209, by reporting an error instead of panicking on bad splices.
Richard Eisenberg [Mon, 3 Nov 2014 18:49:59 +0000 (13:49 -0500)] 
Fix #9209, by reporting an error instead of panicking on bad splices.

4 years agoTest #9209 in th/T9209
Richard Eisenberg [Mon, 3 Nov 2014 18:46:58 +0000 (13:46 -0500)] 
Test #9209 in th/T9209

4 years agoKill trailing whitespace
Jan Stolarek [Thu, 20 Nov 2014 16:41:10 +0000 (17:41 +0100)] 
Kill trailing whitespace

4 years agoSplit SynTyCon to SynonymTyCon and FamilyTyCon
Jan Stolarek [Wed, 19 Nov 2014 21:03:05 +0000 (22:03 +0100)] 
Split SynTyCon to SynonymTyCon and FamilyTyCon

This patch refactors internal representation of type synonyms and type families by splitting them into two separate data constructors of TyCon data type. The main motivation is is that some fields make sense only for type synonyms and some make sense only for type families. This will be even more true with the upcoming injective type families.

There is also some refactoring of names to keep the naming constistent. And thus tc_kind field has become tyConKind and tc_roles has become tcRoles. Both changes are not visible from the outside of TyCon module.

Updates haddock submodule

Reviewers: simonpj

Differential Revision: https://phabricator.haskell.org/D508

GHC Trac Issues: #9812

4 years agoImplement typechecker plugins
Adam Gundry [Thu, 20 Nov 2014 13:32:26 +0000 (13:32 +0000)] 
Implement typechecker plugins

Summary:
See https://ghc.haskell.org/trac/ghc/wiki/Plugins/TypeChecker

This is based on work by Iavor Diatchki and Eric Seidel.

Test Plan: validate

Reviewers: simonpj, austin

Reviewed By: austin

Subscribers: gridaphobe, yav, thomie, carter

Differential Revision: https://phabricator.haskell.org/D489

Conflicts:
docs/users_guide/7.10.1-notes.xml

4 years agoAdd support for pattern synonym type signatures.
Dr. ERDI Gergo [Thu, 20 Nov 2014 14:38:11 +0000 (22:38 +0800)] 
Add support for pattern synonym type signatures.
Syntax is of the form

    pattern P :: (Prov b) => (Req a) => a -> b -> Int -> T a

which declares a pattern synonym called `P`, with argument types `a`, `b`,
and `Int`, and result type `T a`, with provided context `(Prov b)` and required
context `(Req a)`.

The Haddock submodule is also updated to use this new syntax in generated docs.

4 years agoUpdate shift/reduce conflict number in parser
Dr. ERDI Gergo [Thu, 20 Nov 2014 10:21:30 +0000 (18:21 +0800)] 
Update shift/reduce conflict number in parser

4 years agoMake Data.Functor.Identity trustworthy again
Herbert Valerio Riedel [Thu, 20 Nov 2014 08:53:46 +0000 (09:53 +0100)] 
Make Data.Functor.Identity trustworthy again

Alas `{-# LANGUAGE Safe #-}` can't be used since `Data.Coerce` isn't "safe".
However, we use `coerce` just as an optimisation
(see also 4ba884bdd3a9521ea92fcda8f601a7d0f3537bc1 which broke the
safe-inferred status of `Data.Functor.Identity`), so this module at least
deserves `{-# LANGUAGE Trustworthy #-}`.

NOTE: `Data.Functor.Identity` was added to `base` in the context of #9664

Reviewed By: luite

Differential Revision: https://phabricator.haskell.org/D507

4 years agoMake calling conventions in template haskell Syntax.hs consistent with those in ghc...
Luite Stegeman [Thu, 20 Nov 2014 00:38:58 +0000 (18:38 -0600)] 
Make calling conventions in template haskell Syntax.hs consistent with those in ghc ForeignCall.hs
this impliments #9703 from ghc trac

Test Plan: still needs tests

Reviewers: cmsaperstein, ekmett, goldfire, austin

Reviewed By: goldfire, austin

Subscribers: goldfire, thomie, carter, simonmar

Differential Revision: https://phabricator.haskell.org/D353

GHC Trac Issues: #9703

4 years agoghc generates more user-friendly error messages
Mike Izbicki [Thu, 20 Nov 2014 00:29:37 +0000 (18:29 -0600)] 
ghc generates more user-friendly error messages

Test Plan: Compiled ghc fine.  Opened ghci and fed it invalid code.  It gave the improved error messages in response.

Reviewers: austin

Subscribers: thomie, simonpj, spacekitteh, rwbarton, simonmar, carter

Differential Revision: https://phabricator.haskell.org/D201

4 years agoarm64: 64bit iOS and SMP support (#7942)
Luke Iannini [Wed, 19 Nov 2014 23:23:35 +0000 (17:23 -0600)] 
arm64: 64bit iOS and SMP support (#7942)

Signed-off-by: Austin Seipp <austin@well-typed.com>
4 years agocompiler/main: fixes #9776
Carlos Tomé [Wed, 19 Nov 2014 23:07:53 +0000 (17:07 -0600)] 
compiler/main: fixes #9776

Test Plan: test T9776 under tests/driver

Reviewers: jstolarek, austin

Reviewed By: jstolarek, austin

Subscribers: jstolarek, thomie, carter

Differential Revision: https://phabricator.haskell.org/D503

GHC Trac Issues: #9776

4 years agouse correct word size for shiftRightLogical and removeOp32
Luite Stegeman [Wed, 19 Nov 2014 23:00:49 +0000 (17:00 -0600)] 
use correct word size for shiftRightLogical and removeOp32

Summary:
shiftRightLogical used a host sized Word for the intermediate value,
which would produce the wrong result when cross compiling to a target
with a different word size than the host.

removeOp32 used the preprocessor to bake in word size assumptions,
rather than getting the target word size from DynFlags

Test Plan: validate

Reviewers: hvr, rwbarton, carter, austin

Reviewed By: austin

Subscribers: thomie, carter

Differential Revision: https://phabricator.haskell.org/D502

GHC Trac Issues: #9736

4 years agomake TcRnMonad.lhs respect -ddump-to-file
Greg Weber [Wed, 19 Nov 2014 22:43:26 +0000 (16:43 -0600)] 
make TcRnMonad.lhs respect -ddump-to-file

Summary: allows things such as: -ddump-to-file -ddump-splices

Test Plan:
compile with flags -ddump-to-file -ddump-splices
verify that it does output an extra file

Try out other flags.
I noticed that with -ddump-tc there is some output going to file and some to stdout.

Reviewers: hvr, austin

Reviewed By: austin

Subscribers: simonpj, thomie, carter

Differential Revision: https://phabricator.haskell.org/D460

GHC Trac Issues: #9126

4 years agoAllow -dead_strip linking on platforms with .subsections_via_symbols
Moritz Angermann [Wed, 19 Nov 2014 22:38:22 +0000 (16:38 -0600)] 
Allow -dead_strip linking on platforms with .subsections_via_symbols

Summary:
This allows to link objects produced with the llvm code generator to be linked with -dead_strip. This applies to at least the iOS cross compiler and OS X compiler.

Signed-off-by: Moritz Angermann <moritz@lichtzwerge.de>
Test Plan: Create a ffi library and link it with -dead_strip. If the resulting binary does not crash, the patch works as advertised.

Reviewers: rwbarton, simonmar, hvr, dterei, mzero, ezyang, austin

Reviewed By: dterei, ezyang, austin

Subscribers: thomie, mzero, simonmar, ezyang, carter

Differential Revision: https://phabricator.haskell.org/D206

4 years agoOnly test for bug #9439 when llvm is installed
Thomas Miedema [Wed, 19 Nov 2014 04:23:27 +0000 (22:23 -0600)] 
Only test for bug #9439 when llvm is installed

Reviewers: bgamari, austin

Reviewed By: austin

Subscribers: thomie, carter

Differential Revision: https://phabricator.haskell.org/D500

GHC Trac Issues: #9807

4 years agoadd missing instances for Loc and a few missing Eq instances
Luite Stegeman [Wed, 19 Nov 2014 04:21:44 +0000 (22:21 -0600)] 
add missing instances for Loc and a few missing Eq instances

Summary: This adds a few missing instances that can be automatically derived

Reviewers: hvr, goldfire, austin

Reviewed By: goldfire, austin

Subscribers: thomie, carter

Differential Revision: https://phabricator.haskell.org/D495

4 years agotemplate-haskell: Missing instances for Rational and ().
Mathieu Boespflug [Wed, 19 Nov 2014 04:21:15 +0000 (22:21 -0600)] 
template-haskell: Missing instances for Rational and ().

Test Plan: ./validate

Reviewers: austin

Reviewed By: austin

Subscribers: thomie, carter

Differential Revision: https://phabricator.haskell.org/D492

4 years agoFilter input to abiHash early
Mateusz Kowalczyk [Wed, 19 Nov 2014 04:21:03 +0000 (22:21 -0600)] 
Filter input to abiHash early

Summary:
This is already done near the only call site so why not. It is ugly to
see it at 'abiHash' itself.

Test Plan: validate

Reviewers: austin

Reviewed By: austin

Subscribers: thomie, carter

Differential Revision: https://phabricator.haskell.org/D491

4 years agoAdd remaining <unknown>s and comments to .mailmap
Thomas Miedema [Wed, 19 Nov 2014 04:20:14 +0000 (22:20 -0600)] 
Add remaining <unknown>s and comments to .mailmap

Summary:
All done, except for these 2 empty commits:

$ git log --author=unknown --use-mailmap --oneline
7e5c2b2 [project @ 2001-12-06 10:17:35 by mbs] Established under cvs.
6456598 [project @ 2000-12-01 10:33:41 by cryder] Initial revision

Reviewers: hvr, austin

Reviewed By: austin

Subscribers: thomie, carter

Differential Revision: https://phabricator.haskell.org/D477

4 years agoTurn CoreWriter into a newtype; fix comment
David Feuer [Wed, 19 Nov 2014 04:19:46 +0000 (22:19 -0600)] 
Turn CoreWriter into a newtype; fix comment

Summary:
Turn CoreWriter into a newtype. A comment claimed something is forced
before returning, but it's actually not. Change comment to match
reality.

Reviewers: xich, simonpj, ezyang, austin

Reviewed By: ezyang, austin

Subscribers: thomie, carter

Differential Revision: https://phabricator.haskell.org/D453

4 years agoImplement new Foldable methods for HsPatSynDetails
David Feuer [Wed, 19 Nov 2014 04:18:57 +0000 (22:18 -0600)] 
Implement new Foldable methods for HsPatSynDetails

Summary: Also explicitly define foldl1 and foldr1, which should generally work better with list-specific versions.

Reviewers: austin

Reviewed By: austin

Subscribers: rwbarton, thomie, carter

Differential Revision: https://phabricator.haskell.org/D430

4 years agoUpdate documentation for "Batch compiler mode"
Thomas Miedema [Wed, 19 Nov 2014 04:18:43 +0000 (22:18 -0600)] 
Update documentation for "Batch compiler mode"

Summary:
Since commit 7828bf3ea2ea34e7a3a8662f5f621ef706ffee5c
* --make is the default
* -c is a mode flag, except when used in combination with --make

Also:
* -C (generate C code) is only available in unregisterised mode.

Reviewers: austin

Reviewed By: austin

Subscribers: thomie, carter

Differential Revision: https://phabricator.haskell.org/D427

4 years agoRefactor: use System.FilePath.splitSearchPath
Thomas Miedema [Wed, 19 Nov 2014 04:17:47 +0000 (22:17 -0600)] 
Refactor: use System.FilePath.splitSearchPath

Summary:
To address #2521 ("Trailing colon on GHC_PACKAGE_PATH doesn't work with
ghc-pkg"), we were using a custom version of splitSearchPath (e4f46f5de). This
solution however caused issue #9698 ("GHC_PACKAGE_PATH should be more lenient
for empty paths").

This patch reverts back to System.FilePath.splitSearchPath (fixes #9698) and
adresses (#2521) by testing for a trailing search path separators explicitly
(instead of implicitly using empty search path elements).

Empty paths are now allowed (ignored on Windows, interpreted as current
directory on Posix systems), and trailing path separator still tack on the
user and system package databases.

Also update submodule filepath, which has a version of splitSearchPath which
handles quotes in the same way as our custom version did.

Test Plan:
$ GHC_PACKAGE_PATH=/::/home: ./ghc-pkg list
...
db stack: ["/",".","/home","<userdb>","<systemdb>"]
...

Reviewers: austin

Reviewed By: austin

Subscribers: thomie, carter, simonmar

Differential Revision: https://phabricator.haskell.org/D414

GHC Trac Issues: #2521, #9698

4 years agoThe test runner now also works under the msys-native Python.
Gintautas Miliauskas [Mon, 22 Sep 2014 21:10:56 +0000 (23:10 +0200)] 
The test runner now also works under the msys-native Python.

Msys binaries apply heuristics to escape paths in arguments intended for
non-msys binaries, which breaks timeout invocations, see #9626.

Signed-off-by: Austin Seipp <austin@well-typed.com>
4 years agorts: remove old-style field designator extension (#9396)
Austin Seipp [Wed, 19 Nov 2014 03:21:47 +0000 (21:21 -0600)] 
rts: remove old-style field designator extension (#9396)

Authored-by: jrp
Signed-off-by: Austin Seipp <austin@well-typed.com>
4 years agoOptimise `Identity` instances with `coerce`
Herbert Valerio Riedel [Wed, 19 Nov 2014 10:44:37 +0000 (11:44 +0100)] 
Optimise `Identity` instances with `coerce`

This also overrides all optional `Foldable` methods
(which would otherwise be default-implemented in terms of `foldMap`)
with supposedly optimally minimal implementations.

While at it, this also removes the redundant `{-# LANGUAGE CPP #-}`.

Reviewed By: austin, dfeuer

Differential Revision: https://phabricator.haskell.org/D467

4 years agoRestore exact old semantics of `decodeFloat`
Herbert Valerio Riedel [Wed, 19 Nov 2014 10:09:33 +0000 (11:09 +0100)] 
Restore exact old semantics of `decodeFloat`

`integer-gmp2` uses the new 64bit-based IEEE deconstructing primop
introduced in b62bd5ecf3be421778e4835010b6b334e95c5a56.

However, the returned values differ for exceptional IEEE values:

Previous (expected) semantics:

  > decodeFloat (-1/0)
  (-4503599627370496,972)

  > decodeFloat (1/0)
  (4503599627370496,972)

  > decodeFloat (0/0)
  (-6755399441055744,972)

Currently (broken) semantics:

  > decodeFloat (-1/0 :: Double)
  (-9223372036854775808,-53)

  > decodeFloat (1/0 :: Double)
  (-9223372036854775808,-53)

  > decodeFloat (0/0 :: Double)
  (-9223372036854775808,-53)

This patch reverts to the old expected semantics.

I plan to revisit the implementation during GHC 7.11 development.

This should address #9810

Reviewed By: austin, ekmett, luite

Differential Revision: https://phabricator.haskell.org/D486