[commit: ghc] wip/rae: Fix egregious duplication of vars in RnTypes (288427c)
git at git.haskell.org
git at git.haskell.org
Tue Aug 22 18:39:44 UTC 2017
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/rae
Link : http://ghc.haskell.org/trac/ghc/changeset/288427cb70f8ca72a73a2de7fb6e6b22574558a8/ghc
>---------------------------------------------------------------
commit 288427cb70f8ca72a73a2de7fb6e6b22574558a8
Author: Richard Eisenberg <rae at cs.brynmawr.edu>
Date: Wed Aug 16 15:07:16 2017 -0400
Fix egregious duplication of vars in RnTypes
RnTypes contains a fairly intricate algorith to extract the
kind and type variables of an HsType. This algorithm carefully
maintains the separation between type variables and kind variables
so that the difference between -XPolyKinds and -XTypeInType can
be respected.
But it stupidly just concatenated the lists at the end. If a variable
were used as both a type and a kind, the algorithm would produce
*both*! This led to all kinds of problems, including #13988.
test case: ghci/scripts/T13988
>---------------------------------------------------------------
288427cb70f8ca72a73a2de7fb6e6b22574558a8
compiler/rename/RnTypes.hs | 11 ++++++-----
testsuite/tests/ghci/scripts/T13988.hs | 8 ++++++++
testsuite/tests/ghci/scripts/T13988.script | 2 ++
testsuite/tests/ghci/scripts/T13988.stdout | 1 +
testsuite/tests/ghci/scripts/all.T | 1 +
5 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/compiler/rename/RnTypes.hs b/compiler/rename/RnTypes.hs
index cfe1517..df9ded2 100644
--- a/compiler/rename/RnTypes.hs
+++ b/compiler/rename/RnTypes.hs
@@ -1575,10 +1575,8 @@ extractHsTyRdrTyVars :: LHsType GhcPs -> RnM FreeKiTyVars
-- occurrence is returned.
-- See Note [Kind and type-variable binders]
extractHsTyRdrTyVars ty
- = do { FKTV kis tys <- extract_lty TypeLevel ty emptyFKTV
- ; return (FKTV (nubL kis)
- (nubL tys)) }
-
+ = do { fvs <- extract_lty TypeLevel ty emptyFKTV
+ ; return (rmDupsInRdrTyVars fvs) }
-- | Extracts free type and kind variables from types in a list.
-- When the same name occurs multiple times in the types, only the first
@@ -1598,7 +1596,10 @@ extractHsTysRdrTyVarsDups tys
-- | Removes multiple occurrences of the same name from FreeKiTyVars.
rmDupsInRdrTyVars :: FreeKiTyVars -> FreeKiTyVars
rmDupsInRdrTyVars (FKTV kis tys)
- = FKTV (nubL kis) (nubL tys)
+ = FKTV kis' tys'
+ where
+ kis' = nubL kis
+ tys' = nubL (filterOut (`elemRdr` kis') tys)
extractRdrKindSigVars :: LFamilyResultSig GhcPs -> RnM [Located RdrName]
extractRdrKindSigVars (L _ resultSig)
diff --git a/testsuite/tests/ghci/scripts/T13988.hs b/testsuite/tests/ghci/scripts/T13988.hs
new file mode 100644
index 0000000..54969ca
--- /dev/null
+++ b/testsuite/tests/ghci/scripts/T13988.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE TypeInType, GADTs #-}
+
+module T13988 where
+
+import Data.Kind
+
+data Foo (a :: k) where
+ MkFoo :: (k ~ Type) => Foo (a :: k)
diff --git a/testsuite/tests/ghci/scripts/T13988.script b/testsuite/tests/ghci/scripts/T13988.script
new file mode 100644
index 0000000..06aa686
--- /dev/null
+++ b/testsuite/tests/ghci/scripts/T13988.script
@@ -0,0 +1,2 @@
+:load T13988
+:type +v MkFoo
diff --git a/testsuite/tests/ghci/scripts/T13988.stdout b/testsuite/tests/ghci/scripts/T13988.stdout
new file mode 100644
index 0000000..a89ff33
--- /dev/null
+++ b/testsuite/tests/ghci/scripts/T13988.stdout
@@ -0,0 +1 @@
+MkFoo :: forall k (a :: k). (k ~ *) => Foo a
diff --git a/testsuite/tests/ghci/scripts/all.T b/testsuite/tests/ghci/scripts/all.T
index 48dc864..bbb9110 100755
--- a/testsuite/tests/ghci/scripts/all.T
+++ b/testsuite/tests/ghci/scripts/all.T
@@ -258,3 +258,4 @@ test('T13591', expect_broken(13591), ghci_script, ['T13591.script'])
test('T13699', normal, ghci_script, ['T13699.script'])
test('T13407', normal, ghci_script, ['T13407.script'])
test('T13963', normal, ghci_script, ['T13963.script'])
+test('T13988', normal, ghci_script, ['T13988.script'])
More information about the ghc-commits
mailing list