[GHC] #11698: GHC's tct_closed flag is not being set correctly
GHC
ghc-devs at haskell.org
Thu Mar 10 21:47:56 UTC 2016
#11698: GHC's tct_closed flag is not being set correctly
-------------------------------------+-------------------------------------
Reporter: simonpj | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.3
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
The `Note [Bindings with closed types]` in `TcEnv` describes when a
binding is "closed", which in turn affects generalisation. (See the Note
for details.)
But the implementation doesn't follow the Note. Instead it uses this
function in `TcEnv`:
{{{
isClosedLetBndr :: Id -> TopLevelFlag
-- See Note [Bindings with closed types] in TcRnTypes
-- Note that we decided if a let-bound variable is closed by
-- looking at its type, which is slightly more liberal, and a whole
-- lot easier to implement, than looking at its free variables
isClosedLetBndr id
| isEmptyVarSet (tyCoVarsOfType (idType id)) = TopLevel
| otherwise = NotTopLevel
}}}
It may be easier but it's also wrong. Consider
{{{
f x = ( let g y = x+y in ...
, x::Int)
}}}
Is `g` closed (which affects how definitions in `...` are generalised)?
Well if we typecheck the second element of the tuple first, we may "know"
that `x::Int` by the time we are inferring a type for `g`, conclude that
`g` has no free type variables, and say that it is closed.
But if we do the `x::Int` part second, so while type checking the `let` we
think that `x::alpha`, then we'll say that `g` is open.
This looks nasty. I think we should do it the way the `Note` says.
Thanks to Facundo for pointing this out. Not urgent, but plainly wrong.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11698>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list