Make AutoDeriveTypeable work for associated datatypes (fix #9999)
authorJose Pedro Magalhaes <dreixel@gmail.com>
Mon, 19 Jan 2015 13:36:03 +0000 (13:36 +0000)
committerJose Pedro Magalhaes <dreixel@gmail.com>
Mon, 19 Jan 2015 13:42:10 +0000 (13:42 +0000)
compiler/typecheck/TcDeriv.hs
testsuite/tests/typecheck/should_compile/T9999.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/all.T

index 10191ae..ae95f33 100644 (file)
@@ -561,11 +561,16 @@ deriveAutoTypeable auto_typeable done_specs tycl_decls
 
     do_one cls (L _ decl)
       = do { tc <- tcLookupTyCon (tcdName decl)
-           ; if (isTypeSynonymTyCon tc || isTypeFamilyTyCon tc
+           -- Traverse into class declarations to check if they have ATs (#9999)
+           ; ats <- if isClassDecl decl
+                    then concatMapM (do_one cls) (map (fmap FamDecl) (tcdATs decl))
+                    else return []
+           ; rest <- if (isTypeSynonymTyCon tc || isTypeFamilyTyCon tc
                                        || tyConName tc `elemNameSet` done_tcs)
-                 -- Do not derive Typeable for type synonyms or type families
-             then return []
-             else mkPolyKindedTypeableEqn cls tc }
+                     -- Do not derive Typeable for type synonyms or type families
+                     then return []
+                     else mkPolyKindedTypeableEqn cls tc
+          ; return (ats ++ rest) }
 
 ------------------------------------------------------------------
 deriveTyDecl :: LTyClDecl Name -> TcM [EarlyDerivSpec]
diff --git a/testsuite/tests/typecheck/should_compile/T9999.hs b/testsuite/tests/typecheck/should_compile/T9999.hs
new file mode 100644 (file)
index 0000000..656e913
--- /dev/null
@@ -0,0 +1,13 @@
+{-# LANGUAGE AutoDeriveTypeable, PolyKinds, TypeFamilies, StandaloneDeriving #-}
+
+module T9999 where
+
+import Data.Typeable
+
+data family F a
+
+class C a where
+  data F1 a
+  type F2 a
+
+main = typeRep (Proxy :: Proxy F) == typeRep (Proxy :: Proxy F1)
index 38c41f1..c292eaf 100644 (file)
@@ -440,3 +440,4 @@ test('T9892', normal, compile, [''])
 test('T9939', normal, compile, [''])
 test('T9973', normal, compile, [''])
 test('T9971', normal, compile, [''])
+test('T9999', normal, compile, [''])