[GHC] #15954: LiberalTypeSynonyms unsaturation check doesn't kick in

GHC ghc-devs at haskell.org
Tue Nov 27 11:50:19 UTC 2018


#15954: LiberalTypeSynonyms unsaturation check doesn't kick in
-------------------------------------+-------------------------------------
        Reporter:  RyanGlScott       |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.6.3
       Component:  Compiler (Type    |              Version:  8.6.2
  checker)                           |
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC accepts       |  Unknown/Multiple
  invalid program                    |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by RyanGlScott):

 Thanks, I've implemented your suggestion. There are three error message
 regressions as a result, so I'd like your feedback on them.

 1. In `T15859`:

 {{{#!diff
 diff -uw "dependent/should_fail/T15859.run/T15859.stderr.normalised"
 "dependent/should_fail/T15859.run/T15859.comp.stderr.normalised"
 --- dependent/should_fail/T15859.run/T15859.stderr.normalised   2018-11-27
 06:38:24.627899584 -0500
 +++ dependent/should_fail/T15859.run/T15859.comp.stderr.normalised
 2018-11-27 06:38:24.635899818 -0500
 @@ -1,6 +1,7 @@

 -T15859.hs:13:5:
 -     Cannot apply expression of type ‘forall k -> k -> *’
 -      to a visible type argument ‘Int’
 +T15859.hs:13:19:
 +     Illegal polymorphic type: forall k -> k -> *
 +      Perhaps you intended to use LiberalTypeSynonyms
 +     In an expression type signature: KindOf A
 +      In the expression: undefined :: KindOf A
       In the expression: (undefined :: KindOf A) @Int
 -      In an equation for ‘a’: a = (undefined :: KindOf A) @Int
 }}}

    This one doesn't bother me much, since that code really ought to have
 been enabling `LiberalTypeSynonyms` in the first place (indeed,
 investigating that code is what led me to discovering this bug). I think
 I'll fix this by just enabling `LiberalTypeSynonyms` in the test case.

 2. In `T7809`:

 {{{#!diff
 diff -uw "typecheck/should_fail/T7809.run/T7809.stderr.normalised"
 "typecheck/should_fail/T7809.run/T7809.comp.stderr.normalised"
 --- typecheck/should_fail/T7809.run/T7809.stderr.normalised     2018-11-27
 06:42:45.604510107 -0500
 +++ typecheck/should_fail/T7809.run/T7809.comp.stderr.normalised
 2018-11-27 06:42:45.615510428 -0500
 @@ -1,6 +1,5 @@

  T7809.hs:8:8:
 -     Illegal polymorphic type: PolyId
 +     Illegal polymorphic type: forall a. a -> a
        GHC doesn't yet support impredicative polymorphism
 -     In the type signature:
 -        foo :: F PolyId
 +     In the type signature: foo :: F PolyId
 }}}

    This one is a bit concerning, since we've regressed from a nice error
 message about `PolyId` (which is what the user wrote) to instead
 mentioning `forall a. a -> a` (which requires the user to perform some
 detective work to figure out where it comes from). I haven't figured out
 yet why this happens (indeed, I'm surprised to see a type synonym being
 expanded //more// after this change).

 3. In `tc149`:

 {{{
 Compile failed (exit code 1) errors were:

 tc149.hs:8:8: error:
     • The type synonym ‘Id’ should have 1 argument, but has been given
 none
     • In the type signature: foo :: Generic Id Id
 }}}

    This is the most concerning one, since `tc149` is actually expected to
 //typecheck//! For the sake of reference, here is the source code for this
 test case:

 {{{#!hs
 {-# LANGUAGE RankNTypes #-}

 module ShouldCompile where

 type Generic i o = forall x. i x -> o x
 type Id x = x

 foo :: Generic Id Id
 foo = error "urk"

 -- The point here is that we instantiate "i" and "o"
 -- with a partially applied type synonym.  This is
 -- OK in GHC because we check type validity only *after*
 -- expanding type synonyms.
 --
 -- However, a bug in GHC 5.03-Feb02 made this break a
 -- type invariant (see Type.mkAppTy)
 }}}


    Mysteriously, that comment claims that this code ought to typecheck as-
 is. But shouldn't that only be the case if `LiberalTypeSynonyms` is
 enabled?

    This test case was added all the way back in 2002 (in commit
 ddb3ea2220621d9393ebb08ce3548ac2118a57c2) without much exposition, so it's
 difficult for me to tell whether this test case is legitimate or not.

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


More information about the ghc-tickets mailing list