Declarations processed in unexpected order in the presence of TH declaration splices
In ghc-7.8 reify returns only first data type that have an instance, here is a code:
Test.hs
{-# LANGUAGE TemplateHaskell #-}
module Test where
import Language.Haskell.TH
class C a
inner :: ExpQ
inner = do
ClassI _ instances <- reify ''C
let sh = show instances
[| sh |]
def :: String -> DecsQ
def x =
let dn = mkName x
in do dt <- dataD (cxt []) dn [] [] []
i <- instanceD (cxt []) (appT (conT ''C) (conT dn)) [] -- [d| instance C $(cn) |]
return [dt,i]
test :: ExpQ
test = [| print $inner |]
test.hs
{-# LANGUAGE TemplateHaskell #-}
import Test
def "A"
def "B"
main = $(test)
running test returns:
"[InstanceD [] (AppT (ConT Test.C) (ConT Main.A)) []]"
under 7.6 test returns:
"[InstanceD [] (AppT (ConT Test.C) (ContT Main.B) [], InstanceD [] (AppT (ConT Test.C) (ConT Main.A) []]"
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.8.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |
Edited by Richard Eisenberg