Use actual universal tvs in check for naughty record selectors
authorMatthew Pickering <matthewtpickering@gmail.com>
Fri, 23 Jun 2017 15:40:50 +0000 (11:40 -0400)
committerBen Gamari <ben@smart-cactus.org>
Fri, 23 Jun 2017 15:40:51 +0000 (11:40 -0400)
commit9077120918b78f5152bf3596fe6df07b91cead79
tree30e4532f9a714d88ae9242dd1fb2f5c3a3b58063
parent3c4537ea1c940966eddcb9cb418bf8e39b8f0f1c
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
compiler/typecheck/TcTyDecls.hs
testsuite/tests/patsyn/should_run/records-run.hs
testsuite/tests/patsyn/should_run/records-run.stdout