1. 05 Sep, 2017 1 commit
  2. 02 Sep, 2017 2 commits
    • Ryan Scott's avatar
      Fix #14167 by using isGadtSyntaxTyCon in more places · 8e4229ab
      Ryan Scott authored
      Two places in GHC effectively attempt to //guess// whether a data type
      was declared using GADT syntax:
      1. When reifying a data type in Template Haskell
      2. When pretty-printing a data type (e.g., via `:info` in GHCi)
      But there's no need for heuristics here, since we have a 100% accurate way to
      determine whether a data type was declared using GADT syntax: the
      `isGadtSyntaxTyCon` function! By simply using that as the metric, we obtain
      far more accurate TH reification and pretty-printing results.
      This is technically a breaking change, since Template Haskell reification will
      now reify some data type constructors as `(Rec)GadtC` that it didn't before,
      and some data type constructors that were previously reified as `(Rec)GadtC`
      will no longer be reified as such. But it's a very understandable breaking
      change, since the previous behavior was simply incorrect.
      Test Plan: ./validate
      Reviewers: simonpj, goldfire, austin, bgamari
      Reviewed By: simonpj
      Subscribers: rwbarton, thomie
      GHC Trac Issues: #14167
      Differential Revision: https://phabricator.haskell.org/D3901
    • Ryan Scott's avatar
      Disallow bang/lazy patterns in the RHSes of implicitly bidirectional patsyns · 5dd6b13c
      Ryan Scott authored
      GHC was allowing implicitly bidirectional pattern synonyms with bang
      patterns and irrefutable patterns in the RHS, like so:
      pattern StrictJust a = Just !a
      This has multiple problems:
      1. `Just !a` isn't a valid expression, so it feels strange to allow it in an
         implicitly bidirectional pattern synonym.
      2. `StrictJust` doesn't provide the strictness properties one would expect
         from a strict constructor. (One could imagine a design where the
         `StrictJust` builder infers a bang pattern for its pattern variable, but
         accomplishing this inference in a way that accounts for all possible
         patterns on the RHS, including other pattern synonyms, is somewhat
         awkward, so we do not pursue this design.)
      We nip these issues in the bud by simply disallowing bang/irrefutable patterns
      on the RHS.
      Test Plan: make test TEST="T14112 unidir"
      Reviewers: simonpj, austin, bgamari
      Reviewed By: simonpj
      Subscribers: rwbarton, thomie
      GHC Trac Issues: #14112
      Differential Revision: https://phabricator.haskell.org/D3896
  3. 01 Sep, 2017 1 commit
  4. 31 Aug, 2017 4 commits
    • Herbert Valerio Riedel's avatar
      Add missing Semigroup instances to compiler · c0feee90
      Herbert Valerio Riedel authored
      This is a pre-requisite for implementing the Semigroup/Monoid proposal.
      The instances have been introduced in a way to minimise warnings.
    • Simon Peyton Jones's avatar
      Really fix Trac #14158 · 2c133b67
      Simon Peyton Jones authored
      I dug more into how #14158 started working. I temporarily reverted the
      patch that "fixed" it, namely
          commit a6c448b4
          Author: Simon Peyton Jones <simonpj@microsoft.com>
          Date:   Mon Aug 28 17:33:59 2017 +0100
          Small refactor of getRuntimeRep
      Sure enough, there was a real bug, described in the new
      TcExpr Note [Visible type application zonk]
      In general, syntactic substituion should be kind-preserving!
      Maybe we should check that invariant...
    • Simon Peyton Jones's avatar
      Small changes to ddump-tc tracing · 3790ea90
      Simon Peyton Jones authored
    • Simon Peyton Jones's avatar
      Add debugPprType · 805b29bb
      Simon Peyton Jones authored
      We pretty-print a type by converting it to an IfaceType and
      pretty-printing that.  But
       (a) that's a bit indirect, and
       (b) delibrately loses information about (e.g.) the kind
            on the /occurrences/ of a type variable
      So this patch implements debugPprType, which pretty prints
      the type directly, with no fancy formatting.  It's just used
      for debugging.
      I took the opportunity to refactor the debug-pretty-printing
      machinery a little.  In particular, define these functions
      and use them:
        ifPprDeubug :: SDoc -> SDOc -> SDoc
          -- Says what to do with and without -dppr-debug
        whenPprDebug :: SDoc -> SDoc
          -- Says what to do with  -dppr-debug; without is empty
        getPprDebug :: (Bool -> SDoc) -> SDoc
      getPprDebug used to be called sdocPprDebugWith
      whenPprDebug used to be called ifPprDebug
      So a lot of files get touched in a very mechanical way
  5. 30 Aug, 2017 3 commits
    • Simon Peyton Jones's avatar
      Define and use HsArg · fca19628
      Simon Peyton Jones authored
      All this Left/Right business was making my head spin, so I defined
      data HsArg tm ty
        = HsValArg tm   -- Argument is an ordinary expression     (f arg)
        | HsTypeArg  ty -- Argument is a visible type application (f @ty)
      and used it.  This is just simple refactor; no change in behaviour.
    • Simon Peyton Jones's avatar
      Add comments to RnTypes · 628b6669
      Simon Peyton Jones authored
      These comments clarify the details of:
        commit 0257dacf
        Author: Simon Peyton Jones <simonpj@microsoft.com>
        Date:   Mon Aug 28 14:20:02 2017 +0100
            Refactor bindHsQTyVars and friends
    • Simon Peyton Jones's avatar
      Add some traceRn and (Outputable StmtTree) · 567dca6e
      Simon Peyton Jones authored
      I added these when investigating Trac #14163, but they'll be
      useful anyway.
  6. 29 Aug, 2017 21 commits
    • Ben Gamari's avatar
      Add a Note describing #14128 · 6f1ccaa5
      Ben Gamari authored
      I prematurely committed the D3892 before adding a Note. Fix this.
    • James Michael DuPont's avatar
      HsExpr: Fix typo · 15615254
      James Michael DuPont authored
    • Ben Gamari's avatar
      StgLint: Give up on trying to compare types · f17f1063
      Ben Gamari authored
      We used to try a crude comparison of the type themselves, but this is
      essentially impossible in STG as we have discarded. both casts and type
      applications, so types might look different but be the same.  Now we
      simply compare their runtime representations.
      See #14120.
      Reviewers: austin
      Subscribers: rwbarton, thomie
      GHC Trac Issues: #14120
      Differential Revision: https://phabricator.haskell.org/D3879
    • Ben Gamari's avatar
      StgLint: Enforce MultiValAlt liveness invariant only after unariser · a36b34c4
      Ben Gamari authored
      The unariser ensures that we never use case binders that are void,
      unboxed sums, or unboxed tuples. However, previously StgLint was
      enforcing this invariant even before the unariser was running, giving
      rise to spurious lint failures.  Fix this. Following CoreLint, we
      introduce a LintFlags environment to the linter monad, allowing for
      additional flags to be easily accomodated in the future.
      See #14118.
      Test Plan: Build GHC with -dstg-lint
      Reviewers: simonpj, austin
      Subscribers: rwbarton, thomie
      GHC Trac Issues: #14118
      Differential Revision: https://phabricator.haskell.org/D3889
    • Ben Gamari's avatar
      StgLint: Show type of out-of-scope binders · 651b4dc7
      Ben Gamari authored
      Reviewers: austin
      Subscribers: rwbarton, thomie
      Differential Revision: https://phabricator.haskell.org/D3887
    • Ben Gamari's avatar
      nativeGen: Don't index into linked lists · 9d57d8c1
      Ben Gamari authored
      There were a couple places where we indexed into linked lists of
      register names.  Replace these with arrays.
      Reviewers: austin
      Subscribers: rwbarton, thomie
      Differential Revision: https://phabricator.haskell.org/D3893
    • Tamar Christina's avatar
      Fix decomposition error on Windows · 3c6b2fc3
      Tamar Christina authored
      Fix the path decomposition error that occurs when the Symlink resolver
      fails. `Win32.try` throws an exception, so catch it and assume the path
      isn't a symlink to use the old behavior.
      Test Plan: ./validate
      Reviewers: austin, bgamari
      Reviewed By: bgamari
      Subscribers: rwbarton, thomie
      GHC Trac Issues: #14159
      Differential Revision: https://phabricator.haskell.org/D3891
    • Ryan Scott's avatar
      Refactor type family instance abstract syntax declarations · 895a7650
      Ryan Scott authored
      This implements @simonpj's suggested refactoring of the abstract syntax
      for type/data family instances (from
      https://ghc.haskell.org/trac/ghc/ticket/14131#comment:9). This combines
      the previously separate `TyFamEqn` and `DataFamInstDecl` types into a
      single `FamEqn` datatype. This also factors the `HsImplicitBndrs` out of
      `HsTyPats` in favor of putting them just outside of `FamEqn` (as opposed
      to before, where all of the implicit binders were embedded inside of
      `TyFamEqn`/`DataFamInstDecl`). Finally, along the way I noticed that
      `dfid_fvs` and `tfid_fvs` were completely unused, so I removed them.
      Aside from some changes in parser test output, there is no change in
      Requires a Haddock submodule commit from my fork (at
      Test Plan: ./validate
      Reviewers: simonpj, austin, goldfire, bgamari, alanz
      Reviewed By: bgamari
      Subscribers: mpickering, goldfire, rwbarton, thomie, simonpj
      GHC Trac Issues: #14131
      Differential Revision: https://phabricator.haskell.org/D3881
    • Tamar Christina's avatar
      Remove dll-split. · 5266ab90
      Tamar Christina authored
      This patch removes dll-split from the code base, the reason is dll-split
      no longer makes any sense. It was designed to split a dll in two, but we
      now already have many more symbols than would fit inside two dlls. So we
      need a third one. This means there's no point in having to maintain this
      list as it'll never work anyway and the solution isn't scalable.
      Test Plan: ./validate
      Reviewers: austin, bgamari
      Reviewed By: bgamari
      Subscribers: rwbarton, thomie, #ghc_windows_task_force
      GHC Trac Issues: #5987
      Differential Revision: https://phabricator.haskell.org/D3882
    • Ben Gamari's avatar
      desugar: Ensure that a module's dep_orphs doesn't contain itself · db3a8e16
      Ben Gamari authored
      Consider that we have two modules, A and B, both with hs-boot files,
        * A.hs contains a SOURCE import of B
        * B.hs-boot contains a SOURCE import of A
        * A.hs-boot declares an orphan instance
        * A.hs defines the orphan instance
      In this case, B's dep_orphs will contain A due to its SOURCE import of
      A.  Consequently, A will contain itself in its imp_orphs due to its
      import of B.  This fact would end up being recorded in A's interface
      file. This would then break the invariant asserted by calculateAvails
      that a module does not itself in its dep_orphs. This was the cause
      of #14128.
      The solution is to remove self-references from imp_orphs when
      constructing dep_orphs; we already did a similar thing for dep_mods. I
      believe we should do the same for dep_finsts, although I'm treating this
      as a separate bug.
      Reviewers: austin
      Subscribers: rwbarton, thomie
      Differential Revision: https://phabricator.haskell.org/D3892
    • Simon Peyton Jones's avatar
      Add HasDebugStack for typeKind · aed7d431
      Simon Peyton Jones authored
      typeKind can fail, and it's called all over the place, so
      it's helpful to know where
    • Simon Peyton Jones's avatar
      Small refactor of getRuntimeRep · a6c448b4
      Simon Peyton Jones authored
      Instead of using a string argument, use HasDebugCallStack.
      (Oddly, some functions were using both!)
      Plus, use getRuntimeRep rather than getRuntimeRep_maybe when
      if the caller panics on Nothing. Less code, and a better debug
    • Simon Peyton Jones's avatar
    • Simon Peyton Jones's avatar
      Use a well-kinded substitution to instantiate · 4455c86d
      Simon Peyton Jones authored
      In tcDataConPat we were creating an ill-kinded substitution
      -- or at least one that is well kinded only after you have solved
      other equalities.  THat led to a crash, because the instantiated
      data con type was ill-kinded.
      This patch guarantees that the instantiating substitution is
      Fixed Trac #14154
    • Simon Peyton Jones's avatar
      Small refactoring of meta-tyvar cloning · 86e6a5f2
      Simon Peyton Jones authored
      No change in behaviour.
    • Simon Peyton Jones's avatar
      Refactor bindHsQTyVars and friends · 0257dacf
      Simon Peyton Jones authored
      This work was triggered by Trac #13738, which revealed to me that
      the code RnTypes.bindHsQTyVars and bindLHsTyVarBndrs was a huge
      tangled mess -- and outright wrong on occasion as the ticket showed.
      The big problem was that bindLHsTyVarBndrs (which is invoked at every
      HsForAll, including nested higher rank ones) was attempting to bind
      implicit kind variables, which it has absolutely no busineess doing.
      Imlicit kind quantification is done at the outside only, in fact
      precisely where we have HsImplicitBndrs or LHsQTyVars (which also
      has implicit binders).
      Achieving this move was surprisingly hard, because more and more
      barnacles had accreted aroud the original mistake.  It's much
      much better now.
      Summary of changes.  Almost all the action is in RnTypes.
      * Implicit kind variables are bound only by
        - By bindHsQTyVars, which deals with LHsQTyVars
        - By rnImplicitBndrs, which deals with HsImplicitBndrs
      * bindLHsTyVarBndrs, and bindLHsTyVarBndr are radically simplified.
        They simply does far less, and have lots their forest of
        incomprehensible accumulating parameters.  (To be fair, some of
        the code in bindLHsTyVarBndrs just moved to bindHsQTyVars, but
        in much more perspicuous form.)
      * The code that checks if a variable appears in both a kind and
        a type (triggering RnTypes.mixedVarsErr) was bizarre.  E.g.
        we had this in RnTypes.extract_hs_tv_bndrs
             ; check_for_mixed_vars bndr_kvs acc_tvs
             ; check_for_mixed_vars bndr_kvs body_tvs
             ; check_for_mixed_vars body_tvs acc_kvs
             ; check_for_mixed_vars body_kvs acc_tvs
             ; check_for_mixed_vars locals body_kvs
        I cleaned all this up; now we check for mixed use at binding
        sites only.
      * Checks for "Variable used as a kind before being bound", like
           data T (a :: k) k = rhs
        now just show up straightforwardly as "k is not in scope".
        See Note [Kind variable ordering]
      * There are some knock-on simplifications in RnSource.
    • Simon Peyton Jones's avatar
      Add TcRnMonad.unlessXOptM · 6f050d9c
      Simon Peyton Jones authored
      This usefully joins whenXOptM; there are probably lots of places
      we should use it!
      This patch does not use new new function at all; but it's preparing
      for an upcoming patch when I do use it.
    • Simon Peyton Jones's avatar
      A bit more -ddump-tc tracing · 547e4c03
      Simon Peyton Jones authored
    • Simon Peyton Jones's avatar
      Better debug-printing for Outputable TyConBinder · 8834d482
      Simon Peyton Jones authored
      Anon and Required were printed the same :-(.  This is only for
      debug printing, so I switched to a slightly more verbose and
      explicit format
    • Simon Peyton Jones's avatar
      Comments only · 6e0e0b0e
      Simon Peyton Jones authored
      Better comment on con_qvars in ConDecl
    • David Feuer's avatar
      Make parsed AST dump output lazily · 29da01e0
      David Feuer authored
      Previously, `showAstData` produced a `String`. That `String` would
      then be converted to a `Doc` using `text` to implement
      `-ddump-parsed-ast`. But rendering `text` calculates the length
      of the `String` before doing anything else. Since the AST can be
      very large, this was bad: the whole dump string (potentially hundreds
      of millions of `Char`s) was accumulated in memory.
      Now, `showAstData` produces a `Doc` directly, which seems to work
      a lot better. As an extra bonus, the code is simpler and cleaner.
      The formatting has changed a bit, as the previous ad hoc approach
      didn't really match the pretty printer too well. If someone cares
      enough to request adjustments, we can surely make them.
      Reviewers: austin, bgamari, mpickering, alanz
      Reviewed By: bgamari
      Subscribers: mpickering, rwbarton, thomie
      GHC Trac Issues: #14161
      Differential Revision: https://phabricator.haskell.org/D3894
  7. 25 Aug, 2017 6 commits
    • Ben Gamari's avatar
      Rip out mkUserGuidePart · 8f19c65c
      Ben Gamari authored
      Reviewers: austin, hvr
      Subscribers: rwbarton, thomie, erikd
      Differential Revision: https://phabricator.haskell.org/D3886
    • Simon Peyton Jones's avatar
    • Simon Peyton Jones's avatar
      Don't do the RhsCtxt thing for join points · 8649535c
      Simon Peyton Jones authored
      This minor change fixes Trac #14137.
      It is described in Note [Join point RHSs] in OccurAnal
    • Simon Peyton Jones's avatar
      Refactor the Mighty Simplifier · 33452dfc
      Simon Peyton Jones authored
      Triggered by #12150, and the knock-on effects of join points, I did a
      major refactoring of the Simplifier.  This is a big patch that change
      a lot of Simplify.hs: I did a lot of other re-organisation.
      The main event
      Since the dawn of time we have had
        simplExpr :: SimplEnv -> InExpr -> SimplCont
                  -> SimplM (SimplEnv, OutExpr)
      What's that SimplEnv in the result?  When simplifying an expression the
      simplifier add floated let-bindings to the SimplEnv, extending the
      in-scope set appropriately, and hence needs to resturn the SimplEnv at
      the end.  The mode, flags, substitution in the returned SimplEnv were
      all irrelevant: it was just the floating bindings.
      It's strange to accumulate part of the /result/ in the /environment/
      argument!  And indeed its leads to all manner of mysterious calls to
      zapFloats and transferring of floats from one SimplEnv to another.
      It got worse with join points, so I finally bit the bullet and refactored.
      Now we have
        simplExpr :: SimplEnv -> InExpr -> SimplCont
                  -> SimplM (SimplFloats, OutExpr)
        -- See Note [The big picture]
      and the SimplEnv no longer has floats in it.  The code is no shorter,
      but it /is/ easier to understand.
      Main changes
      * Remove seLetFloats field from SimplEnv
      * Define new data type SimplFloats, and functions over it
      * Change the types of simplExpr, simplBind, and their many variants,
        to follow the above plan
      Bottoming bindings
      I made one other significant change in SimplUtils (not just refactoring),
      related to Trac #12150 comment:16.  Given
        x = <rhs>
      where <rhs> turns out to be a bottoming expression, propagate that
      information to x's IdInfo immediately.  That's always good, because
      it makes x be inlined less (we don't inline bottoming things), and
      it allows (case x of ...) to drop the dead alterantives immediately.
      Moreover, we are doing the analysis anyway, in tryEtaExpandRhs, which
      calls CoreArity.findRhsArity, which already does simple bottom analysis.
      So we are generating the information; all we need do is to atach the
      bottoming info to the IdInfo.
      See Note [Bottoming bindings]
      Smaller refactoring
      * Rename SimplifierMode to SimplMode
      * Put DynFlags as a new field in SimplMode, to make fewer
        monadic calls to getDynFlags.
      * Move the code in addPolyBind into abstractFloats
      * Move the "don't eta-expand join points" into tryEtaExpandRhs
    • Simon Peyton Jones's avatar
      Bottoming expressions should not be expandable · 407c11b8
      Simon Peyton Jones authored
      This patch changes isExpandableApp and isWorkFreeApp to respond
      False to bottoming applications.  I found that if we had
        x = undefined <dict-expr>
      then prepareRhs was ANF'ing it to
        d = <dict-expr>
        x = undefined d
      which is stupid (no gain); and worse it made the simplifier iterate
      indefinitely.  It showed up when I started marking 'x' as a bottoming
      Id more aggresssively than before; but it's been a lurking bug for
      It was convenient to make isWorkFreeApp also return False for
      bottoming applications, and I see no reason not to do so.
      That leaves isCheapApp.  It currently replies True to bottoming
      applications, but I don't see why that's good..  Something to try
    • Simon Peyton Jones's avatar
      Restrict exprOkForSpeculation/case to unlifted types · a0b7b100
      Simon Peyton Jones authored
        case x of y
          DEFAULT -> let v::Int# = case y of
                                     True  -> e1
                                     False -> e2
                      in ...
      Previously this would have been ok-for-speculation because
      y is evaluated.  But the binder-swap done
      by SetLevels would transform the inner alternative to
           DEFAULT -> let v::Int# = case x of { ... }
                      in ...)
      which does /not/ satisfy the let/app invariant, because x is
      not evaluated.
      I don't know why this has never bitten us before, but it began
      to bite when I did upcoming refactoring of the Simplifier.
      So this patch narrows exprOkForSpeculation to only work for
      /unlifted/ cases.
      To make this work I had to make exprOkForSpeculation non-polymorphic
      in the binder type, which has a little knock-on for is use in
      (It's annoying that we need to handle cases at all, but see
       Note [exprOkForSpeculation: case expressions])
  8. 24 Aug, 2017 2 commits