compiler bug in ghc-6.4 (building a class declaration with TH)

Benjamin Franksen benjamin.franksen at bessy.de
Fri Sep 9 10:29:31 EDT 2005


This is command and output:

> ghc -fth -ddump-splices --make TestBuffers.hs
Chasing modules from: TestBuffers.hs
Compiling Buffers          ( ./Buffers.hs, ./Buffers.o )
Compiling Main             ( TestBuffers.hs, TestBuffers.o )
Loading package base-1.0 ... linking ... done.
Loading package haskell98-1.0 ... linking ... done.
Loading package template-haskell-1.0 ... linking ... done.
TestBuffers.hs:1:0:
    TestBuffers.hs:1:0: Splicing declarations
        mkBufferClasses 12
      ======>
        class HasZero f where { zero :: a; emptyBag }
        class HasOne f where {ghc-6.4: panic! (the `impossible' 
happened, GHC version 6.4):
        hsSyn/Convert.lhs:(339,8)-(350,91): Non-exhaustive patterns in 
function trans


Please report it as a compiler bug to glasgow-haskell-bugs at haskell.org,
or http://sourceforge.net/projects/ghc/.

I attached the two (short) source files.

Ben
-------------- next part --------------
module Buffers where

import Language.Haskell.TH
import Control.Monad (when)
import Data.Char (toUpper)

numNames = ["zero","one","two","three","four","five",
            "six","seven","eight","nine","ten","eleven","twelve"]
            ++ map show [13..]

numNames' = [toUpper x : xs | (x:xs) <- front] ++ back
  where (front,back) = splitAt 13 numNames

mkBufferType :: String -> [Int] -> Q [Dec]
mkBufferType name quantities = do
  let tc_name = mkName name
  let tv_name = mkName "a"
  let tvars = [tv_name]
  let dcs = [NormalC (mkName (name++(numNames'!!i))) (replicate i (NotStrict, VarT tv_name)) | i <- quantities]
  let derivs = []
  return [DataD [] tc_name tvars dcs derivs]

mkBufferClasses :: Int -> Q [Dec]
mkBufferClasses max = do
    let class_name i = mkName ("Has"++(numNames'!!i))
    let ctx = []
    let tv_name_coll = mkName "f"
    let tv_name_elem = mkName "a"
    let tvars = [tv_name_coll]
    let fundeps = []
    let meth_name i = mkName (numNames !! i)
    let meth_type i = type_nx_to_y i (VarT tv_name_elem) (VarT tv_name_coll)
    let meth_decls i = [SigD (meth_name i) (meth_type i)]
    return [ClassD ctx (class_name i) tvars fundeps (meth_decls i) | i <- [0..max]]
  where
    type_nx_to_y n xt yt
      | n == 0    = xt
      | n > 0     = AppT ArrowT (AppT xt (type_nx_to_y (n-1) xt yt))
      | otherwise = error "Buffers.type_nx_to_y: n < 0"

-- class HasOne c where
--   one :: e -> c e
-------------- next part --------------
import Buffers

$(mkBufferClasses 12)

$(mkBufferType "BufferZeroToTen" [0..10])
$(mkBufferType "BufferThreeToFive" [3..5])
$(mkBufferType "BufferTwoSixFour" [2,6,4])


More information about the Glasgow-haskell-bugs mailing list