[GHC] #9207: Detect obvious cases of infinite recursion.

GHC ghc-devs at haskell.org
Mon Jun 23 16:14:46 UTC 2014


#9207: Detect obvious cases of infinite recursion.
------------------------------------+--------------------------------------
        Reporter:  mrugiero         |            Owner:
            Type:  feature request  |           Status:  closed
        Priority:  normal           |        Milestone:
       Component:  Compiler         |          Version:  7.8.2
      Resolution:  invalid          |         Keywords:  infinite recursion
Operating System:                   |     Architecture:  Unknown/Multiple
  Unknown/Multiple                  |       Difficulty:  Unknown
 Type of failure:  None/Unknown     |       Blocked By:
       Test Case:                   |  Related Tickets:
        Blocking:                   |
------------------------------------+--------------------------------------

Comment (by simonpj):

 GHC already does a guaranteed-divergence analysis. For example
 {{{
 f [] = f [True]
 f (x:xs) = f xs
 }}}
 If you say
 {{{
 ghc -c -O -ddump-simpl Foo.hs
 }}}
 you get something like this
 {{{
 Foo.f [Occ=LoopBreaker] :: forall t_aK7. [GHC.Types.Bool] -> t_aK7
 [GblId, Arity=1, Str=DmdType <B,1*U>b]
 }}}
 That "`b`" in teh `Str=` part says "bottom" meaning guaranteed divergence.


 but it does not distinguish an infnite loop from a call to `error`.  So
 {{{
 f [] = f [True]
 f (x:xs) = error "urk"
 }}}
 would give the same result. Maybe this information can help?  Though some
 functions are ''supposed'' to return bottom. Eg
 {{{
 myError :: String -> a
 myError s = error ("Bad bad bad: " ++ s)
 }}}
 Simon

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


More information about the ghc-tickets mailing list