OptCoercion: Ensure we use new UnivCo provenance to construct optimised cos.
authorBen Gamari <ben@smart-cactus.org>
Tue, 12 Jun 2018 17:31:08 +0000 (13:31 -0400)
committerBen Gamari <ben@smart-cactus.org>
Thu, 14 Jun 2018 14:03:28 +0000 (10:03 -0400)
@goldfire noticed that there were several points in OptOercion.opt_univ where
we constructed the optimised coercion using the untransformed provenance.

compiler/types/OptCoercion.hs

index e862271..ccad41b 100644 (file)
@@ -434,7 +434,7 @@ opt_univ env sym prov role oty1 oty2
       -- 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
-        arg_cos  = zipWith3 (mkUnivCo prov) roles tys1 tys2
+        arg_cos  = zipWith3 (mkUnivCo prov') roles tys1 tys2
         arg_cos' = zipWith (opt_co4 env sym False) roles arg_cos
     in
     mkTyConAppCo role tc1 arg_cos'
@@ -446,13 +446,13 @@ opt_univ env sym prov role oty1 oty2
       -- NB: prov isn't interesting here either
   = let k1   = tyVarKind tv1
         k2   = tyVarKind tv2
-        eta  = mkUnivCo prov Nominal k1 k2
+        eta  = mkUnivCo prov' Nominal k1 k2
           -- eta gets opt'ed soon, but not yet.
         ty2' = substTyWith [tv2] [TyVarTy tv1 `mkCastTy` eta] ty2
 
         (env', tv1', eta') = optForAllCoBndr env sym tv1 eta
     in
-    mkForAllCo tv1' eta' (opt_univ env' sym prov role ty1 ty2')
+    mkForAllCo tv1' eta' (opt_univ env' sym prov' role ty1 ty2')
 
   | otherwise
   = let ty1 = substTyUnchecked (lcSubstLeft  env) oty1