[commit: ghc] master: Fix #15787 by squashing a coercion hole. (4427315)

git at git.haskell.org git at git.haskell.org
Mon Oct 29 03:18:10 UTC 2018


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/4427315a65b25db22e1754d41b43dd4b782b022f/ghc

>---------------------------------------------------------------

commit 4427315a65b25db22e1754d41b43dd4b782b022f
Author: Richard Eisenberg <rae at cs.brynmawr.edu>
Date:   Sun Oct 28 16:06:17 2018 -0400

    Fix #15787 by squashing a coercion hole.
    
    In type-incorrect code, we can sometimes let a coercion
    hole make it through the zonker. If this coercion hole then
    ends up in the environment (e.g., in the type of a data
    constructor), then it causes trouble later.
    
    This patch avoids trouble by substituting the coercion hole
    for its representative CoVar. Really, any coercion would do,
    but the CoVar was very handy.
    
    test case: polykinds/T15787


>---------------------------------------------------------------

4427315a65b25db22e1754d41b43dd4b782b022f
 compiler/typecheck/TcHsSyn.hs           |  4 +++-
 testsuite/tests/polykinds/T15787.hs     | 19 +++++++++++++++++++
 testsuite/tests/polykinds/T15787.stderr |  6 ++++++
 testsuite/tests/polykinds/all.T         |  1 +
 4 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/compiler/typecheck/TcHsSyn.hs b/compiler/typecheck/TcHsSyn.hs
index f5fedc9..99e2172 100644
--- a/compiler/typecheck/TcHsSyn.hs
+++ b/compiler/typecheck/TcHsSyn.hs
@@ -1810,7 +1810,9 @@ zonkCoHole env hole@(CoercionHole { ch_ref = ref, ch_co_var = cv })
                                    , text "Type-correct unfilled coercion hole"
                                      <+> ppr hole )
                          ; cv' <- zonkCoVar cv
-                         ; return $ mkHoleCo (hole { ch_co_var = cv' }) } }
+                         ; return $ mkCoVarCo cv' } }
+                             -- This will be an out-of-scope variable, but keeping
+                             -- this as a coercion hole led to #15787
 
 zonk_tycomapper :: TyCoMapper ZonkEnv TcM
 zonk_tycomapper = TyCoMapper
diff --git a/testsuite/tests/polykinds/T15787.hs b/testsuite/tests/polykinds/T15787.hs
new file mode 100644
index 0000000..85e737a
--- /dev/null
+++ b/testsuite/tests/polykinds/T15787.hs
@@ -0,0 +1,19 @@
+{-# Language RankNTypes #-}
+{-# Language TypeApplications #-}
+{-# Language DataKinds        #-}
+{-# Language PolyKinds        #-}
+{-# Language GADTs            #-}
+{-# Language TypeFamilies     #-}
+
+import Data.Kind
+
+class Ríki (ob :: Type) where
+ type Hom :: ob -> ob -> Type
+
+data
+  Kl_kind :: forall ob . (ob -> ob) -> ob -> Type where
+  Kl      :: k -> Kl_kind (m :: ob -> ob) k
+
+type family
+  UnKl (kl :: Kl_kind m k) = (res :: k) where
+  UnKl (Kl a) = a
diff --git a/testsuite/tests/polykinds/T15787.stderr b/testsuite/tests/polykinds/T15787.stderr
new file mode 100644
index 0000000..6d368d5
--- /dev/null
+++ b/testsuite/tests/polykinds/T15787.stderr
@@ -0,0 +1,6 @@
+
+T15787.hs:15:43: error:
+    • Expected kind ‘ob’, but ‘k’ has kind ‘*’
+    • In the second argument of ‘Kl_kind’, namely ‘k’
+      In the type ‘Kl_kind (m :: ob -> ob) k’
+      In the definition of data constructor ‘Kl’
diff --git a/testsuite/tests/polykinds/all.T b/testsuite/tests/polykinds/all.T
index 010d0ac..371fbf2 100644
--- a/testsuite/tests/polykinds/all.T
+++ b/testsuite/tests/polykinds/all.T
@@ -194,3 +194,4 @@ test('T15170', normal, compile, [''])
 test('T14939', normal, compile, ['-O'])
 test('T15577', normal, compile_fail, ['-O'])
 test('T15592', normal, compile, [''])
+test('T15787', normal, compile_fail, [''])



More information about the ghc-commits mailing list