#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