diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2020-12-02 10:27:47 +0000 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-12-08 15:31:41 -0500 |
commit | 62ed6957463a9c0f711ea698d7ed4371e00fb122 (patch) | |
tree | eb13107435b357117fda5e787ce4a70bd111a8f8 /testsuite/tests/gadt | |
parent | 8fac4b9333ef3607e75b4520d847054316cb8c2d (diff) | |
download | haskell-62ed6957463a9c0f711ea698d7ed4371e00fb122.tar.gz |
Fix kind inference for data types. Again.
This patch fixes several aspects of kind inference for data type
declarations, especially data /instance/ declarations
Specifically
1. In kcConDecls/kcConDecl make it clear that the tc_res_kind argument
is only used in the H98 case; and in that case there is no result
kind signature; and hence no need for the disgusting splitPiTys in
kcConDecls (now thankfully gone).
The GADT case is a bit different to before, and much nicer.
This is what fixes #18891.
See Note [kcConDecls: kind-checking data type decls]
2. Do not look at the constructor decls of a data/newtype instance
in tcDataFamInstanceHeader. See GHC.Tc.TyCl.Instance
Note [Kind inference for data family instances]. This was a
new realisation that arose when doing (1)
This causes a few knock-on effects in the tests suite, because
we require more information than before in the instance /header/.
New user-manual material about this in "Kind inference in data type
declarations" and "Kind inference for data/newtype instance
declarations".
3. Minor improvement in kcTyClDecl, combining GADT and H98 cases
4. Fix #14111 and #8707 by allowing the header of a data instance
to affect kind inferece for the the data constructor signatures;
as described at length in Note [GADT return types] in GHC.Tc.TyCl
This led to a modest refactoring of the arguments (and argument
order) of tcConDecl/tcConDecls.
5. Fix #19000 by inverting the sense of the test in new_locs
in GHC.Tc.Solver.Canonical.canDecomposableTyConAppOK.
Diffstat (limited to 'testsuite/tests/gadt')
-rw-r--r-- | testsuite/tests/gadt/SynDataRec.hs | 16 | ||||
-rw-r--r-- | testsuite/tests/gadt/all.T | 1 |
2 files changed, 17 insertions, 0 deletions
diff --git a/testsuite/tests/gadt/SynDataRec.hs b/testsuite/tests/gadt/SynDataRec.hs new file mode 100644 index 0000000000..021ed0ba17 --- /dev/null +++ b/testsuite/tests/gadt/SynDataRec.hs @@ -0,0 +1,16 @@ +{-# LANGUAGE KindSignatures, DataKinds, GADTs #-} + +module SynDataRec where + +-- This mutual recursion betwen a data type and +-- a type synonym is a little delicate. See +-- Note [GADT return types] in GHC.Tc.TyCl + +data Pass = Parsed | Renamed + +data GhcPass (c :: Pass) where + GhcPs :: GhcPs + GhcRn :: GhcRn + +type GhcPs = GhcPass 'Parsed +type GhcRn = GhcPass 'Renamed diff --git a/testsuite/tests/gadt/all.T b/testsuite/tests/gadt/all.T index 3c146820ae..05ec39f18e 100644 --- a/testsuite/tests/gadt/all.T +++ b/testsuite/tests/gadt/all.T @@ -121,3 +121,4 @@ test('T15558', normal, compile, ['']) test('T16427', normal, compile_fail, ['']) test('T17423', expect_broken(17423), compile_and_run, ['']) test('T18191', normal, compile_fail, ['']) +test('SynDataRec', normal, compile, ['']) |