diff options
author | Bartosz Nitka <niteria@gmail.com> | 2015-11-11 12:31:55 +0100 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2015-11-11 12:32:05 +0100 |
commit | 0f49508399a1fc145e17950ea1591da7f0de4f2a (patch) | |
tree | 60cacb1e916a4f6591e2fbac6e0fca91407b1b96 /compiler | |
parent | fa61eddebf6f3ad5671c81f8bf0494e81332c4ec (diff) | |
download | haskell-0f49508399a1fc145e17950ea1591da7f0de4f2a.tar.gz |
Put kind variables before type variables when specializing
When you reverse the order of uniques you get the core lint
error from the testcase. The testcase is copied from
tests/simplCore/should_compile/T10689a.hs.
The problem is that we would put type and kind variables ordered by
unique order, which happened to be the right order for this testcase to
pass under normal conditions.
I think it's enough to sort them with `sortQuantVars`, but I'm not
really sure if some more sophisticated dependency analysis isn't needed.
Test Plan: added a new testcase
Reviewers: simonpj, goldfire, simonmar, austin, bgamari
Reviewed By: bgamari
Subscribers: thomie
Differential Revision: https://phabricator.haskell.org/D1457
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/specialise/SpecConstr.hs | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/compiler/specialise/SpecConstr.hs b/compiler/specialise/SpecConstr.hs index cb3830bb6b..b3adc36e02 100644 --- a/compiler/specialise/SpecConstr.hs +++ b/compiler/specialise/SpecConstr.hs @@ -37,7 +37,7 @@ import Type hiding ( substTy ) import TyCon ( isRecursiveTyCon, tyConName ) import Id import PprCore ( pprParendExpr ) -import MkCore ( mkImpossibleExpr ) +import MkCore ( mkImpossibleExpr, sortQuantVars ) import Var import VarEnv import VarSet @@ -1843,10 +1843,11 @@ callToPats env bndr_occs (Call _ args con_env) -- See Note [Free type variables of the qvar types] -- See Note [Shadowing] at the top - (tvs, ids) = partition isTyVar qvars - qvars' = tvs ++ map sanitise ids - -- Put the type variables first; the type of a term - -- variable may mention a type variable + (ktvs, ids) = partition isTyVar qvars + qvars' = sortQuantVars ktvs ++ map sanitise ids + -- Order into kind variables, type variables, term variables + -- The kind of a type variable may mention a kind variable + -- and the type of a term variable may mention a type variable sanitise id = id `setIdType` expandTypeSynonyms (idType id) -- See Note [Free type variables of the qvar types] |