summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorBartosz Nitka <niteria@gmail.com>2015-11-11 12:31:55 +0100
committerBen Gamari <ben@smart-cactus.org>2015-11-11 12:32:05 +0100
commit0f49508399a1fc145e17950ea1591da7f0de4f2a (patch)
tree60cacb1e916a4f6591e2fbac6e0fca91407b1b96 /compiler
parentfa61eddebf6f3ad5671c81f8bf0494e81332c4ec (diff)
downloadhaskell-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.hs11
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]