@@ -90,6 +90,15 @@ addTypeClassDictionaries :: [TypeClassDictionaryInScope] -> Check ()
90addTypeClassDictionaries entries = do
90addTypeClassDictionaries entries = do
91 modify $ \st -> st { checkEnv = (checkEnv st) { typeClassDictionaries = entries ++ (typeClassDictionaries . checkEnv $ st) } }
91 modify $ \st -> st { checkEnv = (checkEnv st) { typeClassDictionaries = entries ++ (typeClassDictionaries . checkEnv $ st) } }
93+checkTypeClassInstance :: ModuleName -> Type -> Check ()
94+checkTypeClassInstance _ (TypeVar _) = return ()
95+checkTypeClassInstance m (TypeConstructor ctor) = do
97+ when (canonicalizeType m env ctor `M.member` typeSynonyms env) $ throwError "Type synonym instances are disallowed"
99+checkTypeClassInstance m (TypeApp ty (TypeVar _)) = checkTypeClassInstance m ty
100+checkTypeClassInstance _ _ = throwError "Type class instance must be of the form T a1 ... an"
94-- Type check all declarations in a module
103-- Type check all declarations in a module
@@ -242,6 +251,8 @@ typeCheckAll moduleName (d@(TypeClassDeclaration _ _ _) : rest) = do
242typeCheckAll moduleName (d@(TypeInstanceDeclaration deps className ty _) : rest) = do
251typeCheckAll moduleName (d@(TypeInstanceDeclaration deps className ty _) : rest) = do
243 env <- getEnv
252 env <- getEnv
244 dictName <- Check . lift $ mkDictionaryValueName moduleName className ty
253 dictName <- Check . lift $ mkDictionaryValueName moduleName className ty
254+ checkTypeClassInstance moduleName ty
255+ forM_ deps $ checkTypeClassInstance moduleName . snd
245 addTypeClassDictionaries (qualifyAllUnqualifiedNames moduleName env
256 addTypeClassDictionaries (qualifyAllUnqualifiedNames moduleName env
246 [TypeClassDictionaryInScope (Qualified (Just moduleName) dictName) className ty (Just deps) TCDRegular])
257 [TypeClassDictionaryInScope (Qualified (Just moduleName) dictName) className ty (Just deps) TCDRegular])
247 ds <- typeCheckAll moduleName rest
258 ds <- typeCheckAll moduleName rest