Skip to content

LiberalTypeSynonyms unsaturation check doesn't kick in

GHC accepts this program:

{-# LANGUAGE ImpredicativeTypes #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
module Bug where

import GHC.Exts (Any)

type KindOf (a :: k) = k
type A a = (Any :: a)
type KA = KindOf A

But it really oughtn't to. After all, we have an unsaturated use of A in KindOf A, and we don't have LiberalTypeSynonyms enabled!

What's even stranger is that there seems to be something about this exact setup that sneaks by LiberalTypeSynonyms' validity checks. If I add another argument to A:

type A x a = (Any :: a)

Then it //does// error:

$ /opt/ghc/8.6.2/bin/ghc Bug.hs
[1 of 1] Compiling Bug              ( Bug.hs, Bug.o )

Bug.hs:10:1: error:
    • Illegal polymorphic type: forall a -> a
      Perhaps you intended to use LiberalTypeSynonyms
    • In the type synonym declaration for ‘KA’
   |
10 | type KA = KindOf A
   | ^^^^^^^^^^^^^^^^^^

Similarly, if I use something besides KindOf:

{-# LANGUAGE ImpredicativeTypes #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
module Bug where

import GHC.Exts (Any)

type A a = (Any :: a)
type B a = Int
type C = B A

Then I also get the same Illegal polymorphic type: forall a -> a error.

Trac metadata
Trac field Value
Version 8.6.2
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler (Type checker)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information