
#12785: GHC panic, `tcTyVarDetails` is missing a case -------------------------------------+------------------------------------- Reporter: heisenbug | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple crash or panic | Test Case: yes Blocked By: | Blocking: Related Tickets: #12590 | Differential Rev(s): Phab:D2931 Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): OK I have worked it out. We use `tyCoVarsOfType`, `tyCoVarsOfCt` etc to extract the free type variables of a type or constraint. We don't have functions `tyVarsOfType` etc; they would be simple to write, but we don't have them. That means that we may get unwanted coercion variables floating around in the result set. This is annoying, and one alternative would be to add a family of functions returning tyvars. But returning the coercion variables (which appear in casts in types) actually causes no trouble ''provided all the "is" functions return False for coercion variables''. For example, {{{ promoteTyVar tclvl tv | isFloatedTouchableMetaTyVar tclvl tv = ... | otherwise = return () }}} Here `tv` might be a coercion variable, but it'll be ignored provided `isFloatedTouchableMetaTyVar` ignores it. So I'm ok with revering the patch, but please can we add a big Note with those functions explaining why coercion variables can occur is happening? Incidentally, in `TcSimplify` we have this: {{{ ; let meta_tvs = filter (isTyVar <&&> isMetaTyVar) free_tvs ... -- The isTyVar needs to weed out coercion variables }}} Once `isMetaTyVar` filters out coercion variables, we can remove the `isTyVar` here. Reid: over to you. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12785#comment:11 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler