#4019: deriving Ord can produce incorrect and inefficient instances
---------------------------------+------------------------------------------
    Reporter:  rl                |        Owner:                             
        Type:  bug               |       Status:  new                        
    Priority:  normal            |    Milestone:  6.14.1                     
   Component:  Compiler          |      Version:  6.13                       
    Keywords:                    |   Difficulty:                             
          Os:  Unknown/Multiple  |     Testcase:                             
Architecture:  Unknown/Multiple  |      Failure:  Incorrect result at runtime
---------------------------------+------------------------------------------
Changes (by gracjan):

 * cc: gracjanpo...@… (added)


Comment:

 I implemented what has been said in this thread i. e. "automatically
 derived Ord methods would use appropriate comparison operators instead of
 compare for comparing the last field of a constructor".

 Before:

 {{{
 $ ghc.exe -ddump-deriv ../dumpderiv.hs -fforce-recomp

 ==================== Derived instances ====================
 InstInfo: GHC.Classes.Eq M.T
   { GHC.Classes./= a_adD b_adE
                      = GHC.Classes.not ((GHC.Classes.==) a_adD b_adE)
     GHC.Classes.== (M.T a1_adB) (M.T b1_adC)
                      = ((a1_adB GHC.Classes.== b1_adC)) }
 InstInfo: GHC.Classes.Ord M.T
   { GHC.Classes.compare a_adF b_adG
                           = cmp_eq_adH a_adF b_adG
                           where
                               cmp_eq_adH (M.T a1_adI) (M.T b1_adJ)
                                            = GHC.Classes.compare a1_adI
 b1_adJ }
 }}}

 now:

 {{{
 $ inplace/bin/ghc-stage1.exe -ddump-deriv ../dumpderiv.hs -fforce-recomp
 [1 of 1] Compiling M                ( ..\dumpderiv.hs, ..\dumpderiv.o )

 ==================== Derived instances ====================
 InstInfo: GHC.Classes.Eq M.T
   { GHC.Classes./= (M.T a1_a7q) (M.T b1_a7r)
                      = ((a1_a7q GHC.Classes./= b1_a7r))
     GHC.Classes.== (M.T a1_a7o) (M.T b1_a7p)
                      = ((a1_a7o GHC.Classes.== b1_a7p)) }
 InstInfo: GHC.Classes.Ord M.T
   { GHC.Classes.>= a_a7M b_a7N
                      = cmp_eq_a7O a_a7M b_a7N
                      where
                          cmp_eq_a7O (M.T a1_a7P) (M.T b1_a7Q)
                                       = (GHC.Classes.>=) a1_a7P b1_a7Q
     GHC.Classes.> a_a7H b_a7I
                     = cmp_eq_a7J a_a7H b_a7I
                     where
                         cmp_eq_a7J (M.T a1_a7K) (M.T b1_a7L)
                                      = (GHC.Classes.>) a1_a7K b1_a7L
     GHC.Classes.<= a_a7C b_a7D
                      = cmp_eq_a7E a_a7C b_a7D
                      where
                          cmp_eq_a7E (M.T a1_a7F) (M.T b1_a7G)
                                       = (GHC.Classes.<=) a1_a7F b1_a7G
     GHC.Classes.< a_a7x b_a7y
                     = cmp_eq_a7z a_a7x b_a7y
                     where
                         cmp_eq_a7z (M.T a1_a7A) (M.T b1_a7B)
                                      = (GHC.Classes.<) a1_a7A b1_a7B
     GHC.Classes.compare a_a7s b_a7t
                           = cmp_eq_a7u a_a7s b_a7t
                           where
                               cmp_eq_a7u (M.T a1_a7v) (M.T b1_a7w)
                                            = GHC.Classes.compare a1_a7v
 b1_a7w }
 }}}

 Patch attached. As this is my first stab at GHC hacking, don't hesitate to
 comment on my code. I'll be happy to redo the patch if necessary.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/4019#comment:5>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to