summaryrefslogtreecommitdiff
path: root/testsuite/tests/typecheck/should_fail/tcfail093.hs
diff options
context:
space:
mode:
authorDavid Terei <davidterei@gmail.com>2011-07-20 11:09:03 -0700
committerDavid Terei <davidterei@gmail.com>2011-07-20 11:26:35 -0700
commit16514f272fb42af6e9c7674a9bd6c9dce369231f (patch)
treee4f332b45fe65e2a7a2451be5674f887b42bf199 /testsuite/tests/typecheck/should_fail/tcfail093.hs
parentebd422aed41048476aa61dd4c520d43becd78682 (diff)
downloadhaskell-16514f272fb42af6e9c7674a9bd6c9dce369231f.tar.gz
Move tests from tests/ghc-regress/* to just tests/*
Diffstat (limited to 'testsuite/tests/typecheck/should_fail/tcfail093.hs')
-rw-r--r--testsuite/tests/typecheck/should_fail/tcfail093.hs36
1 files changed, 36 insertions, 0 deletions
diff --git a/testsuite/tests/typecheck/should_fail/tcfail093.hs b/testsuite/tests/typecheck/should_fail/tcfail093.hs
new file mode 100644
index 0000000000..9c2d8ea80a
--- /dev/null
+++ b/testsuite/tests/typecheck/should_fail/tcfail093.hs
@@ -0,0 +1,36 @@
+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies,
+ FlexibleInstances, UndecidableInstances #-}
+-- UndecidableInstances now needed because the Coverage Condition fails
+
+module ShouldFail where
+
+-- A stripped down functional-dependency
+-- example that causes GHC 4.08.1 to crash with:
+-- "basicTypes/Var.lhs:194: Non-exhaustive patterns in function readMutTyVar"
+-- Reported by Thomas Hallgren Nov 00
+
+-- July 07: I'm changing this from "should fail" to "should succeed"
+-- See Note [Important subtlety in oclose] in FunDeps
+
+
+primDup :: Int -> IO Int
+primDup = undefined
+
+dup () = call primDup
+
+-- call :: Call c h => c -> h
+--
+-- call primDup :: {Call (Int -> IO Int) h} => h with
+-- Using the instance decl gives
+-- call primDup :: {Call (IO Int) h'} => Int -> h'
+-- The functional dependency means that h must be constant
+-- Hence program is rejected because it can't find an instance
+-- for {Call (IO Int) h'}
+
+class Call c h | c -> h where
+ call :: c -> h
+
+instance Call c h => Call (Int->c) (Int->h) where
+ call f = call . f
+
+