#2368: ASSERT failed! file coreSyn/CorePrep.lhs line 669
-------------------------------+--------------------------------------------
    Reporter:  batterseapower  |       Owner:                                   
        Type:  bug             |      Status:  new                              
    Priority:  normal          |   Component:  Compiler                         
     Version:  6.9             |    Severity:  normal                           
    Keywords:                  |    Testcase:  simplCore/should_compile/simpl014
Architecture:  Unknown         |          Os:  MacOS X                          
-------------------------------+--------------------------------------------
 This is exposed by running the testsuite on a stage2 compiler with
 -DDEBUG. The tests triggering it are:
  * simplCore/should_compile/simpl014

 The affected context is:

 {{{
 etaExpandRhs :: CoreBndr -> CoreExpr -> UniqSM CoreExpr
 etaExpandRhs bndr rhs = do
         -- Eta expand to match the arity claimed by the binder
         -- Remember, CorePrep must not change arity
         --
         -- Eta expansion might not have happened already,
         -- because it is done by the simplifier only when
         -- there at least one lambda already.
         --
         -- NB1:we could refrain when the RHS is trivial (which can happen
         --     for exported things).  This would reduce the amount of code
         --     generated (a little) and make things a little words for
         --     code compiled without -O.  The case in point is data
 constructor
         --     wrappers.
         --
         -- NB2: we have to be careful that the result of etaExpand doesn't
         --    invalidate any of the assumptions that CorePrep is
 attempting
         --    to establish.  One possible cause is eta expanding inside of
         --    an SCC note - we're now careful in etaExpand to make sure
 the
         --    SCC is pushed inside any new lambdas that are generated.
         --
         -- NB3: It's important to do eta expansion, and *then* ANF-ising
         --              f = /\a -> g (h 3)      -- h has arity 2
         -- If we ANF first we get
         --              f = /\a -> let s = h 3 in g s
         -- and now eta expansion gives
         --              f = /\a -> \ y -> (let s = h 3 in g s) y
         -- which is horrible.
         -- Eta expanding first gives
         --              f = /\a -> \y -> let s = h 3 in g s y
         --
     us <- getUniquesM
     let eta_rhs = etaExpand arity us rhs (idType bndr)

     ASSERT2( manifestArity eta_rhs == arity, (ppr bndr <+> ppr arity <+>
 ppr (exprArity rhs))
                                               $$ ppr rhs $$ ppr eta_rhs )
         -- Assertion checks that eta expansion was successful
       return eta_rhs
   where
         -- For a GlobalId, take the Arity from the Id.
         -- It was set in CoreTidy and must not change
         -- For all others, just expand at will
     arity | isGlobalId bndr = idArity bndr
           | otherwise       = exprArity rhs
 }}}

 The precise error is:
 {{{
 ghc-6.9.20080614: panic! (the 'impossible' happened)
   (GHC version 6.9.20080614 for i386-apple-darwin):
         ASSERT failed! file coreSyn/CorePrep.lhs line 669
 main:ShouldCompile.runHandler{v r6G} [gid] 3 3
 __inline_me ((\ (@ st{tv a73} [tv] :: ghc-prim:GHC.Prim.*{(w) tc 34d})
                 (w{v si9} [lid] :: main:ShouldCompile.M{tc r7}
                                      (main:ShouldCompile.IHR{tc r6} st{tv
 a73} [tv]))
                 (w1{v sia} [lid] :: main:ShouldCompile.IHandler{tc r8}
                                       st{tv a73} [tv])
                 (eta{v sj4} [lid] :: ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                        ghc-prim:GHC.Prim.RealWorld{(w) tc
 31E})
                 (eta1{v sjb} [lid] :: ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                         ghc-prim:GHC.Prim.RealWorld{(w) tc
 31E}) ->
                 main:ShouldCompile.$wrunHandler{v r2} [gid]
                   @ st{tv a73} [tv] w1{v sia} [lid] eta1{v sjb} [lid])
              `cast` (ghc-prim:GHC.Prim.trans{(w) tc 34y}
                        (forall st{tv a73} [tv].
                         main:ShouldCompile.M{tc r7}
                           (main:ShouldCompile.IHR{tc r6} st{tv a73} [tv])
                         -> main:ShouldCompile.IHandler{tc r8} st{tv a73}
 [tv]
                         -> ghc-prim:GHC.Prim.State#{(w) tc 32q}
                              ghc-prim:GHC.Prim.RealWorld{(w) tc 31E}
                         -> ghc-prim:GHC.Prim.CoUnsafe{(w) tc 34K}
                              (ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                 ghc-prim:GHC.Prim.RealWorld{(w) tc 31E}
                               -> (# ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                       ghc-prim:GHC.Prim.RealWorld{(w) tc
 31E},
                                     base:GHC.Base.(){(w) tc 40} #))
                              (# ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                   ghc-prim:GHC.Prim.RealWorld{(w) tc 31E},
                                 base:GHC.Base.(){(w) tc 40} #))
                        (forall st{tv a73} [tv].
                         main:ShouldCompile.M{tc r7}
                           (main:ShouldCompile.IHR{tc r6} st{tv a73} [tv])
                         -> main:ShouldCompile.IHandler{tc r8} st{tv a73}
 [tv]
                         -> ghc-prim:GHC.Prim.sym{(w) tc 34v}
                              ((base:GHC.IOBase.:CoIO{tc reo})
 base:GHC.Base.(){(w) tc 40}))
                      :: <pred>forall st{tv a73} [tv].
                               main:ShouldCompile.M{tc r7}
                                 (main:ShouldCompile.IHR{tc r6} st{tv a73}
 [tv])
                               -> main:ShouldCompile.IHandler{tc r8} st{tv
 a73} [tv]
                               -> ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                    ghc-prim:GHC.Prim.RealWorld{(w) tc 31E}
                               -> ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                    ghc-prim:GHC.Prim.RealWorld{(w) tc 31E}
                               -> (# ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                       ghc-prim:GHC.Prim.RealWorld{(w) tc
 31E},
                                     base:GHC.Base.(){(w) tc 40} #)
                                 ~
                               forall st{tv a73} [tv].
                               main:ShouldCompile.M{tc r7}
                                 (main:ShouldCompile.IHR{tc r6} st{tv a73}
 [tv])
                               -> main:ShouldCompile.IHandler{tc r8} st{tv
 a73} [tv]
                               -> <nt>base:GHC.IOBase.IO{tc 32I}
 base:GHC.Base.(){(w) tc 40}))
 __inline_me ((\ (@ st{tv a73} [tv] :: ghc-prim:GHC.Prim.*{(w) tc 34d})
                 (w{v si9} [lid] :: main:ShouldCompile.M{tc r7}
                                      (main:ShouldCompile.IHR{tc r6} st{tv
 a73} [tv]))
                 (w1{v sia} [lid] :: main:ShouldCompile.IHandler{tc r8}
                                       st{tv a73} [tv])
                 (eta{v sj4} [lid] :: ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                        ghc-prim:GHC.Prim.RealWorld{(w) tc
 31E})
                 (eta1{v sjb} [lid] :: ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                         ghc-prim:GHC.Prim.RealWorld{(w) tc
 31E}) ->
                 main:ShouldCompile.$wrunHandler{v r2} [gid]
                   @ st{tv a73} [tv] w1{v sia} [lid] eta1{v sjb} [lid])
              `cast` (ghc-prim:GHC.Prim.trans{(w) tc 34y}
                        (forall st{tv a73} [tv].
                         main:ShouldCompile.M{tc r7}
                           (main:ShouldCompile.IHR{tc r6} st{tv a73} [tv])
                         -> main:ShouldCompile.IHandler{tc r8} st{tv a73}
 [tv]
                         -> ghc-prim:GHC.Prim.State#{(w) tc 32q}
                              ghc-prim:GHC.Prim.RealWorld{(w) tc 31E}
                         -> ghc-prim:GHC.Prim.CoUnsafe{(w) tc 34K}
                              (ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                 ghc-prim:GHC.Prim.RealWorld{(w) tc 31E}
                               -> (# ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                       ghc-prim:GHC.Prim.RealWorld{(w) tc
 31E},
                                     base:GHC.Base.(){(w) tc 40} #))
                              (# ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                   ghc-prim:GHC.Prim.RealWorld{(w) tc 31E},
                                 base:GHC.Base.(){(w) tc 40} #))
                        (forall st{tv a73} [tv].
                         main:ShouldCompile.M{tc r7}
                           (main:ShouldCompile.IHR{tc r6} st{tv a73} [tv])
                         -> main:ShouldCompile.IHandler{tc r8} st{tv a73}
 [tv]
                         -> ghc-prim:GHC.Prim.sym{(w) tc 34v}
                              ((base:GHC.IOBase.:CoIO{tc reo})
 base:GHC.Base.(){(w) tc 40}))
                      :: <pred>forall st{tv a73} [tv].
                               main:ShouldCompile.M{tc r7}
                                 (main:ShouldCompile.IHR{tc r6} st{tv a73}
 [tv])
                               -> main:ShouldCompile.IHandler{tc r8} st{tv
 a73} [tv]
                               -> ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                    ghc-prim:GHC.Prim.RealWorld{(w) tc 31E}
                               -> ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                    ghc-prim:GHC.Prim.RealWorld{(w) tc 31E}
                               -> (# ghc-prim:GHC.Prim.State#{(w) tc 32q}
                                       ghc-prim:GHC.Prim.RealWorld{(w) tc
 31E},
                                     base:GHC.Base.(){(w) tc 40} #)
                                 ~
                               forall st{tv a73} [tv].
                               main:ShouldCompile.M{tc r7}
                                 (main:ShouldCompile.IHR{tc r6} st{tv a73}
 [tv])
                               -> main:ShouldCompile.IHandler{tc r8} st{tv
 a73} [tv]
                               -> <nt>base:GHC.IOBase.IO{tc 32I}
 base:GHC.Base.(){(w) tc 40}))
 }}}

 It appears to occur because the exprArity of the RHS (i.e. the value of
 arity variable above) is less than its manifest arity.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/2368>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to