Before this patch we were bogusly making to/from bindings for all data types
in the TcGblEnv. But that is wrong when we have multiple "chunks" of
bindings in Template Haskell. We should start from the declarations
themselves. Easy.
; insts2 <- mapM (genInst False overlap_flag) final_specs
-- Generate the generic to/from functions from each type declaration
; insts2 <- mapM (genInst False overlap_flag) final_specs
-- Generate the generic to/from functions from each type declaration
- ; gen_binds <- mkGenericBinds is_boot
+ ; gen_binds <- mkGenericBinds is_boot tycl_decls
; (inst_info, rn_binds, rn_dus) <- renameDeriv is_boot gen_binds (insts1 ++ insts2)
; dflags <- getDOpts
; (inst_info, rn_binds, rn_dus) <- renameDeriv is_boot gen_binds (insts1 ++ insts2)
; dflags <- getDOpts
clas_nm = className clas
-----------------------------------------
clas_nm = className clas
-----------------------------------------
-mkGenericBinds :: Bool -> TcM (LHsBinds RdrName)
-mkGenericBinds is_boot
+mkGenericBinds :: Bool -> [LTyClDecl Name] -> TcM (LHsBinds RdrName)
+mkGenericBinds is_boot tycl_decls
| is_boot
= return emptyBag
| otherwise
| is_boot
= return emptyBag
| otherwise
- = do { gbl_env <- getGblEnv
- ; let tcs = typeEnvTyCons (tcg_type_env gbl_env)
- ; return (unionManyBags [ mkTyConGenericBinds tc |
- tc <- tcs, tyConHasGenerics tc ]) }
+ = do { tcs <- mapM tcLookupTyCon [ tcdName d
+ | L _ d <- tycl_decls, isDataDecl d ]
+ ; return (unionManyBags [ mkTyConGenericBinds tc
+ | tc <- tcs, tyConHasGenerics tc ]) }
-- We are only interested in the data type declarations,
-- and then only in the ones whose 'has-generics' flag is on
-- The predicate tyConHasGenerics finds both of these
-- We are only interested in the data type declarations,
-- and then only in the ones whose 'has-generics' flag is on
-- The predicate tyConHasGenerics finds both of these