
#11098: TH mishandles type variables that begin with an underscore -------------------------------------+------------------------------------- Reporter: goldfire | Owner: jstolarek Type: bug | Status: new Priority: normal | Milestone: 8.0.1 Component: Template Haskell | Version: 7.10.2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by jstolarek): The problem arises in the parser, where we assume that when named wild cards are enabled then any type variables that starts with an underscore is a wild card: {{{ | tyvar {% do { nwc <- namedWildCardsEnabled -- (See Note [Unit tuples]) ; let tv@(Unqual name) = unLoc $1 ; return $ if (startsWithUnderscore name && nwc) then (sL1 $1 (mkNamedWildCardTy tv)) else (sL1 $1 (HsTyVar tv)) } } }}} My idea for the solution is to unconditionally create an `HsTyVar` in the parser and then be smart during renaming: {{{#!hs rnHsTyKi isType doc (HsTyVar rdr_name) = do { dflags <- getDynFlags ; let is_wild_card_name = startsWithUnderscore (rdrNameOcc rdr_name) wild_cards_enabled = xopt Opt_NamedWildCards dflags ; is_in_scope <- isJust `fmap` lookupOccRn_maybe rdr_name ; if is_wild_card_name && not is_in_scope && wild_cards_enabled then rnHsTyKi isType doc (HsWildCardTy (NamedWildCard rdr_name)) else do { name <- rnTyVar isType rdr_name ; return (HsTyVar name, unitFV name) } } }}} That however does not work - the names of variables seem to be in scope even when they were not explicitly declared using a `forall`. So the question is: how do I detect if a variable was introduced using a `forall`? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11098#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler