[GHC] #10181: Lint check: arity invariant

GHC ghc-devs at haskell.org
Thu Jul 16 14:00:42 UTC 2015


#10181: Lint check: arity invariant
-------------------------------------+-------------------------------------
        Reporter:  nomeata           |                   Owner:
            Type:  task              |                  Status:  new
        Priority:  normal            |               Milestone:
       Component:  Compiler          |                 Version:  7.11
      Resolution:                    |                Keywords:
Operating System:  Unknown/Multiple  |            Architecture:
 Type of failure:  None/Unknown      |  Unknown/Multiple
      Blocked By:                    |               Test Case:
 Related Tickets:                    |                Blocking:
                                     |  Differential Revisions:  Phab:751
-------------------------------------+-------------------------------------
Changes (by nomeata):

 * cc: thomie (added)
 * owner:  nomeata =>
 * status:  closed => new
 * resolution:  fixed =>


Comment:

 thomie notified me of a a case of this lint check firing, triggered by
 simply `t a = t a`. Here is what’s happening:

 {{{
 ==================== Simplifier ====================
   Max iterations = 4
   SimplMode {Phase = 2 [main],
              inline,
              rules,
              eta-expand,
              case-of-case}
 Result size of Simplifier = {terms: 2, types: 4, coercions: 0}

 Rec {
 t [Occ=LoopBreaker] :: forall t_ans t_ant. t_ans -> t_ant
 [LclIdX,
  Arity=1,
  Str=DmdType]
 t = t
 end Rec }

 [...]

 ==================== Demand analysis ====================
 Result size of Demand analysis = {terms: 2, types: 4, coercions: 0}

 Rec {
 t [Occ=LoopBreaker] :: forall t_ans t_ant. t_ans -> t_ant
 [LclIdX,
  Arity=1,
  Str=DmdType b]
 t = t
 end Rec }



 *** Core Linted result of Demand analysis:
 *** Core Lint errors : in result of Demand analysis ***
 T10181.hs:3:1: warning:
     [RHS of t :: forall t_ans t_ant. t_ans -> t_ant]
     idArity 1 exceeds arity imposed by the strictness signature DmdType b:
 t
 }}}

 So there are several possibilities:

  * The simplifier should not set the `idArity` of `t` if after
 simplification, it does not have that arity.
  * `idArtiy t = 1` is correct, as that is the arity provided by the
 programmer. In that case, the lint check is bogus.
  * The demand analysis should enforce the the invariant if it adds a
 bottoming signature.

 This requires some insight with someone with the big picture in mind.
 Simon?

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


More information about the ghc-tickets mailing list