[commit: ghc] master: OptCoercion: Ensure that TyConApps match in arity (87ff5d4)

git at git.haskell.org git at git.haskell.org
Tue May 9 02:27:00 UTC 2017


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

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/87ff5d4f0f812bad118600df0156f980b91191c5/ghc

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

commit 87ff5d4f0f812bad118600df0156f980b91191c5
Author: Ben Gamari <bgamari.foss at gmail.com>
Date:   Mon May 8 17:40:50 2017 -0400

    OptCoercion: Ensure that TyConApps match in arity
    
    Previously OptCoercion would potentially change the type of UnivCo
    coercions of the shape,
    ```
    co :: TyCon arg1 ... argN ~ TyCon arg1' ... argN'
    ```
    where the arities of the left and right applications differ. In this
    case we
    would try to zip the two argument lists, meaning that one would get
    truncated.
    
    One would think this could never happen since it implies we are
    applying the
    same TyCon to two different numbers of arguments. However, it does
    arise in the
    case of applications of the `Any` tycon, which arises from the
    typechecker (in
    `Data.Typeable.Internal`) where we end up with an `UnsafeCo`,
    ```
    co :: Any (Any -> Any) Any ~ Any (Any -> Any)
    ```
    
    Test Plan: Validate
    
    Reviewers: simonpj, austin, goldfire
    
    Reviewed By: simonpj
    
    Subscribers: rwbarton, thomie
    
    GHC Trac Issues: #13658
    
    Differential Revision: https://phabricator.haskell.org/D3545


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

87ff5d4f0f812bad118600df0156f980b91191c5
 compiler/types/OptCoercion.hs | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/compiler/types/OptCoercion.hs b/compiler/types/OptCoercion.hs
index b1aa646..17ab302 100644
--- a/compiler/types/OptCoercion.hs
+++ b/compiler/types/OptCoercion.hs
@@ -364,6 +364,20 @@ opt_phantom env sym co
   where
     Pair ty1 ty2 = coercionKind co
 
+{- Note [Differing kinds]
+   ~~~~~~~~~~~~~~~~~~~~~~
+The two types may not have the same kind (although that would be very unusual).
+But even if they have the same kind, and the same type constructor, the number
+of arguments in a `CoTyConApp` can differ. Consider
+
+  Any :: forall k. k
+
+  Any * Int                      :: *
+  Any (*->*) Maybe Int  :: *
+
+Hence the need to compare argument lengths; see Trac #13658
+ -}
+
 opt_univ :: LiftingContext -> SymFlag -> UnivCoProvenance -> Role
          -> Type -> Type -> Coercion
 opt_univ env sym (PhantomProv h) _r ty1 ty2
@@ -378,6 +392,7 @@ opt_univ env sym prov role oty1 oty2
   | Just (tc1, tys1) <- splitTyConApp_maybe oty1
   , Just (tc2, tys2) <- splitTyConApp_maybe oty2
   , tc1 == tc2
+  , equalLength tys1 tys2 -- see Note [Differing kinds]
       -- NB: prov must not be the two interesting ones (ProofIrrel & Phantom);
       -- Phantom is already taken care of, and ProofIrrel doesn't relate tyconapps
   = let roles    = tyConRolesX role tc1



More information about the ghc-commits mailing list