diff options
Diffstat (limited to 'testsuite/tests/typecheck/should_fail/tcfail093.hs')
-rw-r--r-- | testsuite/tests/typecheck/should_fail/tcfail093.hs | 36 |
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 + + |