[GHC] #12408: "ghc: panic! (the 'impossible' happened)" only when compiled with "-O"

GHC ghc-devs at haskell.org
Tue Jul 19 06:39:40 UTC 2016


#12408: "ghc: panic! (the 'impossible' happened)" only when compiled with "-O"
-------------------------------------+-------------------------------------
           Reporter:  clinton        |             Owner:
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.0.1
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  Compile-time
  Unknown/Multiple                   |  crash
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 On Debian GNU/Linux x86, GHC 8.0.1 crashes compiling the attached code,
 but only when "-O1" is given. Without optimization, it compiles fine.

 {{{#!hs
 {-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE FlexibleContexts #-}

 module Main where

 import Prelude hiding
   (
       (.)
     , (+)
     , (*)
   )
 import qualified Prelude

 main :: IO ()
 main = return ()

 x :: Int
 x = 42

 f a b c = (c * (a + b)) == ((c * a) + (c * b))

 g = f x x x

 newtype Sum a = Sum { getSum :: a }
 newtype Product a = Product { getProduct :: a }

 type family CatParam t :: *

 class Semigroupoid p where
   type CatSrc p t :: *
   type CatDest p t :: *
   type CatT p a b :: *
   (.) ::
     (
       p ~ CatParam catAB,
       p ~ CatParam catBC,
       p ~ CatParam catAC,
       a ~ CatSrc p catAB,
       b ~ CatSrc p catBC,
       a ~ CatSrc p catAC,
       b ~ CatDest p catAB,
       c ~ CatDest p catBC,
       c ~ CatDest p catAC,
       catAB ~ CatT p a b,
       catBC ~ CatT p b c,
       catAC ~ CatT p a c
     ) => catBC -> catAB -> catAC

 data BasicSumSemigroup (t :: *) :: *
 type instance CatParam (Sum Int) = BasicSumSemigroup Int

 instance (Num t) => Semigroupoid (BasicSumSemigroup t) where
   type CatSrc (BasicSumSemigroup _) _ = ()
   type CatDest (BasicSumSemigroup _) _ = ()
   type CatT (BasicSumSemigroup t) _ _ = Sum t
   (Sum x) . (Sum y) = Sum ((Prelude.+) x y)


 data BasicProductSemigroup (t :: *) :: *
 type instance CatParam (Product Int) = BasicProductSemigroup Int

 instance (Num t) => Semigroupoid (BasicProductSemigroup t) where
   type CatSrc (BasicProductSemigroup _) _ = ()
   type CatDest (BasicProductSemigroup _) _ = ()
   type CatT (BasicProductSemigroup t) _ _ = Product t
   (Product x) . (Product y) = Product ((Prelude.*) x y)

 type family RingParamFromSum p :: *
 type family RingParamFromProduct p :: *

 class NearRingWithoutId t where
   type SumP t
   type ProdP t
   type LeftDistrib t origLeftCat rightArg
   type RightDistrib t origLeftCat leftArg

   (+) ::
     (
       t ~ RingParamFromSum sumP,
       Semigroupoid sumP,
       p ~ sumP,
       p ~ CatParam catAB,
       p ~ CatParam catBC,
       p ~ CatParam catAC,
       a ~ CatSrc p catAB,
       b ~ CatSrc p catBC,
       a ~ CatSrc p catAC,
       b ~ CatDest p catAB,
       c ~ CatDest p catBC,
       c ~ CatDest p catAC,
       catAB ~ CatT p a b,
       catBC ~ CatT p b c,
       catAC ~ CatT p a c,
       catAB ~ Sum noSumCatAB,
       catBC ~ Sum noSumCatBC,
       catAC ~ Sum noSumCatAC
     ) => noSumCatBC -> noSumCatAB -> noSumCatAC
   (+) x y = getSum ((Sum x) . (Sum y))

   (*) ::
     (
       t ~ RingParamFromProduct prodP,
       Semigroupoid prodP,
       p ~ prodP,
       p ~ CatParam catAB,
       p ~ CatParam catBC,
       p ~ CatParam catAC,
       a ~ CatSrc p catAB,
       b ~ CatSrc p catBC,
       a ~ CatSrc p catAC,
       b ~ CatDest p catAB,
       c ~ CatDest p catBC,
       c ~ CatDest p catAC,
       catAB ~ CatT p a b,
       catBC ~ CatT p b c,
       catAC ~ CatT p a c,
       catAB ~ Product noProdCatAB,
       catBC ~ Product noProdCatBC,
       catAC ~ Product noProdCatAC,
       sumCatAB ~ Sum noProdCatAB,
       sumCatBC ~ Sum noProdCatBC,
       sumCatAC ~ Sum noProdCatAC,
       ps ~ sumP,
       ps ~ CatParam sumCatAB,
       ps ~ CatParam sumCatBC,
       ps ~ CatParam sumCatAC,
       sumABSrc ~ CatSrc p sumCatAB,
       sumBCSrc ~ CatSrc p sumCatBC,
       sumACSrc ~ CatSrc p sumCatAC,
       sumABDest ~ CatDest p sumCatAB,
       sumBCDest ~ CatDest p sumCatBC,
       sumACDest ~ CatDest p sumCatAC,
       sumACSrc ~ LeftDistrib   t sumBCSrc noProdCatAB,
       sumACSrc ~ RightDistrib  t sumACSrc noProdCatBC,
       sumACDest ~ LeftDistrib  t sumBCDest noProdCatAB,
       sumACDest ~ RightDistrib t sumACDest noProdCatBC
     ) => noProdCatBC -> noProdCatAB -> noProdCatAC
   (*) x y = getProduct ((Product x) . (Product y))

 data TestInt
 type instance RingParamFromSum (BasicSumSemigroup Int) = TestInt
 type instance RingParamFromProduct (BasicProductSemigroup Int) = TestInt

 instance NearRingWithoutId TestInt where
   type SumP TestInt = BasicSumSemigroup Int
   type ProdP TestInt = BasicProductSemigroup Int
   type LeftDistrib TestInt _ _ = ()
   type RightDistrib TestInt _ _ = ()
 }}}

 The following error results:

 {{{
 ghc: panic! (the 'impossible' happened)
   (GHC version 8.0.1 for x86_64-unknown-linux):
         Template variable unbound in rewrite rule
   Variable: cobox_s3PM
   Rule "SPEC f @ Int @ Int @ Int @ Int @ Int @ Int @ Int"
   Rule bndrs: [cobox_s3PM, cobox_s3PN, cobox_s3PO, cobox_s3PP,
                cobox_s3PQ, cobox_s3PR, cobox_s3PS, cobox_s3PT, cobox_s3PU,
                cobox_s3PV, cobox_s3PW, cobox_s3PX, cobox_s3PY, cobox_s3PZ,
                cobox_s3Q0, cobox_s3Q1, cobox_s3Q2, cobox_s3Q3, cobox_s3Q4,
                cobox_s3Q5, cobox_s3Q6, cobox_s3Q7, cobox_s3Q8, cobox_s3Q9,
                cobox_s3Qa, cobox_s3Qb, cobox_s3Qc, cobox_s3Qd, cobox_s3Qe,
                cobox_s3Qf, cobox_s3Qg, cobox_s3Qh, cobox_s3Qi, cobox_s3Qj,
                cobox_s3Qk, cobox_s3Ql, cobox_s3Qm, cobox_s3Qn, cobox_s3Qo,
                cobox_s3Qp, cobox_s3Qq, cobox_s3Qr, cobox_s3Qs, cobox_s3Qt,
                cobox_s3Qu, cobox_s3Qv, cobox_s3Qw, cobox_s3Qx, cobox_s3Qy,
                cobox_s3Qz, cobox_s3QA, cobox_s3QB, $dSemigroupoid_X3SC,
                $dSemigroupoid_X3SE, $dNearRingWithoutId_s3QE,
                $dNearRingWithoutId_s3QF, $dEq_s3QG]
   LHS args: [TYPE: Int, TYPE: Int, TYPE: Int, TYPE: Int, TYPE: Int,
              TYPE: Int, TYPE: Int,
              CO: <CatDest (CatParam (Product Int)) (Product Int)>_N,
              CO: <CatDest (CatParam (Sum Int)) (Sum Int)>_N,
              CO: <CatDest (CatParam (Product Int)) (Product Int)>_N,
              CO: cobox_s3PP, CO: cobox_s3PQ, CO: cobox_s3PR, CO:
 cobox_s3PS,
              CO: cobox_s3PT, CO: cobox_s3PU, CO: cobox_s3PV, CO:
 cobox_s3PW,
              CO: cobox_s3PX, CO: cobox_s3PY,
              CO: <CatDest (CatParam (Product Int)) (Product Int)>_N,
              CO: cobox_s3Q0, CO: <CatParam (Product Int)>_N, CO:
 cobox_s3Q2,
              CO: <CatDest (CatParam (Product Int)) (Product Int)>_N,
              CO: <CatSrc (CatParam (Product Int)) (Product Int)>_N,
              CO: <CatParam (Product Int)>_N, CO: cobox_s3Q6, CO:
 cobox_s3Q7,
              CO: cobox_s3Q8, CO: cobox_s3Q9, CO: cobox_s3Qa, CO:
 cobox_s3Qb,
              CO: cobox_s3Qc, CO: cobox_s3Qd, CO: cobox_s3Qe,
              CO: <CatParam (Product Int)>_N, CO: cobox_s3Qg,
              CO: <CatSrc (CatParam (Product Int)) (Product Int)>_N,
              CO: <CatParam (Product Int)>_N, CO: <CatParam (Sum Int)>_N,
              CO: cobox_s3Qk, CO: cobox_s3Ql, CO: cobox_s3Qm,
              CO: <CatDest (CatParam (Sum Int)) (Sum Int)>_N,
              CO: <CatSrc (CatParam (Sum Int)) (Sum Int)>_N,
              CO: <CatParam (Sum Int)>_N, CO: <CatParam (Sum Int)>_N,
              CO: <CatParam (Sum Int)>_N, CO: cobox_s3Qs,
              CO: <CatParam (Sum Int)>_N, CO: cobox_s3Qu,
              CO: <CatSrc (CatParam (Sum Int)) (Sum Int)>_N,
              CO: <CatParam (Sum Int)>_N,
              CO: <CatDest (CatParam (Product Int)) (Product Int)>_N,
              CO: <CatParam (Product Int)>_N, CO: cobox_s3Qz,
              CO: <CatSrc (CatParam (Product Int)) (Product Int)>_N,
              CO: <CatParam (Product Int)>_N, $dSemigroupoid_X3SC,
              $dSemigroupoid_X3SE, $dNearRingWithoutId_s3QE,
              $dNearRingWithoutId_s3QF, $dEq_s3QG]
   Actual args: [TYPE: Int, TYPE: Int, TYPE: Int, TYPE: Int,
                 TYPE: Int, TYPE: Int, TYPE: Int,
                 CO: <CatDest (CatParam (Product Int)) (Product Int)>_N,
                 CO: <CatDest (CatParam (Sum Int)) (Sum Int)>_N,
                 CO: <CatDest (CatParam (Product Int)) (Product Int)>_N,
                 CO: (CatT
                        D:R:CatParamProduct[0]
                        ((CatSrc D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatSrcBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N)
                        ((CatDest D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatDestBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N))_N
                     ; D:R:CatTBasicProductSemigroup__1[0] <Int>_N <()>_N
 <()>_N,
                 CO: (CatT
                        D:R:CatParamProduct[0]
                        ((CatSrc D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatSrcBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N)
                        ((CatDest D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatDestBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N))_N
                     ; D:R:CatTBasicProductSemigroup__1[0] <Int>_N <()>_N
 <()>_N,
                 CO: (CatT
                        D:R:CatParamSum[0]
                        ((CatSrc D:R:CatParamSum[0] <Sum Int>_N)_N
                         ; D:R:CatSrcBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N)
                        ((CatDest D:R:CatParamSum[0] <Sum Int>_N)_N
                         ; D:R:CatDestBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N))_N
                     ; D:R:CatTBasicSumSemigroup__1[0] <Int>_N <()>_N
 <()>_N,
                 CO: (CatT
                        D:R:CatParamSum[0]
                        ((CatSrc D:R:CatParamSum[0] <Sum Int>_N)_N
                         ; D:R:CatSrcBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N)
                        ((CatDest D:R:CatParamSum[0] <Sum Int>_N)_N
                         ; D:R:CatDestBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N))_N
                     ; D:R:CatTBasicSumSemigroup__1[0] <Int>_N <()>_N
 <()>_N,
                 CO: (CatT
                        D:R:CatParamProduct[0]
                        ((CatSrc D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatSrcBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N)
                        ((CatDest D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatDestBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N))_N
                     ; D:R:CatTBasicProductSemigroup__1[0] <Int>_N <()>_N
 <()>_N,
                 CO: (CatSrc D:R:CatParamSum[0] <Sum Int>_N)_N
                     ; D:R:CatSrcBasicSumSemigroup_1[0] <Int>_N <Sum Int>_N
                     ; Sym (D:R:CatDestBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N)
                     ; (CatDest (Sym D:R:CatParamSum[0]) <Sum Int>_N)_N,
                 CO: (RightDistrib
                        ((RingParamFromProduct D:R:CatParamProduct[0])_N
                         ;
 D:R:RingParamFromProductBasicProductSemigroup[0])
                        ((LeftDistrib
                            ((RingParamFromProduct
 D:R:CatParamProduct[0])_N
                             ;
 D:R:RingParamFromProductBasicProductSemigroup[0])
                            ((CatDest D:R:CatParamProduct[0] <Sum Int>_N)_N
                             ; D:R:CatDestBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                            <Int>_N)_N
                         ; D:R:LeftDistribTestInt__1[0] <()>_N <Int>_N)
                        <Int>_N)_N
                     ; D:R:RightDistribTestInt__1[0] <()>_N <Int>_N
                     ; Sym (D:R:LeftDistribTestInt__1[0] <()>_N <Int>_N)
                     ; (LeftDistrib
                          (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                           ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                          (Sym (D:R:CatDestBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                           ; (CatDest (Sym D:R:CatParamProduct[0]) <Sum
 Int>_N)_N)
                          <Int>_N)_N,
                 CO: (CatDest D:R:CatParamProduct[0] <Sum Int>_N)_N
                     ; D:R:CatDestBasicProductSemigroup_1[0] <Int>_N <Sum
 Int>_N
                     ; Sym (D:R:RightDistribTestInt__1[0] <()>_N <Int>_N)
                     ; (RightDistrib
                          (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                           ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                          (Sym (D:R:LeftDistribTestInt__1[0] <()>_N
 <Int>_N)
                           ; (LeftDistrib
                                (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                                 ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                                (Sym (D:R:CatDestBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                                 ; (CatDest (Sym D:R:CatParamProduct[0])
 <Sum Int>_N)_N)
                                <Int>_N)_N)
                          <Int>_N)_N,
                 CO: (RightDistrib
                        ((RingParamFromProduct D:R:CatParamProduct[0])_N
                         ;
 D:R:RingParamFromProductBasicProductSemigroup[0])
                        ((LeftDistrib
                            ((RingParamFromProduct
 D:R:CatParamProduct[0])_N
                             ;
 D:R:RingParamFromProductBasicProductSemigroup[0])
                            ((CatSrc D:R:CatParamProduct[0] <Sum Int>_N)_N
                             ; D:R:CatSrcBasicProductSemigroup_1[0] <Int>_N
 <Sum Int>_N)
                            <Int>_N)_N
                         ; D:R:LeftDistribTestInt__1[0] <()>_N <Int>_N)
                        <Int>_N)_N
                     ; D:R:RightDistribTestInt__1[0] <()>_N <Int>_N
                     ; Sym (D:R:LeftDistribTestInt__1[0] <()>_N <Int>_N)
                     ; (LeftDistrib
                          (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                           ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                          (Sym (D:R:CatSrcBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                           ; (CatSrc (Sym D:R:CatParamProduct[0]) <Sum
 Int>_N)_N)
                          <Int>_N)_N,
                 CO: (CatSrc D:R:CatParamProduct[0] <Sum Int>_N)_N
                     ; D:R:CatSrcBasicProductSemigroup_1[0] <Int>_N <Sum
 Int>_N
                     ; Sym (D:R:RightDistribTestInt__1[0] <()>_N <Int>_N)
                     ; (RightDistrib
                          (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                           ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                          (Sym (D:R:LeftDistribTestInt__1[0] <()>_N
 <Int>_N)
                           ; (LeftDistrib
                                (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                                 ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                                (Sym (D:R:CatSrcBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                                 ; (CatSrc (Sym D:R:CatParamProduct[0])
 <Sum Int>_N)_N)
                                <Int>_N)_N)
                          <Int>_N)_N,
                 CO: <CatDest (CatParam (Product Int)) (Product Int)>_N,
                 CO: (CatSrc D:R:CatParamProduct[0] <Product Int>_N)_N
                     ; D:R:CatSrcBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N
                     ; Sym
                         (D:R:CatDestBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N)
                     ; (CatDest (Sym D:R:CatParamProduct[0]) <Product
 Int>_N)_N,
                 CO: <CatParam (Product Int)>_N,
                 CO: (CatT
                        D:R:CatParamProduct[0]
                        ((CatSrc D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatSrcBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N)
                        ((CatDest D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatDestBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N))_N
                     ; D:R:CatTBasicProductSemigroup__1[0] <Int>_N <()>_N
 <()>_N,
                 CO: <CatDest (CatParam (Product Int)) (Product Int)>_N,
                 CO: <CatSrc (CatParam (Product Int)) (Product Int)>_N,
                 CO: <CatParam (Product Int)>_N,
                 CO: (RightDistrib
                        ((RingParamFromProduct D:R:CatParamProduct[0])_N
                         ;
 D:R:RingParamFromProductBasicProductSemigroup[0])
                        ((LeftDistrib
                            ((RingParamFromProduct
 D:R:CatParamProduct[0])_N
                             ;
 D:R:RingParamFromProductBasicProductSemigroup[0])
                            ((CatDest D:R:CatParamProduct[0] <Sum Int>_N)_N
                             ; D:R:CatDestBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                            <Int>_N)_N
                         ; D:R:LeftDistribTestInt__1[0] <()>_N <Int>_N)
                        <Int>_N)_N
                     ; D:R:RightDistribTestInt__1[0] <()>_N <Int>_N
                     ; Sym (D:R:LeftDistribTestInt__1[0] <()>_N <Int>_N)
                     ; (LeftDistrib
                          (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                           ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                          (Sym (D:R:CatDestBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                           ; (CatDest (Sym D:R:CatParamProduct[0]) <Sum
 Int>_N)_N)
                          <Int>_N)_N,
                 CO: (CatDest D:R:CatParamProduct[0] <Sum Int>_N)_N
                     ; D:R:CatDestBasicProductSemigroup_1[0] <Int>_N <Sum
 Int>_N
                     ; Sym (D:R:RightDistribTestInt__1[0] <()>_N <Int>_N)
                     ; (RightDistrib
                          (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                           ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                          (Sym (D:R:LeftDistribTestInt__1[0] <()>_N
 <Int>_N)
                           ; (LeftDistrib
                                (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                                 ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                                (Sym (D:R:CatDestBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                                 ; (CatDest (Sym D:R:CatParamProduct[0])
 <Sum Int>_N)_N)
                                <Int>_N)_N)
                          <Int>_N)_N,
                 CO: (RightDistrib
                        ((RingParamFromProduct D:R:CatParamProduct[0])_N
                         ;
 D:R:RingParamFromProductBasicProductSemigroup[0])
                        ((LeftDistrib
                            ((RingParamFromProduct
 D:R:CatParamProduct[0])_N
                             ;
 D:R:RingParamFromProductBasicProductSemigroup[0])
                            ((CatSrc D:R:CatParamProduct[0] <Sum Int>_N)_N
                             ; D:R:CatSrcBasicProductSemigroup_1[0] <Int>_N
 <Sum Int>_N)
                            <Int>_N)_N
                         ; D:R:LeftDistribTestInt__1[0] <()>_N <Int>_N)
                        <Int>_N)_N
                     ; D:R:RightDistribTestInt__1[0] <()>_N <Int>_N
                     ; Sym (D:R:LeftDistribTestInt__1[0] <()>_N <Int>_N)
                     ; (LeftDistrib
                          (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                           ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                          (Sym (D:R:CatSrcBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                           ; (CatSrc (Sym D:R:CatParamProduct[0]) <Sum
 Int>_N)_N)
                          <Int>_N)_N,
                 CO: (CatSrc D:R:CatParamProduct[0] <Sum Int>_N)_N
                     ; D:R:CatSrcBasicProductSemigroup_1[0] <Int>_N <Sum
 Int>_N
                     ; Sym (D:R:RightDistribTestInt__1[0] <()>_N <Int>_N)
                     ; (RightDistrib
                          (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                           ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                          (Sym (D:R:LeftDistribTestInt__1[0] <()>_N
 <Int>_N)
                           ; (LeftDistrib
                                (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                                 ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                                (Sym (D:R:CatSrcBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                                 ; (CatSrc (Sym D:R:CatParamProduct[0])
 <Sum Int>_N)_N)
                                <Int>_N)_N)
                          <Int>_N)_N,
                 CO: (RightDistrib
                        ((RingParamFromProduct D:R:CatParamProduct[0])_N
                         ;
 D:R:RingParamFromProductBasicProductSemigroup[0])
                        ((LeftDistrib
                            ((RingParamFromProduct
 D:R:CatParamProduct[0])_N
                             ;
 D:R:RingParamFromProductBasicProductSemigroup[0])
                            ((CatDest D:R:CatParamProduct[0] <Sum Int>_N)_N
                             ; D:R:CatDestBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                            <Int>_N)_N
                         ; D:R:LeftDistribTestInt__1[0] <()>_N <Int>_N)
                        <Int>_N)_N
                     ; D:R:RightDistribTestInt__1[0] <()>_N <Int>_N
                     ; Sym (D:R:LeftDistribTestInt__1[0] <()>_N <Int>_N)
                     ; (LeftDistrib
                          (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                           ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                          (Sym (D:R:CatDestBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                           ; (CatDest (Sym D:R:CatParamProduct[0]) <Sum
 Int>_N)_N)
                          <Int>_N)_N,
                 CO: (CatDest D:R:CatParamProduct[0] <Sum Int>_N)_N
                     ; D:R:CatDestBasicProductSemigroup_1[0] <Int>_N <Sum
 Int>_N
                     ; Sym (D:R:RightDistribTestInt__1[0] <()>_N <Int>_N)
                     ; (RightDistrib
                          (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                           ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                          (Sym (D:R:LeftDistribTestInt__1[0] <()>_N
 <Int>_N)
                           ; (LeftDistrib
                                (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                                 ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                                (Sym (D:R:CatDestBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                                 ; (CatDest (Sym D:R:CatParamProduct[0])
 <Sum Int>_N)_N)
                                <Int>_N)_N)
                          <Int>_N)_N,
                 CO: (RightDistrib
                        ((RingParamFromProduct D:R:CatParamProduct[0])_N
                         ;
 D:R:RingParamFromProductBasicProductSemigroup[0])
                        ((LeftDistrib
                            ((RingParamFromProduct
 D:R:CatParamProduct[0])_N
                             ;
 D:R:RingParamFromProductBasicProductSemigroup[0])
                            ((CatSrc D:R:CatParamProduct[0] <Sum Int>_N)_N
                             ; D:R:CatSrcBasicProductSemigroup_1[0] <Int>_N
 <Sum Int>_N)
                            <Int>_N)_N
                         ; D:R:LeftDistribTestInt__1[0] <()>_N <Int>_N)
                        <Int>_N)_N
                     ; D:R:RightDistribTestInt__1[0] <()>_N <Int>_N
                     ; Sym (D:R:LeftDistribTestInt__1[0] <()>_N <Int>_N)
                     ; (LeftDistrib
                          (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                           ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                          (Sym (D:R:CatSrcBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                           ; (CatSrc (Sym D:R:CatParamProduct[0]) <Sum
 Int>_N)_N)
                          <Int>_N)_N,
                 CO: (CatSrc D:R:CatParamProduct[0] <Sum Int>_N)_N
                     ; D:R:CatSrcBasicProductSemigroup_1[0] <Int>_N <Sum
 Int>_N
                     ; Sym (D:R:RightDistribTestInt__1[0] <()>_N <Int>_N)
                     ; (RightDistrib
                          (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                           ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                          (Sym (D:R:LeftDistribTestInt__1[0] <()>_N
 <Int>_N)
                           ; (LeftDistrib
                                (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                                 ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N)
                                (Sym (D:R:CatSrcBasicProductSemigroup_1[0]
 <Int>_N <Sum Int>_N)
                                 ; (CatSrc (Sym D:R:CatParamProduct[0])
 <Sum Int>_N)_N)
                                <Int>_N)_N)
                          <Int>_N)_N,
                 CO: (CatT
                        D:R:CatParamProduct[0]
                        ((CatDest D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatDestBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N)
                        ((CatDest D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatDestBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N))_N
                     ; D:R:CatTBasicProductSemigroup__1[0] <Int>_N <()>_N
 <()>_N,
                 CO: <CatParam (Product Int)>_N,
                 CO: (CatT
                        D:R:CatParamProduct[0]
                        ((CatSrc D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatSrcBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N)
                        ((CatDest D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatDestBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N))_N
                     ; D:R:CatTBasicProductSemigroup__1[0] <Int>_N <()>_N
 <()>_N,
                 CO: <CatSrc (CatParam (Product Int)) (Product Int)>_N,
                 CO: <CatParam (Product Int)>_N, CO: <CatParam (Sum
 Int)>_N,
                 CO: (CatT
                        D:R:CatParamSum[0]
                        ((CatDest D:R:CatParamSum[0] <Sum Int>_N)_N
                         ; D:R:CatDestBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N)
                        ((CatDest D:R:CatParamSum[0] <Sum Int>_N)_N
                         ; D:R:CatDestBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N))_N
                     ; D:R:CatTBasicSumSemigroup__1[0] <Int>_N <()>_N
 <()>_N,
                 CO: (CatSrc D:R:CatParamSum[0] <Sum Int>_N)_N
                     ; D:R:CatSrcBasicSumSemigroup_1[0] <Int>_N <Sum Int>_N
                     ; Sym (D:R:CatDestBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N)
                     ; (CatDest (Sym D:R:CatParamSum[0]) <Sum Int>_N)_N,
                 CO: (CatT
                        D:R:CatParamSum[0]
                        ((CatSrc D:R:CatParamSum[0] <Sum Int>_N)_N
                         ; D:R:CatSrcBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N)
                        ((CatDest D:R:CatParamSum[0] <Sum Int>_N)_N
                         ; D:R:CatDestBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N))_N
                     ; D:R:CatTBasicSumSemigroup__1[0] <Int>_N <()>_N
 <()>_N,
                 CO: <CatDest (CatParam (Sum Int)) (Sum Int)>_N,
                 CO: <CatSrc (CatParam (Sum Int)) (Sum Int)>_N,
                 CO: <CatParam (Sum Int)>_N, CO: <CatParam (Sum Int)>_N,
                 CO: <CatParam (Sum Int)>_N,
                 CO: (CatT
                        D:R:CatParamSum[0]
                        ((CatDest D:R:CatParamSum[0] <Sum Int>_N)_N
                         ; D:R:CatDestBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N)
                        ((CatDest D:R:CatParamSum[0] <Sum Int>_N)_N
                         ; D:R:CatDestBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N))_N
                     ; D:R:CatTBasicSumSemigroup__1[0] <Int>_N <()>_N
 <()>_N,
                 CO: <CatParam (Sum Int)>_N,
                 CO: (CatT
                        D:R:CatParamSum[0]
                        ((CatSrc D:R:CatParamSum[0] <Sum Int>_N)_N
                         ; D:R:CatSrcBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N)
                        ((CatDest D:R:CatParamSum[0] <Sum Int>_N)_N
                         ; D:R:CatDestBasicSumSemigroup_1[0] <Int>_N <Sum
 Int>_N))_N
                     ; D:R:CatTBasicSumSemigroup__1[0] <Int>_N <()>_N
 <()>_N,
                 CO: <CatSrc (CatParam (Sum Int)) (Sum Int)>_N,
                 CO: <CatParam (Sum Int)>_N,
                 CO: <CatDest (CatParam (Product Int)) (Product Int)>_N,
                 CO: <CatParam (Product Int)>_N,
                 CO: (CatT
                        D:R:CatParamProduct[0]
                        ((CatSrc D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatSrcBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N)
                        ((CatDest D:R:CatParamProduct[0] <Product Int>_N)_N
                         ; D:R:CatDestBasicProductSemigroup_1[0] <Int>_N
 <Product Int>_N))_N
                     ; D:R:CatTBasicProductSemigroup__1[0] <Int>_N <()>_N
 <()>_N,
                 CO: <CatSrc (CatParam (Product Int)) (Product Int)>_N,
                 CO: <CatParam (Product Int)>_N,
                 ($c._a32V @ Int $fNumInt)
                 `cast` (Sym (N:Semigroupoid[0] <BasicSumSemigroup Int>_N)
                         ; (Semigroupoid (Sym D:R:CatParamSum[0]))_R
                         :: ((forall catAB_awI[sk] catBC_awJ[sk]
 catAC_awK[sk] a_awL[sk] b_awM[sk] c_awN[sk].
                              ((BasicSumSemigroup Int :: *) ~ (CatParam
 catAB_awI[sk] :: *),
                               (BasicSumSemigroup Int :: *) ~ (CatParam
 catBC_awJ[sk] :: *),
                               (BasicSumSemigroup Int :: *) ~ (CatParam
 catAC_awK[sk] :: *),
                               (a_awL[sk] :: *)
                               ~
                               (CatSrc (BasicSumSemigroup Int)
 catAB_awI[sk] :: *),
                               (b_awM[sk] :: *)
                               ~
                               (CatSrc (BasicSumSemigroup Int)
 catBC_awJ[sk] :: *),
                               (a_awL[sk] :: *)
                               ~
                               (CatSrc (BasicSumSemigroup Int)
 catAC_awK[sk] :: *),
                               (b_awM[sk] :: *)
                               ~
                               (CatDest (BasicSumSemigroup Int)
 catAB_awI[sk] :: *),
                               (c_awN[sk] :: *)
                               ~
                               (CatDest (BasicSumSemigroup Int)
 catBC_awJ[sk] :: *),
                               (c_awN[sk] :: *)
                               ~
                               (CatDest (BasicSumSemigroup Int)
 catAC_awK[sk] :: *),
                               (catAB_awI[sk] :: *)
                               ~
                               (CatT (BasicSumSemigroup Int) a_awL[sk]
 b_awM[sk] :: *),
                               (catBC_awJ[sk] :: *)
                               ~
                               (CatT (BasicSumSemigroup Int) b_awM[sk]
 c_awN[sk] :: *),
                               (catAC_awK[sk] :: *)
                               ~
                               (CatT (BasicSumSemigroup Int) a_awL[sk]
 c_awN[sk] :: *)) =>
                              catBC_awJ[sk] -> catAB_awI[sk] ->
 catAC_awK[sk]) :: *)
                            ~R#
                            (Semigroupoid (CatParam (Sum Int)) ::
 Constraint)),
                 ($c._a32m @ Int $fNumInt)
                 `cast` (Sym (N:Semigroupoid[0] <BasicProductSemigroup
 Int>_N)
                         ; (Semigroupoid (Sym D:R:CatParamProduct[0]))_R
                         :: ((forall catAB_awI[sk] catBC_awJ[sk]
 catAC_awK[sk] a_awL[sk] b_awM[sk] c_awN[sk].
                              ((BasicProductSemigroup Int :: *) ~ (CatParam
 catAB_awI[sk] :: *),
                               (BasicProductSemigroup Int :: *) ~ (CatParam
 catBC_awJ[sk] :: *),
                               (BasicProductSemigroup Int :: *) ~ (CatParam
 catAC_awK[sk] :: *),
                               (a_awL[sk] :: *)
                               ~
                               (CatSrc (BasicProductSemigroup Int)
 catAB_awI[sk] :: *),
                               (b_awM[sk] :: *)
                               ~
                               (CatSrc (BasicProductSemigroup Int)
 catBC_awJ[sk] :: *),
                               (a_awL[sk] :: *)
                               ~
                               (CatSrc (BasicProductSemigroup Int)
 catAC_awK[sk] :: *),
                               (b_awM[sk] :: *)
                               ~
                               (CatDest (BasicProductSemigroup Int)
 catAB_awI[sk] :: *),
                               (c_awN[sk] :: *)
                               ~
                               (CatDest (BasicProductSemigroup Int)
 catBC_awJ[sk] :: *),
                               (c_awN[sk] :: *)
                               ~
                               (CatDest (BasicProductSemigroup Int)
 catAC_awK[sk] :: *),
                               (catAB_awI[sk] :: *)
                               ~
                               (CatT (BasicProductSemigroup Int) a_awL[sk]
 b_awM[sk] :: *),
                               (catBC_awJ[sk] :: *)
                               ~
                               (CatT (BasicProductSemigroup Int) b_awM[sk]
 c_awN[sk] :: *),
                               (catAC_awK[sk] :: *)
                               ~
                               (CatT (BasicProductSemigroup Int) a_awL[sk]
 c_awN[sk] :: *)) =>
                              catBC_awJ[sk] -> catAB_awI[sk] ->
 catAC_awK[sk]) :: *)
                            ~R#
                            (Semigroupoid (CatParam (Product Int)) ::
 Constraint)),
                 $fNearRingWithoutIdTestInt
                 `cast` ((NearRingWithoutId
                            (Sym D:R:RingParamFromSumBasicSumSemigroup[0]
                             ; (RingParamFromSum (Sym
 D:R:CatParamSum[0]))_N))_R
                         :: (NearRingWithoutId TestInt :: Constraint)
                            ~R#
                            (NearRingWithoutId
                               (RingParamFromSum (CatParam (Sum Int))) ::
 Constraint)),
                 $fNearRingWithoutIdTestInt
                 `cast` ((NearRingWithoutId
                            (Sym
 D:R:RingParamFromProductBasicProductSemigroup[0]
                             ; (RingParamFromProduct (Sym
 D:R:CatParamProduct[0]))_N))_R
                         :: (NearRingWithoutId TestInt :: Constraint)
                            ~R#
                            (NearRingWithoutId
                               (RingParamFromProduct (CatParam (Product
 Int))) :: Constraint)),
                 $fEqInt, x, x, x]

 Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug
 }}}

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


More information about the ghc-tickets mailing list