Fix #11797.
authorRichard Eisenberg <eir@cis.upenn.edu>
Wed, 6 Apr 2016 14:37:22 +0000 (16:37 +0200)
committerRichard Eisenberg <eir@cis.upenn.edu>
Tue, 12 Apr 2016 12:14:17 +0000 (08:14 -0400)
DsMeta curiously omitted quantified tyvars in certain circumstances.
This patch means it doesn't.

Test case: th/T11797

compiler/deSugar/DsMeta.hs
docs/users_guide/8.0.1-notes.rst
testsuite/tests/th/T11797.hs [new file with mode: 0644]
testsuite/tests/th/T11797.stderr [new file with mode: 0644]
testsuite/tests/th/T8031.hs
testsuite/tests/th/all.T

index b14c0a4..7ed96b4 100644 (file)
@@ -872,12 +872,9 @@ repContext ctxt = do preds <- repList typeQTyConName repLTy ctxt
                      repCtxt preds
 
 repHsSigType :: LHsSigType Name -> DsM (Core TH.TypeQ)
-repHsSigType ty = repLTy (hsSigType ty)
-
-repHsSigWcType :: LHsSigWcType Name -> DsM (Core TH.TypeQ)
-repHsSigWcType (HsIB { hsib_vars = vars
-                     , hsib_body = sig1 })
-  | (explicit_tvs, ctxt, ty) <- splitLHsSigmaTy (hswc_body sig1)
+repHsSigType (HsIB { hsib_vars = vars
+                   , hsib_body = body })
+  | (explicit_tvs, ctxt, ty) <- splitLHsSigmaTy body
   = addTyVarBinds (HsQTvs { hsq_implicit = []
                           , hsq_explicit = map (noLoc . UserTyVar . noLoc) vars ++
                                            explicit_tvs
@@ -889,6 +886,10 @@ repHsSigWcType (HsIB { hsib_vars = vars
          then return th_ty
          else repTForall th_tvs th_ctxt th_ty }
 
+repHsSigWcType :: LHsSigWcType Name -> DsM (Core TH.TypeQ)
+repHsSigWcType ib_ty@(HsIB { hsib_body = sig1 })
+  = repHsSigType (ib_ty { hsib_body = hswc_body sig1 })
+
 -- yield the representation of a list of types
 --
 repLTys :: [LHsType Name] -> DsM [Core TH.TypeQ]
index d79fdf2..2f011c4 100644 (file)
@@ -445,6 +445,14 @@ Template Haskell
    whether flags such as :ghc-flag:`-XStrictData` or
    :ghc-flag:`-funbox-strict-fields` are enabled.
 
+-  Previously, quoting a type signature like ``a -> a`` would produce the
+   abstract syntax for ``forall a. a -> a``. This behavior remains, but it
+   is extended to kinds, too, meaning that ``Proxy a -> Proxy a`` becomes
+   ``forall k (a :: k). Proxy a -> Proxy a``. This change is not intentional,
+   but is forced by the fact that GHC has a hard time telling kinds apart
+   from types. The effect of this change is that round-tripping kind-
+   polymorphic types will now require :ghc-flag:`-XTypeInType`.
+
 Runtime system
 ~~~~~~~~~~~~~~
 
diff --git a/testsuite/tests/th/T11797.hs b/testsuite/tests/th/T11797.hs
new file mode 100644 (file)
index 0000000..0ee0a04
--- /dev/null
@@ -0,0 +1,14 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module T11797 where
+
+import Language.Haskell.TH
+import System.IO
+
+$(do dec <- [d| class Foo a where
+                  meth :: a -> b -> a |]
+     runIO $ do putStrLn $ pprint dec
+                hFlush stdout
+     return [] )
+
+-- the key bit is the forall b. in the type of the method
diff --git a/testsuite/tests/th/T11797.stderr b/testsuite/tests/th/T11797.stderr
new file mode 100644 (file)
index 0000000..1b43982
--- /dev/null
@@ -0,0 +1,2 @@
+class Foo_0 a_1
+    where meth_2 :: forall b_3 . a_1 -> b_3 -> a_1
index e71f347..9f06c06 100644 (file)
@@ -1,13 +1,14 @@
-{-# LANGUAGE TemplateHaskell, RankNTypes, DataKinds, TypeOperators, PolyKinds,
+{-# LANGUAGE TemplateHaskell, RankNTypes, TypeOperators, TypeInType,
              GADTs #-}
 
 module T8031 where
 
 import Data.Proxy
+import Data.Kind
 
 data SList :: [k] -> * where
   SCons :: Proxy h -> Proxy t -> SList (h ': t)
-  
+
 $( [d| foo :: forall (a :: k). Proxy a
            -> forall (b :: [k]). Proxy b
            -> SList (a ': b)
index 2ff11fb..d562836 100644 (file)
@@ -400,3 +400,4 @@ test('T11145', normal, compile_fail, ['-v0 -dsuppress-uniques'])
 test('T11463', normal, compile_and_run, ['-v0 -dsuppress-uniques'])
 test('T11680', normal, compile_fail, ['-v0'])
 test('T11809', normal, compile, ['-v0'])
+test('T11797', normal, compile, ['-v0 -dsuppress-uniques'])