diff options
author | Matthew Pickering <matthewtpickering@gmail.com> | 2017-06-23 11:40:50 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2017-06-23 11:40:51 -0400 |
commit | 9077120918b78f5152bf3596fe6df07b91cead79 (patch) | |
tree | 30e4532f9a714d88ae9242dd1fb2f5c3a3b58063 /compiler | |
parent | 3c4537ea1c940966eddcb9cb418bf8e39b8f0f1c (diff) | |
download | haskell-9077120918b78f5152bf3596fe6df07b91cead79.tar.gz |
Use actual universal tvs in check for naughty record selectors
The naughty record selector check means to limit selectors which would
lead to existential tyvars escaping their scope. With record pattern
synonyms, there are situations where universal tyvars don't appear in
the result type, for example:
```
pattern ReadP :: Read a => a -> String
pattern ReadP{readp} <- (read -> readp)
```
This is a similar issue to #11224 where we assumed that we can decide
which variables are universal and which are existential by the syntactic
check of seeing which appear in the result type. The fix is to use
`univ_tvs` from `conLikeFullSig` rather than the previous approximation.
But we must also remember to apply `EqSpec`s so we use the free
variables from `inst_tys` which is precisely `univ_tvs` with `EqSpecs`
applied.
Reviewers: austin, bgamari
Reviewed By: bgamari
Subscribers: rwbarton, thomie
Differential Revision: https://phabricator.haskell.org/D3649
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/typecheck/TcTyDecls.hs | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/compiler/typecheck/TcTyDecls.hs b/compiler/typecheck/TcTyDecls.hs index df33bb0f16..68e15fbd48 100644 --- a/compiler/typecheck/TcTyDecls.hs +++ b/compiler/typecheck/TcTyDecls.hs @@ -846,7 +846,7 @@ mkOneRecordSelector all_cons idDetails fl -- Selector type; Note [Polymorphic selectors] field_ty = conLikeFieldType con1 lbl - data_tvs = tyCoVarsOfTypeWellScoped data_ty + data_tvs = tyCoVarsOfTypesWellScoped inst_tys data_tv_set= mkVarSet data_tvs is_naughty = not (tyCoVarsOfType field_ty `subVarSet` data_tv_set) (field_tvs, field_theta, field_tau) = tcSplitSigmaTy field_ty |