[commit: ghc] master: Fix #14618 by applying a subst in deeplyInstantiate (722a658)

git at git.haskell.org git at git.haskell.org
Tue Dec 26 21:11:39 UTC 2017


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

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/722a6584bb338bc77ad978d14113b3b8e6a45cab/ghc

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

commit 722a6584bb338bc77ad978d14113b3b8e6a45cab
Author: Richard Eisenberg <rae at cs.brynmawr.edu>
Date:   Tue Dec 26 14:23:40 2017 -0500

    Fix #14618 by applying a subst in deeplyInstantiate
    
    Previously, we were inexplicably not applying an instantiating
    substitution to arguments in non-prenex types. It's amazing this
    has been around for so long! I guess there aren't a lot of non-prenex
    types around.
    
    test case: typecheck/should_fail/T14618


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

722a6584bb338bc77ad978d14113b3b8e6a45cab
 compiler/typecheck/Inst.hs                         |  7 ++++---
 testsuite/tests/typecheck/should_fail/T14618.hs    | 11 +++++++++++
 .../tests/typecheck/should_fail/T14618.stderr      | 23 ++++++++++++++++++++++
 testsuite/tests/typecheck/should_fail/all.T        |  1 +
 4 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/compiler/typecheck/Inst.hs b/compiler/typecheck/Inst.hs
index 6d656fe..9da96c4 100644
--- a/compiler/typecheck/Inst.hs
+++ b/compiler/typecheck/Inst.hs
@@ -257,8 +257,9 @@ deeply_instantiate :: CtOrigin
 deeply_instantiate orig subst ty
   | Just (arg_tys, tvs, theta, rho) <- tcDeepSplitSigmaTy_maybe ty
   = do { (subst', tvs') <- newMetaTyVarsX subst tvs
-       ; ids1  <- newSysLocalIds (fsLit "di") (substTys subst' arg_tys)
-       ; let theta' = substTheta subst' theta
+       ; let arg_tys' = substTys   subst' arg_tys
+             theta'   = substTheta subst' theta
+       ; ids1  <- newSysLocalIds (fsLit "di") arg_tys'
        ; wrap1 <- instCall orig (mkTyVarTys tvs') theta'
        ; traceTc "Instantiating (deeply)" (vcat [ text "origin" <+> pprCtOrigin orig
                                                 , text "type" <+> ppr ty
@@ -271,7 +272,7 @@ deeply_instantiate orig subst ty
                     <.> wrap2
                     <.> wrap1
                     <.> mkWpEvVarApps ids1,
-                 mkFunTys arg_tys rho2) }
+                 mkFunTys arg_tys' rho2) }
 
   | otherwise
   = do { let ty' = substTy subst ty
diff --git a/testsuite/tests/typecheck/should_fail/T14618.hs b/testsuite/tests/typecheck/should_fail/T14618.hs
new file mode 100644
index 0000000..da30d7a
--- /dev/null
+++ b/testsuite/tests/typecheck/should_fail/T14618.hs
@@ -0,0 +1,11 @@
+{-# LANGUAGE RankNTypes #-}
+
+module T14618 where
+
+safeCoerce :: a -> b
+safeCoerce = f'
+    where
+        f :: d -> forall c. d
+        f x = x
+
+        f' = f
diff --git a/testsuite/tests/typecheck/should_fail/T14618.stderr b/testsuite/tests/typecheck/should_fail/T14618.stderr
new file mode 100644
index 0000000..8faa64c
--- /dev/null
+++ b/testsuite/tests/typecheck/should_fail/T14618.stderr
@@ -0,0 +1,23 @@
+
+T14618.hs:6:14: error:
+    • Couldn't match type ‘a’ with ‘b’
+      ‘a’ is a rigid type variable bound by
+        the type signature for:
+          safeCoerce :: forall a b. a -> b
+        at T14618.hs:5:1-20
+      ‘b’ is a rigid type variable bound by
+        the type signature for:
+          safeCoerce :: forall a b. a -> b
+        at T14618.hs:5:1-20
+      Expected type: a -> b
+        Actual type: b -> b
+    • In the expression: f'
+      In an equation for ‘safeCoerce’:
+          safeCoerce
+            = f'
+            where
+                f :: d -> forall c. d
+                f x = x
+                f' = f
+    • Relevant bindings include
+        safeCoerce :: a -> b (bound at T14618.hs:6:1)
diff --git a/testsuite/tests/typecheck/should_fail/all.T b/testsuite/tests/typecheck/should_fail/all.T
index 553e10a..b1a0e75 100644
--- a/testsuite/tests/typecheck/should_fail/all.T
+++ b/testsuite/tests/typecheck/should_fail/all.T
@@ -462,3 +462,4 @@ test('T14325', normal, compile_fail, [''])
 test('T14350', normal, compile_fail, [''])
 test('T14390', normal, compile_fail, [''])
 test('MissingExportList03', normal, compile_fail, [''])
+test('T14618', normal, compile_fail, [''])



More information about the ghc-commits mailing list