summaryrefslogtreecommitdiff
path: root/testsuite/tests/simplCore/should_compile/T13658.hs
blob: 662fa66022a06c719370cc184bc094fcf0e381b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE BangPatterns #-}

{- # OPTIONS_GHC -Werror #-}
{-# OPTIONS_GHC -g -O2 #-}

module Bug (bug) where

-- import GHC.Base (seq)
import Unsafe.Coerce (unsafeCoerce)

undefined :: a
undefined = undefined

data TypeRep (a :: k) where
    TrTyCon :: TypeRep (a :: k)
    TrApp   :: forall k1 k2 (a :: k1 -> k2) (b :: k1).
               TypeRep (a b)

data SomeTypeRep where
    SomeTypeRep :: forall k (a :: k).
                   TypeRep a
                -> SomeTypeRep

mkTrApp :: forall k1 k2 (a :: k1 -> k2) (b :: k1).
           TypeRep (a :: k1 -> k2)
        -> TypeRep (a b)
mkTrApp TrTyCon = undefined
mkTrApp TrApp   = undefined

bug :: SomeTypeRep
-- bug = f x -- this works
bug = f (f x)
  where x = SomeTypeRep TrTyCon
        f :: SomeTypeRep -> SomeTypeRep
        f (SomeTypeRep acc) = SomeTypeRep (mkTrApp (unsafeCoerce acc))