From 38777c8687a42fabafec000882a14c51149811f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20B=C3=B6hm?= <mboe@informatik.uni-kiel.de> Date: Fri, 9 Aug 2013 18:48:45 +0200 Subject: [PATCH] in checkInstanceContextImpliesAllInstanceContextsOfSuperClasses: catch the case that there are duplicate instances in the source file --- src/Checks/TypeClassesCheck.hs | 12 +++++++----- test/test2.sh | 3 ++- .../typeclasses/TCCheck/DuplicateInstances2.curry | 15 +++++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 test/typeclasses/TCCheck/DuplicateInstances2.curry diff --git a/src/Checks/TypeClassesCheck.hs b/src/Checks/TypeClassesCheck.hs index dd7037fc..203deb55 100644 --- a/src/Checks/TypeClassesCheck.hs +++ b/src/Checks/TypeClassesCheck.hs @@ -760,13 +760,13 @@ checkForInstanceDataTypeExistAlsoInstancesForSuperclasses _ _ _ _ -- |returns the instance from the class environment for the given instance -- declaration. This function must be called only after it has been checked -- that as well the class name and the type name are valid (i.e., in phase 3) -getInstance' :: ModuleIdent -> ClassEnv -> TCEnv -> Decl -> Instance +getInstance' :: ModuleIdent -> ClassEnv -> TCEnv -> Decl -> Maybe Instance getInstance' m cEnv tcEnv (InstanceDecl _p (SContext _scon) cls ty _tyvars _) = inst where tyId = fromJust $ tyConToQualIdent m tcEnv ty cls' = getCanonClassName m cEnv cls - inst = fromJust $ getInstance cEnv cls' tyId + inst = getInstanceWithOrigin cEnv m cls' tyId getInstance' _ _ _ _ = internalError "getInstance'" -- |Returns a Base.Types.Context for the given instance. The type @@ -795,7 +795,8 @@ checkInstanceContextImpliesAllInstanceContextsOfSuperClasses :: ClassEnv -> TCEnv -> ModuleIdent -> Decl -> Tcc () checkInstanceContextImpliesAllInstanceContextsOfSuperClasses cEnv tcEnv m inst@(InstanceDecl p _scon cls ty _tyvars _) - = let inst' = getInstance' m cEnv tcEnv inst + = let inst0 = getInstance' m cEnv tcEnv inst + inst' = fromJust inst0 thisContext = getContextFromInst inst' scs = allSuperClasses cEnv (getCanonClassName m cEnv cls) tyId = tyConToQualIdent m tcEnv ty @@ -810,8 +811,9 @@ checkInstanceContextImpliesAllInstanceContextsOfSuperClasses cEnv tcEnv m instCxs' = getSContextFromContext instCxs (typeVars inst') notImplCxs = (filter (not . implies cEnv thisContext) instCxs) notImplCxs' = getSContextFromContext notImplCxs (typeVars inst') in - when (isJust tyId) $ unless (implies' cEnv thisContext instCxs) $ report $ - errContextNotImplied p thisContext' instCxs' notImplCxs' + -- catch the case that there are duplicate local instances + when (isJust tyId && isJust inst0) $ unless (implies' cEnv thisContext instCxs) $ + report $ errContextNotImplied p thisContext' instCxs' notImplCxs' checkInstanceContextImpliesAllInstanceContextsOfSuperClasses _ _ _ _ = internalError "checkInstanceContextImpliesAllInstanceContextsOfSuperClasses" diff --git a/test/test2.sh b/test/test2.sh index 91c57fea..752f03d9 100644 --- a/test/test2.sh +++ b/test/test2.sh @@ -62,7 +62,8 @@ for file in checkCorrectTypeVarsInTypeSigs CheckRulesInClass CheckRulesInInstanc ContextImplication ContextsInClassMethodTypeSigs Cycles directCycle \ doubleClassMethods duplicateClassNames duplicateInstances InstanceConstraints \ instanceDataTypeCorrect InstanceTypeVarsDoNotAppearTwice SuperclassInstances \ - typeVarsInInstContext typeVarsInTySigContext TyVarInContext AmbiguousInstancesUse + typeVarsInInstContext typeVarsInTySigContext TyVarInContext AmbiguousInstancesUse \ + DuplicateInstances2 do echo $file >> tmp.txt if [ ! -r typeclasses/TCCheck/$file.curry ]; then echo "*********** file doesn't exist: $file"; fi diff --git a/test/typeclasses/TCCheck/DuplicateInstances2.curry b/test/typeclasses/TCCheck/DuplicateInstances2.curry new file mode 100644 index 00000000..168603de --- /dev/null +++ b/test/typeclasses/TCCheck/DuplicateInstances2.curry @@ -0,0 +1,15 @@ + +class C a where + +class C a => D a where + +data T a = T a + +class F a where + +instance F a => C (T a) where + +instance F a => D (T a) where + +instance F a => D (T a) where + -- GitLab