From 623e5fbbbec02e1cc5d80f0685919ecb6b845d35 Mon Sep 17 00:00:00 2001 From: simonpj Date: Mon, 5 Jan 2004 09:35:39 +0000 Subject: [PATCH] [project @ 2004-01-05 09:35:39 by simonpj] Buglet in desugaring instance declarations --- ghc/compiler/deSugar/DsMeta.hs | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/ghc/compiler/deSugar/DsMeta.hs b/ghc/compiler/deSugar/DsMeta.hs index 31a8a0d..4bcb32e 100644 --- a/ghc/compiler/deSugar/DsMeta.hs +++ b/ghc/compiler/deSugar/DsMeta.hs @@ -213,20 +213,24 @@ repTyClD (L loc d) = do { dsWarn (loc, hang msg 4 (ppr d)) ; where msg = ptext SLIT("Cannot desugar this Template Haskell declaration:") -repInstD' (L loc (InstDecl ty binds _)) - -- Ignore user pragmas for now - = do { cxt1 <- repContext cxt - ; inst_ty1 <- repPred (HsClassP cls tys) - ; ss <- mkGenSyms (collectHsBindBinders binds) - ; binds1 <- addBinds ss (rep_binds binds) - ; decls1 <- coreList decQTyConName binds1 - ; decls2 <- wrapNongenSyms ss decls1 - -- wrapNonGenSyms: do not clone the class op names! - -- They must be called 'op' etc, not 'op34' - ; i <- repInst cxt1 inst_ty1 decls2 +repInstD' (L loc (InstDecl ty binds _)) -- Ignore user pragmas for now + = do { i <- addTyVarBinds tvs $ \tv_bndrs -> + -- We must bring the type variables into scope, so their occurrences + -- don't fail, even though the binders don't appear in the resulting + -- data structure + do { cxt1 <- repContext cxt + ; inst_ty1 <- repPred (HsClassP cls tys) + ; ss <- mkGenSyms (collectHsBindBinders binds) + ; binds1 <- addBinds ss (rep_binds binds) + ; decls1 <- coreList decQTyConName binds1 + ; decls2 <- wrapNongenSyms ss decls1 + -- wrapNonGenSyms: do not clone the class op names! + -- They must be called 'op' etc, not 'op34' + ; repInst cxt1 inst_ty1 decls2 } + ; return (loc, i)} where - (_, cxt, cls, tys) = splitHsInstDeclTy (unLoc ty) + (tvs, cxt, cls, tys) = splitHsInstDeclTy (unLoc ty) ------------------------------------------------------- -- Constructors -- 1.7.10.4