Dear Andy, Ross It turns out that Trac #1333 is an interaction of the HPC and arrow syntax. Could you two fight it out and decide what to do?
Currently I think that many programs involving arrow syntax won't compile with HPC and hence won't compile in GHCi. Which is a shame. Arrow syntax imposes heavier complexity overheads than I had anticipated! Thanks Simon -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of GHC Sent: 11 May 2007 12:15 To: [EMAIL PROTECTED] Subject: Re: [GHC] #1333: core lint failures in arrow tests #1333: core lint failures in arrow tests -------------------------+-------------------------------------------------- Reporter: igloo | Owner: Type: bug | Status: new Priority: normal | Milestone: 6.8 Component: Compiler | Version: 6.7 Severity: normal | Resolution: Keywords: | Difficulty: Unknown Os: Unknown | Testcase: arrowrun001 arrowrun004 Architecture: Unknown | -------------------------+-------------------------------------------------- Comment (by simonpj): I think that arrowrun004 is another case of #1080, which Ross is looking at. However arrowrun001 is different. Its triggered by an interaction of * the tick-boxes added by Andy Gill's HPC coverage tool, which is always on for GHCi, because the tick-boxes are used for debugging too * the desugaring of Ross Paterson's arrow syntax If you go: {{{ ghc -dcore-lint -ddump-tc arrowrun001.hs --interactive }}} you'll get the dump below (interesting lines marked ***; some stuff elided). The problem is that the HPC tool inserts a tick-box that says that `b_av8` is in scope, but the desugaring for the arrow-syntax has taken it out of scope. I propose to leave it to Andy and Ross to fight it out. Simon {{{ ==================== Typechecker ==================== .... .... eval (If e1 e2 e3) = proc env -> do ~(Bl b) <- eval e1 -< env if b then eval e2 -< env else eval e3 -< env .... .... *** Core Lint Errors: in result of Desugar *** <no location info>: In the expression: {tick (main:Main, 38)}_dGx @ (GHC.Base.Bool -> Main.Exp -> Main.Exp -> GHC.Prim.State# GHC.Prim.RealWorld) b_av8 b_av8 is out of scope *** Offending Program *** .... .... Main.If e1_av2 e2_av3 e3_av4 -> __letrec { .... .... >>>_aBS @ [(Main.Id, Main.Val a_awZ)] @ [(Main.Id, Main.Val a_awZ)] @ (Main.Val a_awZ) (arr_aBR @ [(Main.Id, Main.Val a_awZ)] @ [(Main.Id, Main.Val a_awZ)] (\ (env_av6 :: [(Main.Id, Main.Val a_awZ)]) -> env_av6)) (>>>_aBS @ [(Main.Id, Main.Val a_awZ)] @ ([(Main.Id, Main.Val a_awZ)], GHC.Base.Bool) @ (Main.Val a_awZ) (>>>_aBS @ [(Main.Id, Main.Val a_awZ)] @ ([(Main.Id, Main.Val a_awZ)], [(Main.Id, Main.Val a_awZ)]) @ ([(Main.Id, Main.Val a_awZ)], GHC.Base.Bool) (arr_aBR @ [(Main.Id, Main.Val a_awZ)] @ ([(Main.Id, Main.Val a_awZ)], [(Main.Id, Main.Val a_awZ)]) (\ (ds_dGG :: [(Main.Id, Main.Val a_awZ)]) -> let { env_av6 :: [(Main.Id, Main.Val a_awZ)] [] env_av6 = ds_dGG } in (env_av6, env_av6))) (>>>_aBS @ ([(Main.Id, Main.Val a_awZ)], [(Main.Id, Main.Val a_awZ)]) @ (Main.Val a_awZ, [(Main.Id, Main.Val a_awZ)]) @ ([(Main.Id, Main.Val a_awZ)], GHC.Base.Bool) (first_aBT @ [(Main.Id, Main.Val a_awZ)] @ (Main.Val a_awZ) @ [(Main.Id, Main.Val a_awZ)] (case {tick (main:Main, 34)}_dGD @ (Main.Exp -> GHC.Prim.State# GHC.Prim.RealWorld) e1_av2 of tick_dGE { __DEFAULT -> >>>_aBS @ [(Main.Id, Main.Val a_awZ)] @ [(Main.Id, Main.Val a_awZ)] @ (Main.Val a_awZ) (arr_aBR @ [(Main.Id, Main.Val a_awZ)] @ [(Main.Id, Main.Val a_awZ)] (\ (ds_dGC :: [(Main.Id, Main.Val a_awZ)]) -> let { env_av6 :: [(Main.Id, Main.Val a_awZ)] [] env_av6 = ds_dGC } in env_av6)) (case {tick (main:Main, 33)}_dGz @ (Main.Exp -> GHC.Prim.State# GHC.Prim.RealWorld) e1_av2 of tick_dGA { __DEFAULT -> eval_aBI e1_av2 }) })) (arr_aBR @ (Main.Val a_awZ, [(Main.Id, Main.Val a_awZ)]) @ ([(Main.Id, Main.Val a_awZ)], GHC.Base.Bool) (\ (ds_dGO :: (Main.Val a_awZ, [(Main.Id, Main.Val a_awZ)])) -> case ds_dGO of ds_dGO { (ds_dGJ, ds_dGH) -> let { ds_dGK :: Main.Val a_awZ [] ds_dGK = ds_dGJ } in let { ds_dGL :: () [] ds_dGL = GHC.Err.irrefutPatError @ () "arrowrun001.hs:(21,21)-(24,21)|(Main.Bl b)" } in let { b_av8 :: GHC.Base.Bool [] *** b_av8 = let { fail_dGM :: GHC.Base.Bool [] fail_dGM = ds_dGL `cast` (CoUnsafe () GHC.Base.Bool :: () ~ GHC.Base.Bool) } in case ds_dGK of wild_B1 { __DEFAULT -> fail_dGM; Main.Bl b_av8 -> __letrec { } in b_av8 } } in let { env_av6 :: [(Main.Id, Main.Val a_awZ)] [] env_av6 = ds_dGH } in (env_av6, b_av8) })))) (case {tick (main:Main, 38)}_dGx @ (GHC.Base.Bool -> Main.Exp -> Main.Exp -> GHC.Prim.State# GHC.Prim.RealWorld) *** b_av8 e2_av3 e3_av4 of tick_dGy { __DEFAULT -> >>>_aBS @ ([(Main.Id, Main.Val a_awZ)], GHC.Base.Bool) @ (Data.Either.Either [(Main.Id, Main.Val a_awZ)] [(Main.Id, Main.Val a_awZ)]) @ (Main.Val a_awZ) (arr_aBR @ ([(Main.Id, Main.Val a_awZ)], GHC.Base.Bool) @ (Data.Either.Either [(Main.Id, Main.Val a_awZ)] [(Main.Id, Main.Val a_awZ)]) (\ (ds_dGw :: ([(Main.Id, Main.Val a_awZ)], GHC.Base.Bool)) -> *** case ds_dGw of ds_dGw { (env_av6, b_av8) -> case case {tick (main:Main, 35)}_dGl @ (GHC.Prim.State# GHC.Prim.RealWorld) of tick_dGm { __DEFAULT -> b_av8 } of wild_B1 { GHC.Base.False -> Data.Either.Right @ [(Main.Id, Main.Val a_awZ)] @ [(Main.Id, Main.Val a_awZ)] env_av6; GHC.Base.True -> Data.Either.Left @ [(Main.Id, Main.Val a_awZ)] @ [(Main.Id, Main.Val a_awZ)] env_av6 } })) ... }}} -- Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/1333> GHC <http://www.haskell.org/ghc/> The Glasgow Haskell Compiler
_______________________________________________ Cvs-ghc mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-ghc
