[commit: ghc] master: Deeply instantiate in :type (f2a2b79)
git at git.haskell.org
git at git.haskell.org
Mon Apr 4 09:22:37 UTC 2016
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/f2a2b79fa8d1c702b17e195a70734b06625e0153/ghc
>---------------------------------------------------------------
commit f2a2b79fa8d1c702b17e195a70734b06625e0153
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date: Mon Apr 4 10:18:43 2016 +0100
Deeply instantiate in :type
See Trac #11376 and
Note [Deeply instantiate in :type] in TcRnDriver
Sadly this showed up one new problem (Trac #11786) and one opportunity
(Trac #11787), so test T11549 is now marked expect-broken on these two.
>---------------------------------------------------------------
f2a2b79fa8d1c702b17e195a70734b06625e0153
compiler/typecheck/TcRnDriver.hs | 31 +++++++++++++++++++++----
testsuite/tests/dependent/ghci/T11549.script | 8 +++----
testsuite/tests/dependent/ghci/all.T | 3 ++-
testsuite/tests/ghci/scripts/T11376.script | 6 +++++
testsuite/tests/ghci/scripts/T11376.stdout | 2 ++
testsuite/tests/ghci/scripts/TypeAppData.stdout | 28 +++++++++++-----------
testsuite/tests/ghci/scripts/all.T | 1 +
7 files changed, 56 insertions(+), 23 deletions(-)
diff --git a/compiler/typecheck/TcRnDriver.hs b/compiler/typecheck/TcRnDriver.hs
index 550f84f..640d74d 100644
--- a/compiler/typecheck/TcRnDriver.hs
+++ b/compiler/typecheck/TcRnDriver.hs
@@ -33,6 +33,7 @@ import RnSplice ( rnTopSpliceDecls, traceSplice, SpliceInfo(..) )
import IfaceEnv( externaliseName )
import TcHsType
import TcMatches
+import Inst( deeplyInstantiate )
import RnTypes
import RnExpr
import MkId
@@ -1977,9 +1978,16 @@ tcRnExpr hsc_env rdr_expr
-- Now typecheck the expression, and generalise its type
-- it might have a rank-2 type (e.g. :t runST)
uniq <- newUnique ;
- let { fresh_it = itName uniq (getLoc rdr_expr) } ;
- (tclvl, lie, (_tc_expr, res_ty)) <- pushLevelAndCaptureConstraints $
- tcInferSigma rn_expr ;
+ let { fresh_it = itName uniq (getLoc rdr_expr)
+ ; orig = OccurrenceOf fresh_it } ; -- Not a very satisfactory origin
+ (tclvl, lie, res_ty)
+ <- pushLevelAndCaptureConstraints $
+ do { (_tc_expr, expr_ty) <- tcInferSigma rn_expr
+ ; (_wrap, res_ty) <- deeplyInstantiate orig expr_ty
+ -- See [Note Deeply instantiate in :type]
+ ; return res_ty } ;
+
+ -- Generalise
((qtvs, dicts, _), lie_top) <- captureConstraints $
{-# SCC "simplifyInfer" #-}
simplifyInfer tclvl
@@ -2055,7 +2063,22 @@ tcRnType hsc_env normalise rdr_type
; return (ty', mkInvForAllTys kvs (typeKind ty')) }
-{- Note [Kind-generalise in tcRnType]
+{- Note [Deeply instantiate in :type]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Suppose (Trac #11376)
+ bar :: forall a b. Show a => a -> b -> a
+What should `:t bar @Int` show?
+
+ 1. forall b. Show Int => Int -> b -> Int
+ 2. forall b. Int -> b -> Int
+ 3. forall {b}. Int -> b -> Int
+ 4. Int -> b -> Int
+
+We choose (3), which is the effect of deeply instantiating and
+re-generalising. All the others seem deeply confusing. That is
+why we deeply instantiate here.
+
+Note [Kind-generalise in tcRnType]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We switch on PolyKinds when kind-checking a user type, so that we will
kind-generalise the type, even when PolyKinds is not otherwise on.
diff --git a/testsuite/tests/dependent/ghci/T11549.script b/testsuite/tests/dependent/ghci/T11549.script
index 5f8c500..bb35589 100644
--- a/testsuite/tests/dependent/ghci/T11549.script
+++ b/testsuite/tests/dependent/ghci/T11549.script
@@ -3,12 +3,12 @@ import GHC.Exts
putStrLn "-fno-print-explicit-runtime-reps"
:set -fno-print-explicit-runtime-reps
-:ty ($)
+:info ($)
:kind TYPE
-:ty error
+:info error
putStrLn "\n-fprint-explicit-runtime-reps"
:set -fprint-explicit-runtime-reps
-:ty ($)
+:info ($)
:kind TYPE
-:ty error
+:info error
diff --git a/testsuite/tests/dependent/ghci/all.T b/testsuite/tests/dependent/ghci/all.T
index 6d9332a..956272f 100644
--- a/testsuite/tests/dependent/ghci/all.T
+++ b/testsuite/tests/dependent/ghci/all.T
@@ -1,3 +1,4 @@
test('T11549',
- normal,
+ [ expect_broken( 11787 ),
+ expect_broken( 11786 ) ],
ghci_script, ['T11549.script'])
diff --git a/testsuite/tests/ghci/scripts/T11376.script b/testsuite/tests/ghci/scripts/T11376.script
new file mode 100644
index 0000000..780db3c
--- /dev/null
+++ b/testsuite/tests/ghci/scripts/T11376.script
@@ -0,0 +1,6 @@
+:set -XTypeApplications
+let { bar :: Show a => a -> b -> a; bar = error "urk" }
+:type bar @Int
+:set -fprint-explicit-foralls
+:type bar @Int
+
diff --git a/testsuite/tests/ghci/scripts/T11376.stdout b/testsuite/tests/ghci/scripts/T11376.stdout
new file mode 100644
index 0000000..0b0b959
--- /dev/null
+++ b/testsuite/tests/ghci/scripts/T11376.stdout
@@ -0,0 +1,2 @@
+bar @Int :: Int -> b -> Int
+bar @Int :: forall {b}. Int -> b -> Int
diff --git a/testsuite/tests/ghci/scripts/TypeAppData.stdout b/testsuite/tests/ghci/scripts/TypeAppData.stdout
index 5a4880a..0fd5506 100644
--- a/testsuite/tests/ghci/scripts/TypeAppData.stdout
+++ b/testsuite/tests/ghci/scripts/TypeAppData.stdout
@@ -1,14 +1,14 @@
-P1 :: forall {k} (a :: k). P1 a
-P2 :: forall k (a :: k). P2 a
-P3 :: forall k (a :: k). P3 k a
-P4 :: forall {k} (a :: k). P1 a -> P4 a
-P5 :: forall {k} (a :: k). P1 a -> P5
-P6 :: forall k (a :: k). P1 a -> P6
-P7 :: forall {k} (a :: k). P1 a
-P8 :: forall {k} (a :: k). P1 a
-P9 :: forall k (a :: k). P1 a
-P10 :: forall k (a :: k). P1 a
-P11 :: forall {k} (a :: k). P1 a -> P5
-P12 :: forall {k} (a :: k). P1 a -> P5
-P13 :: forall k (a :: k). P1 a -> P5
-P14 :: forall k (a :: k). P1 a -> P5
+P1 :: forall {k} {a :: k}. P1 a
+P2 :: forall {k} {a :: k}. P2 a
+P3 :: forall {k} {a :: k}. P3 k a
+P4 :: forall {k} {a :: k}. P1 a -> P4 a
+P5 :: forall {k} {a :: k}. P1 a -> P5
+P6 :: forall {k} {a :: k}. P1 a -> P6
+P7 :: forall {k} {a :: k}. P1 a
+P8 :: forall {k} {a :: k}. P1 a
+P9 :: forall {k} {a :: k}. P1 a
+P10 :: forall {k} {a :: k}. P1 a
+P11 :: forall {k} {a :: k}. P1 a -> P5
+P12 :: forall {k} {a :: k}. P1 a -> P5
+P13 :: forall {k} {a :: k}. P1 a -> P5
+P14 :: forall {k} {a :: k}. P1 a -> P5
diff --git a/testsuite/tests/ghci/scripts/all.T b/testsuite/tests/ghci/scripts/all.T
index 8fab956..2d21772 100755
--- a/testsuite/tests/ghci/scripts/all.T
+++ b/testsuite/tests/ghci/scripts/all.T
@@ -248,3 +248,4 @@ test('T11524a', normal, ghci_script, ['T11524a.script'])
test('T11456', normal, ghci_script, ['T11456.script'])
test('TypeAppData', normal, ghci_script, ['TypeAppData.script'])
test('T11728', normal, ghci_script, ['T11728.script'])
+test('T11376', normal, ghci_script, ['T11376.script'])
More information about the ghc-commits
mailing list