[GHC] #9025: Core Lint warning with -O (Demand type has 4 arguments ...)

GHC ghc-devs at haskell.org
Wed Apr 23 18:30:03 UTC 2014


#9025: Core Lint warning with -O (Demand type has 4 arguments ...)
------------------------------------+-------------------------------------
       Reporter:  conal             |             Owner:
           Type:  bug               |            Status:  new
       Priority:  normal            |         Milestone:
      Component:  Compiler          |           Version:  7.8.2
       Keywords:                    |  Operating System:  Unknown/Multiple
   Architecture:  Unknown/Multiple  |   Type of failure:  None/Unknown
     Difficulty:  Unknown           |         Test Case:
     Blocked By:                    |          Blocking:
Related Tickets:                    |
------------------------------------+-------------------------------------
 The attached small program triggers a Core Lint warning when compiled with
 `-O`:
 {{{
 bash-3.2$ ghc LintBomb.hs -fforce-recomp -dcore-lint
 [1 of 1] Compiling LintBomb         ( LintBomb.hs, LintBomb.o )
 bash-3.2$ ghc LintBomb.hs -fforce-recomp -dcore-lint -O
 [1 of 1] Compiling LintBomb         ( LintBomb.hs, LintBomb.o )
 *** Core Lint errors : in result of CorePrep ***
 {-# LINE 13 "LintBomb.hs #-}: Warning:
     [RHS of LintBomb.$fEncodable(->)_$cencode :: forall a_arW b_arX.
                                                  (LintBomb.Encodable
 a_arW,
                                                   LintBomb.Encodable
 b_arX) =>
                                                  (a_arW -> b_arX) ->
 LintBomb.Enc (a_arW -> b_arX)]
     Demand type has 4 arguments, rhs has 3 arguments,
 LintBomb.$fEncodable(->)_$cencode
     Binder's strictness signature: DmdType
 <L,1*U(A,1*C1(U))><S(C(S)L),1*U(1*C1(U),A)><L,1*C1(U)><L,U>
 *** Offending Program ***
 LintBomb.encode [InlPrag=[NEVER]]
   :: forall a_arV.
      LintBomb.Encodable a_arV =>
      a_arV -> LintBomb.Enc a_arV
 [GblId[ClassOp],
  Arity=1,
  Caf=NoCafRefs,
  Str=DmdType <S(SL),U(U,A)>,
  Unf=OtherCon [],
  RULES: Built in rule for LintBomb.encode: "Class op encode"]
 LintBomb.encode =
   \ (@ a_arV) (tpl_sOv [Occ=Once!] :: LintBomb.Encodable a_arV) ->
     case tpl_sOv
     of _ [Occ=Dead]
     { LintBomb.D:Encodable tpl_sOx [Occ=Once] _ [Occ=Dead] ->
     tpl_sOx
     }

 LintBomb.decode [InlPrag=[NEVER]]
   :: forall a_arV.
      LintBomb.Encodable a_arV =>
      LintBomb.Enc a_arV -> a_arV
 [GblId[ClassOp],
  Arity=1,
  Caf=NoCafRefs,
  Str=DmdType <S(LS),U(A,U)>,
  Unf=OtherCon [],
  RULES: Built in rule for LintBomb.decode: "Class op decode"]
 LintBomb.decode =
   \ (@ a_arV) (tpl_sOz [Occ=Once!] :: LintBomb.Encodable a_arV) ->
     case tpl_sOz
     of _ [Occ=Dead]
     { LintBomb.D:Encodable _ [Occ=Dead] tpl_sOC [Occ=Once] ->
     tpl_sOC
     }

 LintBomb.$fEncodable(->)_$cdecode
   :: forall a_arW b_arX.
      (LintBomb.Encodable a_arW, LintBomb.Encodable b_arX) =>
      LintBomb.Enc (a_arW -> b_arX) -> a_arW -> b_arX
 [GblId,
  Arity=4,
  Caf=NoCafRefs,
  Str=DmdType <L,1*U(1*C1(U),A)><S(LC(S)),1*U(A,1*C1(U))><L,1*C1(U)><L,U>,
  Unf=OtherCon []]
 LintBomb.$fEncodable(->)_$cdecode =
   \ (@ a_arW)
     (@ b_arX)
     ($dEncodable_sOD [Occ=Once] :: LintBomb.Encodable a_arW)
     ($dEncodable1_sOE [Occ=Once] :: LintBomb.Encodable b_arX)
     (h_sOF [Occ=Once] :: LintBomb.Enc (a_arW -> b_arX))
     (eta_sOG [Occ=Once] :: a_arW) ->
     let {
       sat_sOI [Occ=Once] :: LintBomb.Enc b_arX
       [LclId, Str=DmdType]
       sat_sOI =
         let {
           sat_sOH [Occ=Once] :: LintBomb.Enc a_arW
           [LclId, Str=DmdType]
           sat_sOH = LintBomb.encode @ a_arW $dEncodable_sOD eta_sOG } in
         (h_sOF
          `cast` (Sub (LintBomb.TFCo:R:Enc(->)[0] <a_arW>_N <b_arX>_N)
                  :: LintBomb.Enc (a_arW -> b_arX)
                       ~#
                     (LintBomb.Enc a_arW -> LintBomb.Enc b_arX)))
           sat_sOH } in
     LintBomb.decode @ b_arX $dEncodable1_sOE sat_sOI

 LintBomb.$fEncodable(->)1
   :: forall a_arW b_arX.
      (LintBomb.Encodable a_arW, LintBomb.Encodable b_arX) =>
      (a_arW -> b_arX) -> LintBomb.Enc a_arW -> LintBomb.Enc b_arX
 [GblId,
  Arity=4,
  Caf=NoCafRefs,
  Str=DmdType <L,1*U(A,1*C1(U))><S(C(S)L),1*U(1*C1(U),A)><L,1*C1(U)><L,U>,
  Unf=OtherCon []]
 LintBomb.$fEncodable(->)1 =
   \ (@ a_arW)
     (@ b_arX)
     ($dEncodable_sOJ [Occ=Once] :: LintBomb.Encodable a_arW)
     ($dEncodable1_sOK [Occ=Once] :: LintBomb.Encodable b_arX)
     (f_sOL [Occ=Once!] :: a_arW -> b_arX)
     (eta_sOM [Occ=Once] :: LintBomb.Enc a_arW) ->
     let {
       sat_sOO [Occ=Once] :: b_arX
       [LclId, Str=DmdType]
       sat_sOO =
         let {
           sat_sON [Occ=Once] :: a_arW
           [LclId, Str=DmdType]
           sat_sON = LintBomb.decode @ a_arW $dEncodable_sOJ eta_sOM } in
         f_sOL sat_sON } in
     LintBomb.encode @ b_arX $dEncodable1_sOK sat_sOO

 LintBomb.$fEncodable(->)_$cencode
   :: forall a_arW b_arX.
      (LintBomb.Encodable a_arW, LintBomb.Encodable b_arX) =>
      (a_arW -> b_arX) -> LintBomb.Enc (a_arW -> b_arX)
 [GblId,
  Arity=3,
  Caf=NoCafRefs,
  Str=DmdType <L,1*U(A,1*C1(U))><S(C(S)L),1*U(1*C1(U),A)><L,1*C1(U)><L,U>,
  Unf=OtherCon []]
 LintBomb.$fEncodable(->)_$cencode =
   (\ (@ a_arW)
      (@ b_arX)
      (eta_B3 [Occ=Once] :: LintBomb.Encodable a_arW)
      (eta_B2 [Occ=Once] :: LintBomb.Encodable b_arX)
      (eta_B1 [Occ=Once] :: a_arW -> b_arX) ->
      LintBomb.$fEncodable(->)1 @ a_arW @ b_arX eta_B3 eta_B2 eta_B1)
   `cast` (forall a_arW b_arX.
           <LintBomb.Encodable a_arW>_R
           -> <LintBomb.Encodable b_arX>_R
           -> <a_arW -> b_arX>_R
           -> Sub (Sym (LintBomb.TFCo:R:Enc(->)[0] <a_arW>_N <b_arX>_N))
           :: (forall a_arW b_arX.
               (LintBomb.Encodable a_arW, LintBomb.Encodable b_arX) =>
               (a_arW -> b_arX) -> LintBomb.Enc a_arW -> LintBomb.Enc
 b_arX)
                ~#
              (forall a_arW b_arX.
               (LintBomb.Encodable a_arW, LintBomb.Encodable b_arX) =>
               (a_arW -> b_arX) -> LintBomb.Enc (a_arW -> b_arX)))

 LintBomb.$fEncodable(->) [InlPrag=[ALWAYS] CONLIKE]
   :: forall a_arW b_arX.
      (LintBomb.Encodable a_arW, LintBomb.Encodable b_arX) =>
      LintBomb.Encodable (a_arW -> b_arX)
 [GblId[DFunId],
  Arity=2,
  Caf=NoCafRefs,
  Str=DmdType <L,U(C(U),C(U))><L,U(C(U),C(U))>m,
  Unf=OtherCon []]
 LintBomb.$fEncodable(->) =
   \ (@ a_Xs8)
     (@ b_Xsa)
     ($dEncodable_sOP :: LintBomb.Encodable a_Xs8)
     ($dEncodable1_sOQ :: LintBomb.Encodable b_Xsa) ->
     let {
       sat_sOS [Occ=Once]
         :: LintBomb.Enc (a_Xs8 -> b_Xsa) -> a_Xs8 -> b_Xsa
       [LclId, Str=DmdType]
       sat_sOS =
         \ (eta_B2 [Occ=Once] :: LintBomb.Enc (a_Xs8 -> b_Xsa))
           (eta_B1 [Occ=Once] :: a_Xs8) ->
           LintBomb.$fEncodable(->)_$cdecode
             @ a_Xs8 @ b_Xsa $dEncodable_sOP $dEncodable1_sOQ eta_B2 eta_B1
 } in
     let {
       sat_sOR [Occ=Once]
         :: (a_Xs8 -> b_Xsa) -> LintBomb.Enc (a_Xs8 -> b_Xsa)
       [LclId, Str=DmdType]
       sat_sOR =
         (\ (eta_B1 [Occ=Once] :: a_Xs8 -> b_Xsa) ->
            LintBomb.$fEncodable(->)1
              @ a_Xs8 @ b_Xsa $dEncodable_sOP $dEncodable1_sOQ eta_B1)
         `cast` (<a_Xs8 -> b_Xsa>_R
                 -> Sub (Sym (LintBomb.TFCo:R:Enc(->)[0] <a_Xs8>_N
 <b_Xsa>_N))
                 :: ((a_Xs8 -> b_Xsa) -> LintBomb.Enc a_Xs8 -> LintBomb.Enc
 b_Xsa)
                      ~#
                    ((a_Xs8 -> b_Xsa) -> LintBomb.Enc (a_Xs8 -> b_Xsa))) }
 in
     LintBomb.D:Encodable @ (a_Xs8 -> b_Xsa) sat_sOR sat_sOS

 LintBomb.D:Encodable
   :: forall a_arV.
      (a_arV -> LintBomb.Enc a_arV)
      -> (LintBomb.Enc a_arV -> a_arV) -> LintBomb.Encodable a_arV
 [GblId[DataCon],
  Arity=2,
  Caf=NoCafRefs,
  Str=DmdType <L,U><L,U>m,
  Unf=OtherCon []]
 LintBomb.D:Encodable =
   \ (@ a_arV)
     (eta_B2 [Occ=Once] :: a_arV -> LintBomb.Enc a_arV)
     (eta_B1 [Occ=Once] :: LintBomb.Enc a_arV -> a_arV) ->
     LintBomb.D:Encodable @ a_arV eta_B2 eta_B1

 *** End of Offense ***


 <no location info>:
 Compilation had errors
 }}}

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


More information about the ghc-tickets mailing list