[GHC] #10246: Literal Pattern match loses order

GHC ghc-devs at haskell.org
Mon Apr 6 07:33:58 UTC 2015


#10246: Literal Pattern match loses order
-------------------------------------+-------------------------------------
              Reporter:  nomeata     |             Owner:
                  Type:  bug         |            Status:  new
              Priority:  normal      |         Milestone:
             Component:  Compiler    |           Version:  7.10.1
              Keywords:              |  Operating System:  Unknown/Multiple
          Architecture:              |   Type of failure:  None/Unknown
  Unknown/Multiple                   |        Blocked By:
             Test Case:              |   Related Tickets:
              Blocking:              |
Differential Revisions:              |
-------------------------------------+-------------------------------------
 I found this long-standing bug while investigating #10245:

 Consider this code:
 {{{
 f1 :: Int -> String
 f1 n = case n of
   0 -> "bar"
   0x10000000000000000 -> "foo"
   _ -> "c"
 {-# NOINLINE f1 #-}

 g1 :: Int -> String
 g1 n = if n == 0 then "bar" else
        if n == 0x10000000000000000 then  "foo" else
        "c"
 {-# NOINLINE g1 #-}

 f2 :: Int -> String
 f2 n = case n of
   0x10000000000000000 -> "foo"
   0 -> "bar"
   _ -> "c"
 {-# NOINLINE f2 #-}

 g2 :: Int -> String
 g2 n = if n == 0x10000000000000000 then  "foo" else
        if n == 0 then "bar" else
        "c"
 {-# NOINLINE g2 #-}

 main = do
     let i = read "0" :: Int
     print (f1 i)
     print (g1 i)
     print (f2 i)
     print (g2 i)
 }}}

 According to the report, `f1` should behave like `g1` and `f2` should
 behave like `g2`. But that is not the case: I get
 {{{
 "foo"
 "bar"
 "foo"
 "foo"
 }}}

 The reason is that the branches are sorted, to create fancy code for it,
 but this does not take into account that `0x10000000000000000 = 0`, at
 least for `Int`.

 This bug is present also in 7.8.4, and not (directly) related to my
 CmmSwitch code: It can also be observed with interpreted code, so the fix
 must happen earlier.

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


More information about the ghc-tickets mailing list