[GHC] #9711: Confusing errors when compiling text-1.2.0.0

GHC ghc-devs at haskell.org
Tue Oct 21 17:43:53 UTC 2014


#9711: Confusing errors when compiling text-1.2.0.0
----------------------------------+---------------------------------------
       Reporter:  asvyazin        |                   Owner:
           Type:  bug             |                  Status:  new
       Priority:  normal          |               Milestone:
      Component:  Compiler        |                 Version:  7.8.3
       Keywords:                  |        Operating System:  MacOS X
   Architecture:  x86_64 (amd64)  |         Type of failure:  None/Unknown
     Difficulty:  Unknown         |               Test Case:
     Blocked By:                  |                Blocking:
Related Tickets:                  |  Differential Revisions:
----------------------------------+---------------------------------------
 I was trying to install text-1.2.0.0 on my system (Mac OS X 10.7.5 Lion)
 through cabal (cabal-install-1.20.0.3, cabal-1.20.0.2) and got some
 compile errors:
 [29 of 43] Compiling Data.Text.IO     ( Data/Text/IO.hs,
 dist/build/Data/Text/IO.o )

 Data/Text/IO.hs:236:29:
     The last statement in a 'do' block must be an expression
       n1 <- writeCharBuf raw n '\r' writeCharBuf raw n1 '\n' >>= inner s'

 Data/Text/IO.hs:237:49:
     Not in scope: ‘n1’
     Perhaps you meant one of these: ‘n’ (line 230), ‘s1’ (line 228)

 Let's see what we have at 236 line of Data/Text/IO.hs:
 {{{#!hs
 writeBlocksCRLF :: Handle -> Buffer CharBufElem -> Stream Char -> IO ()
 writeBlocksCRLF h buf0 (Stream next0 s0 _len) = outer s0 buf0
  where
   outer s1 Buffer{bufRaw=raw, bufSize=len} = inner s1 (0::Int)
    where
     inner !s !n =
       case next0 s of
         Done -> commit n False{-no flush-} True{-release-} >> return ()
         Skip s' -> inner s' n
         Yield x s'
           | n + 1 >= len -> commit n True{-needs flush-} False >>= outer s
           | x == '\n'    -> do n1 <- writeCharBuf raw n '\r' -- 236 line
 is here!!!
                                writeCharBuf raw n1 '\n' >>= inner s'
           | otherwise    -> writeCharBuf raw n x >>= inner s'
     commit = commitBuffer h raw len
 }}}

 Seems legit… And if I rewrite this two lines as
 {{{#!hs
           | x == '\n'    -> do n1 <- writeCharBuf raw n '\r'; writeCharBuf
 raw n1 '\n' >>= inner s'
 }}}
 then ghc compiles them fine.
 Even more interesting - if I rewrite this lines as
 {{{#!hs
           | x == '\n' -> do n1 <- writeCharBuf raw n '\r'
                             writeCharBuf raw n1 '\n' >>= inner s'
 }}}
 then it compiles them too!
 Again, with context, look carefully:
 {{{#!hs
         Yield x s'
           | n + 1 >= len -> commit n True{-needs flush-} False >>= outer s
           | x == '\n'    -> do n1 <- writeCharBuf raw n '\r'
                                writeCharBuf raw n1 '\n' >>= inner s'
           | otherwise    -> writeCharBuf raw n x >>= inner s'
 }}}
 doesn't work.
 {{{#!hs
         Yield x s'
           | n + 1 >= len -> commit n True{-needs flush-} False >>= outer s
           | x == '\n' -> do n1 <- writeCharBuf raw n '\r'
                             writeCharBuf raw n1 '\n' >>= inner s'
           | otherwise    -> writeCharBuf raw n x >>= inner s'
 }}}
 works!
 Weird…

 P.S. GHC version 7.8.3, installed through homebrew

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9711>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list