Skip to content

Nested SPECIALIZEd functions cause error: "Symbol _BadUTF8_zdf1_closure already defined."

The utf8-string package (in particular, the module Code.Binary.UTF8.Generic) does not compile under ghc-6.9.20080825.

I tried stripping down that module and believe the problem occurs when a SPECIALIZEd function calls another SPECIALIZEd function:

{-# LANGUAGE FlexibleInstances #-}
module BadUTF8 where

import Data.Word

class UTF8Bytes b where

instance UTF8Bytes [Word8] where

{-# SPECIALIZE myfoldr :: (Char -> a -> a) -> a -> [Word8]      -> a #-}
myfoldr :: UTF8Bytes b => (Char -> a -> a) -> a -> b -> a
myfoldr _ x _ = x

{-# SPECIALIZE toString :: [Word8] -> String #-}
toString :: UTF8Bytes b => b -> String
toString bs = myfoldr (:) [] bs

Compiling using ghc-6.9.20080825 without -O, or ghc-6.8.3 with or without -O, does not produce an error. However, ghc-6.9.20080825 with optimization produces:

judah-jacobsons-computer:tmp judah$ ~/tmp/ghc-stage/bin/ghc --make -O BadUTF8.hs
[1 of 1] Compiling BadUTF8          ( BadUTF8.hs, BadUTF8.o )

/var/folders/Pm/Pm4yd68oG4qqe-gsgn56W++++TI/-Tmp-/ghc88501_0/ghc88501_0.s:81:0:
    FATAL:Symbol _BadUTF8_zdf1_closure already defined.
Trac metadata
Trac field Value
Version 6.9
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
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