Fix invariant in mkAppCoFlexible
authorSimon Peyton Jones <simonpj@microsoft.com>
Tue, 13 May 2014 12:17:19 +0000 (13:17 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Tue, 13 May 2014 12:17:31 +0000 (13:17 +0100)
mkAppCoFlexible was breaking the invariant that the head of a TyConAppCo cannot
be a type synonym.  This small patch fixes it.

compiler/types/Coercion.lhs

index 195bc4c..a8f9a2e 100644 (file)
@@ -948,7 +948,9 @@ mkAppCo co1 co2 = mkAppCoFlexible co1 Nominal co2
 mkAppCoFlexible :: Coercion -> Role -> Coercion -> Coercion
 mkAppCoFlexible (Refl r ty1) _ (Refl _ ty2)
   = Refl r (mkAppTy ty1 ty2)
-mkAppCoFlexible (Refl r (TyConApp tc tys)) r2 co2
+mkAppCoFlexible (Refl r ty1) r2 co2
+  | Just (tc, tys) <- splitTyConApp_maybe ty1
+    -- Expand type synonyms; a TyConAppCo can't have a type synonym (Trac #9102)
   = TyConAppCo r tc (zip_roles (tyConRolesX r tc) tys)
   where
     zip_roles (r1:_)  []        = [downgradeRole r1 r2 co2]