Infer types with flexible contexts
authorSimon Peyton Jones <simonpj@microsoft.com>
Thu, 9 Jul 2015 12:03:34 +0000 (13:03 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Thu, 9 Jul 2015 12:04:04 +0000 (13:04 +0100)
Responding to Trac #10608 and Trac #10351, I've reverted
to making type inference infer structured constraint like
    f :: C [t] => t -> t
even if -XFlexibleContexts is not set.  That elicits an
error message suggesting the flag.  The result is more
helpful than the error message you get otherwise.

compiler/typecheck/TcSimplify.hs
testsuite/tests/typecheck/should_fail/T10351.stderr
testsuite/tests/typecheck/should_fail/T6022.stderr
testsuite/tests/typecheck/should_fail/T8883.stderr

index f4ff467..4129adc 100644 (file)
@@ -17,8 +17,7 @@ module TcSimplify(
 import Bag
 import Class         ( classKey )
 import Class         ( Class )
-import DynFlags      ( ExtensionFlag( Opt_AllowAmbiguousTypes
-                                    , Opt_FlexibleContexts )
+import DynFlags      ( ExtensionFlag( Opt_AllowAmbiguousTypes )
                      , DynFlags( solverIterations ) )
 import Inst
 import Id            ( idType )
@@ -603,7 +602,9 @@ pickQuantifiablePreds :: TyVarSet         -- Quantifying over these
 -- This function decides whether a particular constraint shoudl be
 -- quantified over, given the type variables that are being quantified
 pickQuantifiablePreds qtvs theta
-  = do { flex_ctxt <- xoptM Opt_FlexibleContexts
+  = do { let flex_ctxt = True   -- Quantify over non-tyvar constraints, even without
+                                -- -XFlexibleContexts: see Trac #10608, #10351
+         -- flex_ctxt <- xoptM Opt_FlexibleContexts
        ; return (filter (pick_me flex_ctxt) theta) }
   where
     pick_me flex_ctxt pred
index 178005a..58c28e4 100644 (file)
@@ -1,5 +1,6 @@
 \r
-T10351.hs:6:7: error:\r
-    No instance for (C [t]) arising from a use of ‘op’\r
-    In the expression: op [x]\r
-    In an equation for ‘f’: f x = op [x]\r
+T10351.hs:6:1: error:\r
+    Non type-variable argument in the constraint: C [t]\r
+    (Use FlexibleContexts to permit this)\r
+    When checking that ‘f’ has the inferred type\r
+      f :: forall t. C [t] => t -> ()\r
index a85c628..a3cd78e 100644 (file)
@@ -1,6 +1,6 @@
-
-T6022.hs:3:9: error:
-    No instance for (Eq ([a] -> a)) arising from a use of ‘==’
-      (maybe you haven't applied a function to enough arguments?)
-    In the expression: x == head
-    In an equation for ‘f’: f x = x == head
+\r
+T6022.hs:3:1: error:\r
+    Non type-variable argument in the constraint: Eq ([a] -> a)\r
+    (Use FlexibleContexts to permit this)\r
+    When checking that ‘f’ has the inferred type\r
+      f :: forall a. Eq ([a] -> a) => ([a] -> a) -> Bool\r
index dc4bdfc..3f0a430 100644 (file)
@@ -1,10 +1,8 @@
 \r
-T8883.hs:20:14: error:\r
-    Could not deduce (Functor (PF a)) arising from a use of ‘fmap’\r
-    from the context: Regular a\r
-      bound by the inferred type of\r
-               fold :: Regular a => (PF a b -> b) -> a -> b\r
-      at T8883.hs:20:1-33\r
-    In the first argument of ‘(.)’, namely ‘fmap (fold f)’\r
-    In the second argument of ‘(.)’, namely ‘fmap (fold f) . from’\r
-    In the expression: f . fmap (fold f) . from\r
+T8883.hs:20:1: error:\r
+    Non type-variable argument in the constraint: Functor (PF a)\r
+    (Use FlexibleContexts to permit this)\r
+    When checking that ‘fold’ has the inferred type\r
+      fold :: forall b a.\r
+              (Functor (PF a), Regular a) =>\r
+              (PF a b -> b) -> a -> b\r