Reify data family instances correctly.
authorRichard Eisenberg <eir@cis.upenn.edu>
Mon, 20 Oct 2014 19:36:57 +0000 (15:36 -0400)
committerRichard Eisenberg <eir@cis.upenn.edu>
Tue, 21 Oct 2014 13:20:45 +0000 (09:20 -0400)
Summary:
Fix #9692.

The reifier didn't account for the possibility that data/newtype
instances are sometimes eta-reduced. It now eta-expands as necessary.

Test Plan: th/T9692

Reviewers: simonpj, austin

Subscribers: thomie, carter, ezyang, simonmar

Differential Revision: https://phabricator.haskell.org/D355

compiler/typecheck/TcSplice.lhs

index bb6af8c..e952a27 100644 (file)
@@ -1338,8 +1338,16 @@ reifyFamilyInstance (FamInst { fi_flavor = flavor
       DataFamilyInst rep_tc ->
         do { let tvs = tyConTyVars rep_tc
                  fam' = reifyName fam
+
+                   -- eta-expand lhs types, because sometimes data/newtype
+                   -- instances are eta-reduced; See Trac #9692
+                   -- See Note [Eta reduction for data family axioms]
+                   -- in TcInstDcls
+                 (_rep_tc, rep_tc_args) = splitTyConApp rhs
+                 etad_tyvars            = dropList rep_tc_args tvs
+                 eta_expanded_lhs = lhs `chkAppend` mkTyVarTys etad_tyvars
            ; cons <- mapM (reifyDataCon (mkTyVarTys tvs)) (tyConDataCons rep_tc)
-           ; th_tys <- reifyTypes lhs
+           ; th_tys <- reifyTypes (filter (not . isKind) eta_expanded_lhs)
            ; return (if isNewTyCon rep_tc
                      then TH.NewtypeInstD [] fam' th_tys (head cons) []
                      else TH.DataInstD    [] fam' th_tys cons        []) }