Type checking for type synonym families
[ghc-hetmet.git] / compiler / typecheck / TcClassDcl.lhs
index f43a4d7..67f2945 100644 (file)
@@ -425,7 +425,7 @@ mkMethId origin clas sel_id inst_tys
        rho_ty       = ASSERT( length tyvars == length inst_tys )
                       substTyWith tyvars inst_tys rho
        (preds,tau)  = tcSplitPhiTy rho_ty
-        first_pred   = head preds
+        first_pred   = ASSERT( not (null preds)) head preds
     in
        -- The first predicate should be of form (C a b)
        -- where C is the class in question
@@ -452,8 +452,7 @@ mkMethId origin clas sel_id inst_tys
        getSrcSpanM                     `thenM` \ loc ->
        let 
            real_tau = mkPhiTy (tail preds) tau
-           meth_id  = mkUserLocal (getOccName sel_id) uniq real_tau 
-                       (srcSpanStart loc) --TODO
+           meth_id  = mkUserLocal (getOccName sel_id) uniq real_tau loc
        in
        returnM (Nothing, meth_id)
 
@@ -529,7 +528,7 @@ mkDefMethRhs origin clas inst_tys sel_id loc GenDefMeth
          -- case we require that the instance decl is for a single-parameter
          -- type class with type variable arguments:
          --    instance (...) => C (T a b)
-    clas_tyvar    = head (classTyVars clas)
+    clas_tyvar    = ASSERT (not (null (classTyVars clas))) head (classTyVars clas)
     Just tycon   = maybe_tycon
     maybe_tycon   = case inst_tys of 
                        [ty] -> case tcSplitTyConApp_maybe ty of
@@ -707,7 +706,7 @@ mkGenericInstance clas (hs_ty, binds)
        -- Make the dictionary function.
     getSrcSpanM                                                `thenM` \ span -> 
     getOverlapFlag                                     `thenM` \ overlap_flag -> 
-    newDFunName clas [inst_ty] (srcSpanStart span)     `thenM` \ dfun_name ->
+    newDFunName clas [inst_ty] span                    `thenM` \ dfun_name ->
     let
        inst_theta = [mkClassPred clas [mkTyVarTy tv] | tv <- tyvars]
        dfun_id    = mkDictFunId dfun_name tyvars inst_theta clas [inst_ty]
@@ -734,7 +733,7 @@ tcAddDeclCtxt decl thing_inside
                                 else "data type" ++ maybeInst
           | isFamilyDecl decl = "family"
 
-     maybeInst | isFamInstDecl decl = " family"
+     maybeInst | isFamInstDecl decl = " instance"
               | otherwise          = ""
 
      ctxt = hsep [ptext SLIT("In the"), text thing, 
@@ -767,7 +766,7 @@ badGenericInstance sel_id because
 notSimple inst_tys
   = vcat [ptext SLIT("because the instance type(s)"), 
          nest 2 (ppr inst_tys),
-         ptext SLIT("is not a simple type of form (T a b c)")]
+         ptext SLIT("is not a simple type of form (T a1 ... an)")]
 
 notGeneric tycon
   = vcat [ptext SLIT("because the instance type constructor") <+> quotes (ppr tycon) <+>