
#9871: Template Haskell declaration splice causes subsequent declarations to fall out of scope -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Template Haskell | Version: 7.8.3 Keywords: | Operating System: Architecture: Unknown/Multiple | Unknown/Multiple Difficulty: Unknown | Type of failure: GHC Blocked By: | rejects valid program Related Tickets: | Test Case: | Blocking: | Differential Revisions: -------------------------------------+------------------------------------- When using Template Haskell to splice in {{{instance}}} declarations, it is possible to cause identifiers following it to fall out of scope: {{{#!hs -- DeriveJSON.hs {-# LANGUAGE TemplateHaskell #-} module DeriveJSON where import Data.Aeson.TH data ADT = ADT instance Show ADT where show = adtFun $(deriveJSON defaultOptions ''ADT) adtFun :: ADT -> String adtFun = undefined }}} {{{ghc DeriveJSON.hs}}} gives the following error: {{{ [1 of 1] Compiling DeriveJSON ( DeriveJSON.hs, DeriveJSON.o ) DeriveJSON.hs:10:18: Not in scope: ‘adtFun’ }}} Since {{{deriveJSON}}} simply returns a {{{Q [Dec]}}}, I don't see why this code shouldn't compile as is. I can find two workarounds at the moment: * Move the {{{instance Show ADT}}} declaration after the {{{$(deriveJSON defaultOptions ''ADT)}}} line. * Move the {{{$(deriveJSON defaultOptions ''ADT)}}} line after the {{{adtFun}}} function declaration. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9871 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler