[GHC] #11391: TypeError is fragile

GHC ghc-devs at haskell.org
Wed Jan 13 22:00:34 UTC 2016


#11391: TypeError is fragile
-------------------------------------+-------------------------------------
        Reporter:  bgamari           |                Owner:  diatchki
            Type:  bug               |               Status:  new
        Priority:  high              |            Milestone:  8.0.1
       Component:  Compiler (Type    |              Version:  8.0.1-rc1
  checker)                           |             Keywords:
      Resolution:                    |  CustomTypeErrors
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Incorrect         |  Unknown/Multiple
  warning at compile-time            |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #9637             |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 Great work Iavor, thanks.

 Always mention the ticket in the commit message!  Then the ticket appears
 in the Trac ticket automatically.

 Also, could you add a regression test pls?  (And update the "Test Case"
 field of the ticket appropriately.)

 Manually, the commit is
 {{{
 commit 6ea24af9f22f6ea661d79623135f4cd31e28c6a2
 Author: Iavor S. Diatchki <diatchki at galois.com>
 Date:   Wed Jan 13 11:30:40 2016 -0800

     Handle over-applied custom type errors too.

     Consider

         type family F :: Type -> Type where
            F = TypeError (Text "Error")

     Now, if we see something like `F Int` we should still report the
 custom
     type error.


 >---------------------------------------------------------------

 6ea24af9f22f6ea661d79623135f4cd31e28c6a2
  compiler/typecheck/TcRnTypes.hs | 6 +++---
  compiler/types/Type.hs          | 5 ++++-
  2 files changed, 7 insertions(+), 4 deletions(-)

 diff --git a/compiler/typecheck/TcRnTypes.hs
 b/compiler/typecheck/TcRnTypes.hs
 index 6beff7f..430a97d 100644
 --- a/compiler/typecheck/TcRnTypes.hs
 +++ b/compiler/typecheck/TcRnTypes.hs
 @@ -1733,9 +1733,9 @@ isTypeHoleCt (CHoleCan { cc_hole = TypeHole }) =
 True
  isTypeHoleCt _ = False

  -- | The following constraints are considered to be a custom type error:
 ---    1. TypeError msg
 ---    2. TypeError msg ~ Something  (and the other way around)
 ---    3. C (TypeError msg)          (for any parameter of class
 constraint)
 +--    1. TypeError msg a b c
 +--    2. TypeError msg a b c ~ Something (and the other way around)
 +--    4. C (TypeError msg a b c)         (for any parameter of class
 constraint)
  getUserTypeErrorMsg :: Ct -> Maybe Type
  getUserTypeErrorMsg ct
    | Just (_,t1,t2) <- getEqPredTys_maybe ctT    = oneOf [t1,t2]
 diff --git a/compiler/types/Type.hs b/compiler/types/Type.hs
 index 6a86f70..c727da6 100644
 --- a/compiler/types/Type.hs
 +++ b/compiler/types/Type.hs
 @@ -707,7 +707,10 @@ isStrLitTy _                    = Nothing
  -- If so, give us the kind and the error message.
  userTypeError_maybe :: Type -> Maybe Type
  userTypeError_maybe t
 -  = do { (tc, [_kind, msg]) <- splitTyConApp_maybe t
 +  = do { (tc, _kind : msg : _) <- splitTyConApp_maybe t
 +          -- There may be more than 2 arguments, if the type error is
 +          -- used as a type constructor (e.g. at kind `Type -> Type`).
 +
         ; guard (tyConName tc == errorMessageTypeErrorFamName)
         ; return msg }
  }}}

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11391#comment:8>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list