[project @ 2001-06-04 16:47:06 by simonpj]
authorsimonpj <unknown>
Mon, 4 Jun 2001 16:47:06 +0000 (16:47 +0000)
committersimonpj <unknown>
Mon, 4 Jun 2001 16:47:06 +0000 (16:47 +0000)
----------------------------------
Fix an existential-constructor bug
----------------------------------

MERGE INTO 5.00.2

This fixes a long-standing bug that made the strictness
analyser go into a loop if it met a recursive newtype:

newtype Void = MkVoid Void

ghc/compiler/stranal/SaAbsInt.lhs

index 47afd99..4cef8c9 100644 (file)
@@ -713,6 +713,10 @@ findRecDemand str_fn abs_fn ty
                                -- we don't exploit it yet, so don't bother
 
         Just (tycon,_,data_con,cmpnt_tys)      -- Single constructor case
+          | isRecursiveTyCon tycon             -- Recursive data type; don't unpack
+          ->   wwStrict                        --      (this applies to newtypes too:
+                                               --      e.g.  data Void = MkVoid Void)
+
           | isNewTyCon tycon                   -- A newtype!
           ->   ASSERT( null (tail cmpnt_tys) )
                let
@@ -721,7 +725,6 @@ findRecDemand str_fn abs_fn ty
                wwUnpackNew demand
 
           |  null compt_strict_infos           -- A nullary data type
-          || isRecursiveTyCon tycon            -- Recursive data type; don't unpack
           ->   wwStrict
 
           | otherwise                          -- Some other data type