Repository : ssh://darcs.haskell.org//srv/darcs/testsuite On branch : master
http://hackage.haskell.org/trac/ghc/changeset/4e5ca8d7dd0db07030e7dc43fc8bc1e8a78a07fc >--------------------------------------------------------------- commit 4e5ca8d7dd0db07030e7dc43fc8bc1e8a78a07fc Author: Simon Peyton Jones <simo...@microsoft.com> Date: Fri Oct 19 02:25:16 2012 +0100 Adapt to being a bit more picky about inference with GADTs This means adding a few type signature, and some tests failing (as they should) rather than succeeding >--------------------------------------------------------------- tests/gadt/all.T | 6 +++--- tests/gadt/gadt-escape1.hs | 3 +++ tests/gadt/gadt-escape1.stderr | 19 +++++++++++++++++++ tests/gadt/gadt13.hs | 3 +++ tests/gadt/gadt13.stderr | 16 ++++++++++++++++ tests/gadt/gadt7.hs | 3 ++- tests/gadt/gadt7.stderr | 20 ++++++++++++++++++++ tests/polykinds/Freeman.hs | 8 +++++++- tests/typecheck/should_compile/T5655.hs | 1 + 9 files changed, 74 insertions(+), 5 deletions(-) diff --git a/tests/gadt/all.T b/tests/gadt/all.T index e68d126..1b46565 100644 --- a/tests/gadt/all.T +++ b/tests/gadt/all.T @@ -11,12 +11,12 @@ test('gadt3', normal, compile, ['']) test('gadt4', skip_if_fast, compile_and_run, ['']) test('gadt5', skip_if_fast, compile_and_run, ['']) test('gadt6', normal, compile, ['']) -test('gadt7', normal, compile, ['']) +test('gadt7', normal, compile_fail, ['']) test('gadt8', normal, compile, ['']) test('gadt9', normal, compile, ['']) test('gadt10', normal, compile_fail, ['']) test('gadt11', normal, compile_fail, ['']) -test('gadt13', normal, compile, ['']) +test('gadt13', normal, compile_fail, ['']) test('gadt14', normal, compile, ['']) test('gadt15', normal, compile, ['']) test('gadt16', normal, compile, ['']) @@ -73,7 +73,7 @@ test('data2', normal, compile, ['']) test('termination', normal, compile, ['']) test('set', normal, compile, ['']) test('scoped', normal, compile, ['']) -test('gadt-escape1', normal, compile, ['']) +test('gadt-escape1', normal, compile_fail, ['']) # New ones from Dimitrios diff --git a/tests/gadt/gadt-escape1.hs b/tests/gadt/gadt-escape1.hs index 4ff33b2..d90d6a9 100644 --- a/tests/gadt/gadt-escape1.hs +++ b/tests/gadt/gadt-escape1.hs @@ -12,6 +12,9 @@ hval = Hidden (ExpInt 0) (ExpInt 1) -- With the type sig this is ok, but without it maybe -- should be rejected becuase the result type is wobbly -- weird1 :: ExpGADT Int +-- +-- And indeed it is rejected by GHC 7.8 because OutsideIn +-- doesn't unify under an equality constraint. weird1 = case (hval :: Hidden) of Hidden (ExpInt _) a -> a -- Hidden t (ExpInt (co :: t ~ Int) _ :: ExpGADT t) (a :: ExpGADT t) diff --git a/tests/gadt/gadt-escape1.stderr b/tests/gadt/gadt-escape1.stderr index e69de29..53885ff 100644 --- a/tests/gadt/gadt-escape1.stderr +++ b/tests/gadt/gadt-escape1.stderr @@ -0,0 +1,19 @@ + +gadt-escape1.hs:19:58: + Couldn't match type `t' with `ExpGADT Int' + `t' is untouchable + inside the constraints (t1 ~ Int) + bound by a pattern with constructor + ExpInt :: Int -> ExpGADT Int, + in a case alternative + at gadt-escape1.hs:19:43-50 + `t' is a rigid type variable bound by + the inferred type of weird1 :: t at gadt-escape1.hs:19:1 + Expected type: t + Actual type: ExpGADT t1 + Relevant bindings include + weird1 :: t (bound at gadt-escape1.hs:19:1) + In the expression: a + In a case alternative: Hidden (ExpInt _) a -> a + In the expression: + case (hval :: Hidden) of { Hidden (ExpInt _) a -> a } diff --git a/tests/gadt/gadt13.hs b/tests/gadt/gadt13.hs index bd25262..d36f451 100644 --- a/tests/gadt/gadt13.hs +++ b/tests/gadt/gadt13.hs @@ -2,6 +2,9 @@ -- This should fail, because there is no annotation on shw, -- but it succeeds in 6.4.1 +-- +-- It fails again with 7.8 because Outside in doesn't +-- unify under an equality constraint module ShouldFail where diff --git a/tests/gadt/gadt13.stderr b/tests/gadt/gadt13.stderr index e69de29..b03ff49 100644 --- a/tests/gadt/gadt13.stderr +++ b/tests/gadt/gadt13.stderr @@ -0,0 +1,16 @@ + +gadt13.hs:15:13: + Couldn't match expected type `t' + with actual type `String -> [Char]' + `t' is untouchable + inside the constraints (t1 ~ Int) + bound by a pattern with constructor + I :: Int -> Term Int, + in an equation for `shw' + at gadt13.hs:15:6-8 + `t' is a rigid type variable bound by + the inferred type of shw :: Term t1 -> t at gadt13.hs:15:1 + Relevant bindings include + shw :: Term t1 -> t (bound at gadt13.hs:15:1) + In the expression: ("I " ++) . shows t + In an equation for `shw': shw (I t) = ("I " ++) . shows t diff --git a/tests/gadt/gadt7.hs b/tests/gadt/gadt7.hs index 9c775d2..105b60c 100644 --- a/tests/gadt/gadt7.hs +++ b/tests/gadt/gadt7.hs @@ -11,7 +11,8 @@ data T a where i1 :: T a -> a -> Int i1 t y = (\t1 y1 -> case t1 of K -> y1) t y --- No type signature; should type-check +-- No type signature; should not type-check, +-- because we can't unify under the equalty constraint for K i1b t y = (\t1 y1 -> case t1 of K -> y1) t y i2 :: T a -> a -> Int diff --git a/tests/gadt/gadt7.stderr b/tests/gadt/gadt7.stderr index e69de29..561b0b5 100644 --- a/tests/gadt/gadt7.stderr +++ b/tests/gadt/gadt7.stderr @@ -0,0 +1,20 @@ + +gadt7.hs:16:38: + Couldn't match expected type `t' with actual type `t1' + `t1' is untouchable + inside the constraints (t2 ~ Int) + bound by a pattern with constructor + K :: T Int, + in a case alternative + at gadt7.hs:16:33 + `t1' is a rigid type variable bound by + the inferred type of i1b :: T t2 -> t1 -> t at gadt7.hs:16:1 + `t' is a rigid type variable bound by + the inferred type of i1b :: T t2 -> t1 -> t at gadt7.hs:16:1 + Relevant bindings include + i1b :: T t2 -> t1 -> t (bound at gadt7.hs:16:1) + y :: t1 (bound at gadt7.hs:16:7) + y1 :: t1 (bound at gadt7.hs:16:16) + In the expression: y1 + In a case alternative: K -> y1 + In the expression: case t1 of { K -> y1 } diff --git a/tests/polykinds/Freeman.hs b/tests/polykinds/Freeman.hs index ea8aff0..13e5d5c 100644 --- a/tests/polykinds/Freeman.hs +++ b/tests/polykinds/Freeman.hs @@ -225,10 +225,13 @@ deriving instance Show a => Show (Alt a b) instance Rec (PHom (->) (->)) (FAlt a) (Alt a) where _in = mkPHom f g where + f,g :: FAlt a (Alt a) s -> Alt a s f FZero = Zero f (FSucc1 a b) = Succ1 a b g (FSucc2 a b) = Succ2 a b + out = mkPHom f g where + f,g :: Alt a s -> FAlt a (Alt a) s f Zero = FZero f (Succ1 a b) = FSucc1 a b g (Succ2 a b) = FSucc2 a b @@ -252,8 +255,11 @@ type PairUpResult a = K2 [(a, a)] (a, [(a, a)]) pairUp :: Alt a Fst -> [(a, a)] pairUp xs = let (K21 xss) = (fstPHom (fold (mkPHom phi psi))) xs in xss where - phi FZero = K21 [] + phi :: FAlt y (K2 v (r,[(y,r)])) s -> K2 [(y,r)] (y,z) s + phi FZero = K21 [] phi (FSucc1 x1 (K22 (x2, xss))) = K21 ((x1, x2):xss) + + psi :: FAlt y (K2 z w) s -> K2 [x] (y,z) s psi (FSucc2 x (K21 xss)) = K22 (x, xss) main = print (Succ1 (0::Int) $ Succ2 1 $ Succ1 2 $ Succ2 3 $ Succ1 4 $ Succ2 5 Zero) diff --git a/tests/typecheck/should_compile/T5655.hs b/tests/typecheck/should_compile/T5655.hs index 232ea6b..c2eed90 100644 --- a/tests/typecheck/should_compile/T5655.hs +++ b/tests/typecheck/should_compile/T5655.hs @@ -23,4 +23,5 @@ f = ap (ETwice . twice) foo :: ETwice foo = ETwice (5 :: Int) +bar :: IO () bar = ap print (f foo) _______________________________________________ Cvs-ghc mailing list Cvs-ghc@haskell.org http://www.haskell.org/mailman/listinfo/cvs-ghc