[project @ 1999-12-01 10:22:53 by sewardj]
authorsewardj <unknown>
Wed, 1 Dec 1999 10:22:54 +0000 (10:22 +0000)
committersewardj <unknown>
Wed, 1 Dec 1999 10:22:54 +0000 (10:22 +0000)
Fix bug in 'deriving Enum' reported by Ralf Hinze:
   data T = A | B deriving Enum
failed, requiring instance Ord T, because code generated
for enumFromThen required Ord.  We now derive just fromEnum
and toEnum, and let the Report's defaults do the rest.

ghc/interpreter/derive.c
ghc/interpreter/lib/Prelude.hs
ghc/lib/hugs/Prelude.hs

index f3ea7cf..414c7fb 100644 (file)
@@ -9,8 +9,8 @@
  * included in the distribution.
  *
  * $RCSfile: derive.c,v $
- * $Revision: 1.9 $
- * $Date: 1999/11/12 17:32:38 $
+ * $Revision: 1.10 $
+ * $Date: 1999/12/01 10:22:53 $
  * ------------------------------------------------------------------------*/
 
 #include "prelude.h"
@@ -255,17 +255,7 @@ Tycon t; {
     implementTagToCon(t);
     return cons(mkBind("toEnum",      mkVarAlts(l,tycon(t).tagToCon)),
            cons(mkBind("fromEnum",    mkVarAlts(l,tycon(t).conToTag)),
-           cons(mkBind("enumFrom",    singleton(pair(singleton(x),  
-                                        pair(mkInt(l),
-                                        ap2(nameFromTo,x,last))))),
-           /* default instance of enumFromTo is good */
-           cons(mkBind("enumFromThen",singleton(pair(doubleton(x,y),
-                                        pair(mkInt(l),
-                                        ap3(nameFromThenTo,x,y,
-                                        ap(COND,triple(ap2(nameLe,x,y),
-                                        last,first))))))),
-           /* default instance of enumFromThenTo is good */
-           NIL))));
+           NIL));
 }
 
 
index e0bc1d1..8a1e04d 100644 (file)
@@ -370,7 +370,9 @@ class Enum a where
     -- Minimal complete definition: toEnum, fromEnum
     succ                  = toEnum . (1+)       . fromEnum
     pred                  = toEnum . subtract 1 . fromEnum
+    enumFrom x            = map toEnum [ fromEnum x .. ]
     enumFromTo x y        = map toEnum [ fromEnum x .. fromEnum y ]
+    enumFromThen x y      = map toEnum [ fromEnum x, fromEnum y .. ]
     enumFromThenTo x y z  = map toEnum [ fromEnum x, fromEnum y .. fromEnum z ]
 
 -- Read and Show classes ------------------------------------------------------
index e0bc1d1..8a1e04d 100644 (file)
@@ -370,7 +370,9 @@ class Enum a where
     -- Minimal complete definition: toEnum, fromEnum
     succ                  = toEnum . (1+)       . fromEnum
     pred                  = toEnum . subtract 1 . fromEnum
+    enumFrom x            = map toEnum [ fromEnum x .. ]
     enumFromTo x y        = map toEnum [ fromEnum x .. fromEnum y ]
+    enumFromThen x y      = map toEnum [ fromEnum x, fromEnum y .. ]
     enumFromThenTo x y z  = map toEnum [ fromEnum x, fromEnum y .. fromEnum z ]
 
 -- Read and Show classes ------------------------------------------------------