summaryrefslogtreecommitdiff
path: root/testsuite/tests/typecheck/should_fail/tcfail093.hs
diff options
context:
space:
mode:
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
+
+