Have addModFinalizer expose the local type environment.
authorFacundo Domínguez <facundo.dominguez@tweag.io>
Tue, 20 Dec 2016 11:39:10 +0000 (08:39 -0300)
committerFacundo Domínguez <facundo.dominguez@tweag.io>
Fri, 6 Jan 2017 18:17:23 +0000 (15:17 -0300)
Kind inference in ghci was interfered when renaming of type splices
introduced the HsSpliced data constructor. This patch has kind
inference skip over it.

Test Plan: ./validate

Reviewers: simonpj, rrnewton, bgamari, goldfire, austin

Subscribers: thomie, mboes

Differential Revision: https://phabricator.haskell.org/D2886

GHC Trac Issues: #12985

compiler/typecheck/TcHsType.hs
testsuite/tests/ghci/scripts/GhciKinds.script
testsuite/tests/ghci/scripts/GhciKinds.stdout

index d96e74e..3fa6077 100644 (file)
@@ -446,6 +446,14 @@ tc_infer_hs_type mode (HsKindSig ty sig)
   = do { sig' <- tc_lhs_kind (kindLevel mode) sig
        ; ty' <- tc_lhs_type mode ty sig'
        ; return (ty', sig') }
+-- HsSpliced is an annotation produced by 'RnSplice.rnSpliceType' to communicate
+-- the splice location to the typechecker. Here we skip over it in order to have
+-- the same kind inferred for a given expression whether it was produced from
+-- splices or not.
+--
+-- See Note [Delaying modFinalizers in untyped splices].
+tc_infer_hs_type mode (HsSpliceTy (HsSpliced _ (HsSplicedTy ty)) _)
+  = tc_infer_hs_type mode ty
 tc_infer_hs_type mode (HsDocTy ty _) = tc_infer_lhs_type mode ty
 tc_infer_hs_type _    (HsCoreTy ty)  = return (ty, typeKind ty)
 tc_infer_hs_type mode other_ty
index fa94015..a7220fe 100644 (file)
@@ -8,3 +8,10 @@
 
 :seti -XRankNTypes
 :kind! forall a. F (Maybe a)
+
+:set -XUnboxedTuples -XTemplateHaskell -XMagicHash
+:set -fprint-explicit-runtime-reps -fprint-explicit-kinds
+:set -fprint-explicit-foralls
+:m + GHC.Exts Language.Haskell.TH Language.Haskell.TH.Lib
+:m + Language.Haskell.TH.Syntax
+:k $(unboxedTupleT 2)
index e34b84a..3556e62 100644 (file)
@@ -9,3 +9,5 @@ F (Maybe Bool) :: *
 = Char
 forall a. F (Maybe a) :: *
 = Char
+$(unboxedTupleT 2) :: forall (k0 :: RuntimeRep) (k1 :: RuntimeRep).
+                      TYPE k0 -> TYPE k1 -> TYPE 'UnboxedTupleRep