Commit ff5ae6ab authored by simonpj@microsoft.com's avatar simonpj@microsoft.com
Browse files

Fix a pair of classic, but tricky, bugs in the type matcher; exposed by a program from Roman

parent f42d93f8
...@@ -123,7 +123,7 @@ match menv subst ty1 ty2 | Just ty1' <- tcView ty1 = match menv subst ty1' ty2 ...@@ -123,7 +123,7 @@ match menv subst ty1 ty2 | Just ty1' <- tcView ty1 = match menv subst ty1' ty2
| Just ty2' <- tcView ty2 = match menv subst ty1 ty2' | Just ty2' <- tcView ty2 = match menv subst ty1 ty2'
match menv subst (TyVarTy tv1) ty2 match menv subst (TyVarTy tv1) ty2
| tv1 `elemVarSet` me_tmpls menv | tv1' `elemVarSet` me_tmpls menv
= case lookupVarEnv subst tv1' of = case lookupVarEnv subst tv1' of
Nothing -- No existing binding Nothing -- No existing binding
| any (inRnEnvR rn_env) (varSetElems (tyVarsOfType ty2)) | any (inRnEnvR rn_env) (varSetElems (tyVarsOfType ty2))
...@@ -131,7 +131,7 @@ match menv subst (TyVarTy tv1) ty2 ...@@ -131,7 +131,7 @@ match menv subst (TyVarTy tv1) ty2
| not (typeKind ty2 `isSubKind` tyVarKind tv1) | not (typeKind ty2 `isSubKind` tyVarKind tv1)
-> Nothing -- Kind mis-match -> Nothing -- Kind mis-match
| otherwise | otherwise
-> Just (extendVarEnv subst tv1 ty2) -> Just (extendVarEnv subst tv1' ty2)
Just ty1' -- There is an existing binding; check whether ty2 matches it Just ty1' -- There is an existing binding; check whether ty2 matches it
| tcEqTypeX (nukeRnEnvL rn_env) ty1' ty2 | tcEqTypeX (nukeRnEnvL rn_env) ty1' ty2
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment