Skip to content

Multiple declarations of uniquely generated name

I originally reported this problem in the syb-with-class bug tracker but I think it's a bug in TH possibly related to #5362 (closed).

After increasing the version range of template-haskell in syb-with-class to:

template-haskell >= 2.4 && < 2.7

the package fails to build on ghc-7.2.1 with the following error:

$ cabal build --ghc-option=-ddump-splices
Preprocessing library syb-with-class-0.6.1.2...
Building syb-with-class-0.6.1.2...
[4 of 4] Compiling Data.Generics.SYB.WithClass.Instances ( Data/Generics/SYB/WithClass/Instances.hs, dist/build/Data/Generics/SYB/WithClass/Instances.o )
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package array-0.3.0.3 ... linking ... done.
Loading package containers-0.4.1.0 ... linking ... done.
Loading package pretty-1.1.0.0 ... linking ... done.
Loading package template-haskell ... linking ... done.
Loading package bytestring-0.9.2.0 ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Data/Generics/SYB/WithClass/Instances.hs:1:1: Splicing declarations
    deriveTypeable ['DataType]
  ======>
    Data/Generics/SYB/WithClass/Instances.hs:544:3-29
    instance Typeable DataType where
        { typeOf _
            = mkTyConApp
                (mkTyCon "Data.Generics.SYB.WithClass.Basics.DataType")
                ghc-prim:GHC.Types.[] }
Data/Generics/SYB/WithClass/Instances.hs:1:1: Splicing declarations
    deriveData ['ByteString]
  ======>
    Data/Generics/SYB/WithClass/Instances.hs:726:4-28
    constr_a2Ya :: Constr
    constr_a2Ya = mkConstr dataType_a2Y9 "PS" [] Prefix
    dataType_a2Y9 :: DataType
    dataType_a2Y9 = mkDataType "ByteString" [constr_a2Ya]
    instance (Data ctx (ForeignPtr Word8),
              Data ctx Int,
              Sat (ctx ByteString),
              Sat (ctx (ForeignPtr Word8)),
              Sat (ctx Int)) =>
             Data ctx ByteString where
        { gfoldl _ _f_a2Yb z_a2Yc x_a2Yd
            = case x_a2Yd of {
                Data.ByteString.Internal.PS arg_a2Ye arg_a2Yf arg_a2Yg
                  -> _f_a2Yb
                       (_f_a2Yb
                          (_f_a2Yb (z_a2Yc Data.ByteString.Internal.PS) arg_a2Ye) arg_a2Yf)
                       arg_a2Yg }
          gunfold _ _k_a2Yh z_a2Yi c_a2Yj
            = case constrIndex c_a2Yj of {
                1 -> _k_a2Yh
                       (_k_a2Yh (_k_a2Yh (z_a2Yi Data.ByteString.Internal.PS)))
                _ -> error "gunfold: fallthrough" }
          toConstr _ x_a2Yk
            = case x_a2Yk of {
                Data.ByteString.Internal.PS _ _ _ -> constr_a2Ya }
          dataTypeOf _ _ = dataType_a2Y9 }
Data/Generics/SYB/WithClass/Instances.hs:1:1: Splicing declarations
    deriveData ['L.ByteString]
  ======>
    Data/Generics/SYB/WithClass/Instances.hs:727:4-30
    constr_a30f :: Constr
    constr_a30f = mkConstr dataType_a30e "Empty" [] Prefix
    constr_a30g :: Constr
    constr_a30g = mkConstr dataType_a30e "Chunk" [] Prefix
    dataType_a30e :: DataType
    dataType_a30e = mkDataType "ByteString" [constr_a30f, constr_a30g]
    instance (Data ctx ByteString,
              Data ctx L.ByteString,
              Sat (ctx L.ByteString),
              Sat (ctx ByteString)) =>
             Data ctx L.ByteString where
        { gfoldl _ _f_a30h z_a30i x_a30j
            = case x_a30j of {
                Data.ByteString.Lazy.Internal.Empty
                  -> z_a30i Data.ByteString.Lazy.Internal.Empty
                Data.ByteString.Lazy.Internal.Chunk arg_a30k arg_a30l
                  -> _f_a30h
                       (_f_a30h (z_a30i Data.ByteString.Lazy.Internal.Chunk) arg_a30k)
                       arg_a30l }
          gunfold _ _k_a30m z_a30n c_a30o
            = case constrIndex c_a30o of {
                1 -> z_a30n Data.ByteString.Lazy.Internal.Empty
                2 -> _k_a30m (_k_a30m (z_a30n Data.ByteString.Lazy.Internal.Chunk))
                _ -> error "gunfold: fallthrough" }
          toConstr _ x_a30p
            = case x_a30p of {
                Data.ByteString.Lazy.Internal.Empty -> constr_a30f
                Data.ByteString.Lazy.Internal.Chunk _ _ -> constr_a30g }
          dataTypeOf _ _ = dataType_a30e }

Data/Generics/SYB/WithClass/Instances.hs:727:4:
    Multiple declarations of `dataType'
    Declared at: Data/Generics/SYB/WithClass/Instances.hs:726:4
                 Data/Generics/SYB/WithClass/Instances.hs:727:4

Data/Generics/SYB/WithClass/Instances.hs:727:4:
    Multiple declarations of `constr'
    Declared at: Data/Generics/SYB/WithClass/Instances.hs:726:4
                 Data/Generics/SYB/WithClass/Instances.hs:727:4
                 Data/Generics/SYB/WithClass/Instances.hs:727:4

The weird thing is that the generated names dataType_a2Y9, dataType_a30e, constr_a2Ya and constr_a30 are all unique.

Trac metadata
Trac field Value
Version 7.0.4
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Template Haskell
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information