Skip to content

Unknown opcode 10904

I got this error working with ghci just now. Contrary to what it says, I'm not on linux but on Mac OS X 10.4.11 (intel).

    *Main> quickCheck prop_typecheck
    <interactive>: internal error: interpretBCO: unknown or unimplemented opcode     10904
        (GHC version 6.6 for i386_unknown_linux)
        Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug

The text of the program follows.

import Foreign (unsafePerformIO)
import List (nub)
import System.Random (mkStdGen)
import Test.QuickCheck

data Term = Const | Var Int | Abs Term | Appl Term Term
            deriving (Show)
data Type = Base | Type :->: Type
            deriving (Eq, Show)

data TypeScheme = T Type | V Int | Arr TypeScheme TypeScheme
                  deriving (Eq, Show)

eval env Const = Const
eval env (Var x) | x < length env = env !! x
eval env (Abs n) = Abs n
eval env (Appl m n) = case eval env m of
                        Abs m' -> eval env' m'
                            where env' = eval env n : env
                        _ -> error "non-functional application"

data Fresh a = Fr(Int -> (Int, a))

instance Monad Fresh where
     return x = Fr(\ctr -> (ctr, x))
     (Fr m) >>= f = Fr(\x -> let (ctr, x') = m x in 
                             let Fr f' = f x' in
                             f' ctr)

fresh :: Fresh Int
fresh = Fr(\ctr -> (ctr+1, ctr))

runFresh (Fr f) = snd $ f 0

arrowTy (s :->: t) = True
arrowTy _ = False

unify (T s) (T t) | s == t = Just[]
unify (V x) t = Just [(x, t)]
unify s (V y) = Just [(y, s)]
unify (Arr s1 t1) (Arr s2 t2) = 
    do subst1 <- unify s1 s2
       subst2 <- unify t1 t2
       Just (List.nub $ subst1 ++ subst2)

applySubst :: (Int, TypeScheme) -> TypeScheme -> TypeScheme
applySubst (x, xIm) (T ty) = T ty
applySubst (x, xIm) (V y) | x == y = xIm
                          | otherwise = V y
applySubst (x, xIm) (Arr s t) = Arr (applySubst (x, xIm) s)
                                    (applySubst (x, xIm) t)

applySubsts :: [(Int, TypeScheme)] -> TypeScheme -> TypeScheme
applySubsts substs ty = foldr (applySubst) ty substs

typeCheck :: [TypeScheme] -> Term -> Fresh TypeScheme
typeCheck env Const = return $ T Base
typeCheck env (Var x) | x < length env = return (env !! x)
typeCheck env (Abs n) = 
    do xTy <- fresh
       nTy <- typeCheck (V xTy : env) n
       return (Arr (V xTy) nTy)
typeCheck env (Appl m n) =
    do mTy <- typeCheck env m
       nTy <- typeCheck env n
       case mTy of
        Arr mArgTy mResTy -> 
            case unify mArgTy nTy of
              Nothing -> error "unification failed"
              Just substn ->
                  return (applySubsts substn mResTy)
        _ ->  error "ill-typed application"

typeGen :: Int -> Gen Type
typeGen size = oneof $
    [return Base] ++
    if size <= 0 then [] else
        [do s <- typeGen (size-1)
            t <- typeGen (size-1)
            return $ s :->: t ]

asList Nothing = []
asList (Just x) = [x]

oneofMaybe :: [Gen(Maybe a)] -> Gen (Maybe a)
oneofMaybe [] = return Nothing
oneofMaybe (x:xs) = do x' <- x
                       xs' <- oneofMaybe xs
                       case (x', xs') of
                         (Nothing, Nothing) -> return Nothing
                         _ -> oneof (map (return . Just) $ 
                                         asList x' ++ asList xs')

typedTermGen :: [Type] -> Type -> Int -> Gen (Maybe Term)
typedTermGen ctxt tau size = oneofMaybe (
    (case tau of
      Base -> [return $ Just Const]
      tau :->: tau' -> 
          if size <= 0 then [] else
          [do n <- typedTermGen (tau:ctxt) tau' decSize
              return $ do n' <- n
                          Just(Abs n')]
    ) ++
    (if size <= 0 then [] else
    [do sigma <- typeGen decSize
--        let sigma = (unsafePerformIO $ putStr $ show sigma') `seq` sigma'
        m <- typedTermGen ctxt (sigma :->: tau) decSize
        n <- typedTermGen ctxt (sigma) decSize
        return $ do m' <- m ; n' <- n; Just (Appl m' n')
    ]) ++
    [return$ Just (Var x) | (x, xType) <- zip [0..] ctxt, xType == tau]
    )
        where decSize = size-1

-- graph a function over certain inputs
graph f xs = [(x, f x) | x <- xs]

make n g size = [generate size (System.Random.mkStdGen i) g | i<-[0..n]]

prop_typecheck = forAll (sized (typedTermGen [] Base)) (\m ->
                    let m' = Maybe.fromJust m in
                    (runFresh (typeCheck [] m')) == Some (T Base))
Trac metadata
Trac field Value
Version 6.6
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system MacOS X
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information