[GHC] #15577: TypeApplications-related infinite loop (GHC 8.6+ only)
GHC
ghc-devs at haskell.org
Wed Aug 29 18:59:35 UTC 2018
#15577: TypeApplications-related infinite loop (GHC 8.6+ only)
-------------------------------------+-------------------------------------
Reporter: RyanGlScott | Owner: (none)
Type: bug | Status: new
Priority: high | Milestone: 8.6.1
Component: Compiler | Version: 8.5
(Type checker) |
Keywords: | Operating System: Unknown/Multiple
TypeApplications, TypeInType |
Architecture: | Type of failure: Compile-time
Unknown/Multiple | performance bug
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
The following program will loop infinitely when compiled on GHC 8.6 or
HEAD:
{{{#!hs
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeInType #-}
{-# LANGUAGE TypeOperators #-}
module Bug where
import Data.Kind
import Data.Type.Equality
data family Sing :: forall k. k -> Type
class Generic1 (f :: k -> Type) where
type Rep1 f :: k -> Type
class PGeneric1 (f :: k -> Type) where
type From1 (z :: f a) :: Rep1 f a
type To1 (z :: Rep1 f a) :: f a
class SGeneric1 (f :: k -> Type) where
sFrom1 :: forall (a :: k) (z :: f a). Sing z -> Sing (From1 z)
sTo1 :: forall (a :: k) (r :: Rep1 f a). Sing r -> Sing (To1 r :: f a)
class (PGeneric1 f, SGeneric1 f) => VGeneric1 (f :: k -> Type) where
sTof1 :: forall (a :: k) (z :: f a). Sing z -> To1 (From1 z)
:~: z
sFot1 :: forall (a :: k) (r :: Rep1 f a). Sing r -> From1 (To1 r :: f a)
:~: r
foo :: forall (f :: Type -> Type) (a :: Type) (r :: Rep1 f a).
VGeneric1 f
=> Sing r -> From1 (To1 r :: f a) :~: r
foo x
| Refl <- sFot1 -- Uncommenting the line below makes it work again:
-- @Type
@f @a @r x
= Refl
}}}
This is a regression from GHC 8.4, since compiling this program with 8.4
simply errors:
{{{
$ /opt/ghc/8.4.3/bin/ghc Bug.hs
[1 of 1] Compiling Bug ( Bug.hs, Bug.o )
Bug.hs:35:20: error:
• Expecting one more argument to ‘f’
Expected a type, but ‘f’ has kind ‘* -> *’
• In the type ‘f’
In a stmt of a pattern guard for
an equation for ‘foo’:
Refl <- sFot1 @f @a @r x
In an equation for ‘foo’: foo x | Refl <- sFot1 @f @a @r x = Refl
|
35 | @f @a @r x
| ^
Bug.hs:35:23: error:
• Expected kind ‘f1 -> *’, but ‘a’ has kind ‘*’
• In the type ‘a’
In a stmt of a pattern guard for
an equation for ‘foo’:
Refl <- sFot1 @f @a @r x
In an equation for ‘foo’: foo x | Refl <- sFot1 @f @a @r x = Refl
• Relevant bindings include
x :: Sing r1 (bound at Bug.hs:32:5)
foo :: Sing r1 -> From1 (To1 r1) :~: r1 (bound at Bug.hs:32:1)
|
35 | @f @a @r x
| ^
Bug.hs:35:26: error:
• Couldn't match kind ‘* -> *’ with ‘*’
When matching kinds
f1 :: * -> *
Rep1 f1 a1 :: *
Expected kind ‘f1’, but ‘r’ has kind ‘Rep1 f1 a1’
• In the type ‘r’
In a stmt of a pattern guard for
an equation for ‘foo’:
Refl <- sFot1 @f @a @r x
In an equation for ‘foo’: foo x | Refl <- sFot1 @f @a @r x = Refl
• Relevant bindings include
x :: Sing r1 (bound at Bug.hs:32:5)
foo :: Sing r1 -> From1 (To1 r1) :~: r1 (bound at Bug.hs:32:1)
|
35 | @f @a @r x
| ^
Bug.hs:35:28: error:
• Couldn't match kind ‘*’ with ‘GHC.Types.RuntimeRep’
When matching kinds
a1 :: *
'GHC.Types.LiftedRep :: GHC.Types.RuntimeRep
• In the fourth argument of ‘sFot1’, namely ‘x’
In a stmt of a pattern guard for
an equation for ‘foo’:
Refl <- sFot1 @f @a @r x
In an equation for ‘foo’: foo x | Refl <- sFot1 @f @a @r x = Refl
• Relevant bindings include
x :: Sing r1 (bound at Bug.hs:32:5)
foo :: Sing r1 -> From1 (To1 r1) :~: r1 (bound at Bug.hs:32:1)
|
35 | @f @a @r x
| ^
Bug.hs:36:5: error:
• Could not deduce: From1 (To1 r1) ~ r1
from the context: r0 ~ From1 (To1 r0)
bound by a pattern with constructor:
Refl :: forall k (a :: k). a :~: a,
in a pattern binding in
pattern guard for
an equation for ‘foo’
at Bug.hs:33:5-8
‘r1’ is a rigid type variable bound by
the type signature for:
foo :: forall (f1 :: * -> *) a1 (r1 :: Rep1 f1 a1).
VGeneric1 f1 =>
Sing r1 -> From1 (To1 r1) :~: r1
at Bug.hs:(29,1)-(31,43)
Expected type: From1 (To1 r1) :~: r1
Actual type: r1 :~: r1
• In the expression: Refl
In an equation for ‘foo’: foo x | Refl <- sFot1 @f @a @r x = Refl
• Relevant bindings include
x :: Sing r1 (bound at Bug.hs:32:5)
foo :: Sing r1 -> From1 (To1 r1) :~: r1 (bound at Bug.hs:32:1)
|
36 | = Refl
| ^^^^
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15577>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list