#7264: Adding GHC's inferred type signatures to a working program can make it 
fail
with Rank2Types
---------------------------------+------------------------------------------
    Reporter:  guest             |       Owner:                  
        Type:  bug               |      Status:  new             
    Priority:  normal            |   Milestone:                  
   Component:  Compiler          |     Version:  7.4.1           
    Keywords:                    |          Os:  Unknown/Multiple
Architecture:  Unknown/Multiple  |     Failure:  None/Unknown    
  Difficulty:  Unknown           |    Testcase:                  
   Blockedby:                    |    Blocking:                  
     Related:                    |  
---------------------------------+------------------------------------------

Comment(by simonpj@…):

 commit 10f83429ba493699af95cb8c3b16d179d78b7749
 {{{
 Author: Simon Peyton Jones <simo...@microsoft.com>
 Date:   Wed Oct 31 09:08:39 2012 +0000

     Do not instantiate unification variables with polytypes

     Without -XImpredicativeTypes, the typing rules say that a function
     should be instantiated only at a *monotype*.  In implementation terms,
     that means that a unification variable should not unify with a type
     involving foralls.  But we were not enforcing that rule, and that
     gave rise to some confusing error messages, such as
       Trac #7264, #6069

     This patch adds the test for foralls.  There are consequences

      * I put the test in occurCheckExpand, since that is where we see if a
        type can unify with a given unification variable.  So
        occurCheckExpand has to get DynFlags, so it can test for
        -XImpredicativeTypes

      * We want this to work
           foo :: (forall a. a -> a) -> Int
           foo = error "foo"
        But that means instantiating error at a polytype!  But error is
 special
        already because you can instantiate it at an unboxed type like
 Int#.
        So I extended the specialness to allow type variables of
 openTypeKind
        to unify with polytypes, regardless of -XImpredicativeTypes.

        Conveniently, this works in TcUnify.matchExpectedFunTys, which
 generates
        unification variable for the function arguments, which can be
 polymorphic.

      * GHC has a special typing rule for ($) (see Note [Typing rule
        for ($)] in TcExpr).  It unifies the argument and result with a
        unification variable to exclude unboxed types -- but that means I
        now need a kind of unificatdion variable that *can* unify with a
        polytype.

        So for this sole case I added PolyTv to the data type
 TcType.MetaInfo.
        I suspect we'll find mor uses for this, and the changes are tiny,
        but it still feel a bit of a hack.  Well the special rule for ($)
        is a hack!

     There were some consequential changes in error reporting (TcErrors).

  compiler/typecheck/TcCanonical.lhs |   21 +++---
  compiler/typecheck/TcErrors.lhs    |   62 +++++++++++++------
  compiler/typecheck/TcExpr.lhs      |    9 ++-
  compiler/typecheck/TcHsType.lhs    |   15 +++--
  compiler/typecheck/TcMType.lhs     |   10 +++-
  compiler/typecheck/TcType.lhs      |  118
 ++++++++++++++++++++++++-----------
  compiler/typecheck/TcUnify.lhs     |   79 +++++++++++++++++++-----
  7 files changed, 223 insertions(+), 91 deletions(-)
 }}}

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

_______________________________________________
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to