[GHC] #12671: enumFrom error thwarts checkOldIface's exception handling

GHC ghc-devs at haskell.org
Thu Oct 6 23:45:40 UTC 2016


#12671: enumFrom error thwarts checkOldIface's exception handling
-------------------------------------+-------------------------------------
           Reporter:  ezyang         |             Owner:
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.1
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 This bug needs a bit of jiggery-pokery to reproduce.

 First, we need to create a malformed hi file that we will feed
 `checkOldIface`. First, have a fresh build of GHC. Apply the following
 diff to your tree:

 {{{
 diff --git a/compiler/main/HscTypes.hs b/compiler/main/HscTypes.hs
 index 7a585f3..4e41887 100644
 --- a/compiler/main/HscTypes.hs
 +++ b/compiler/main/HscTypes.hs
 @@ -1033,7 +1033,8 @@ instance Binary ModIface where
          put_ bh vect_info
          put_ bh hpc_info
          put_ bh trust
 -        put_ bh trust_pkg
 +        putByte bh 3
 +        -- put_ bh trust_pkg

     get bh = do
          mod         <- get bh
 }}}

 Next, rebuild ONLY the stage 2 compiler using `cd ghc; make stage=2 -j12
 fast`. Now, use the new stage2 compiler to compile some module (it can be
 empty):

 {{{
 [ezyang at hs01 ghc-backpack]$ inplace/bin/ghc-stage2 -c A.hs
 [ezyang at hs01 ghc-backpack]$ inplace/bin/ghc-stage2 -c A.hs
 ghc-stage2: panic! (the 'impossible' happened)
   (GHC version 8.1.20161006 for x86_64-unknown-linux):
         Prelude.Enum.Bool.toEnum: bad argument

 Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug

 }}}

 With `-v3`, we see that this error occurred when checking the old
 interface:

 {{{
 [ezyang at hs01 ghc-backpack]$ inplace/bin/ghc-stage2 -c A.hs -v3
 Glasgow Haskell Compiler, Version 8.1.20161006, stage 2 booted by GHC
 version 8.0.1
 Using binary package database: /home/hs01/ezyang/ghc-
 backpack/inplace/lib/package.conf.d/package.cache
 package flags []
 loading package database /home/hs01/ezyang/ghc-
 backpack/inplace/lib/package.conf.d
 wired-in package ghc-prim mapped to ghc-prim-0.5.0.0
 wired-in package integer-gmp mapped to integer-gmp-1.0.0.1
 wired-in package base mapped to base-4.9.0.0
 wired-in package rts mapped to rts
 wired-in package template-haskell mapped to template-haskell-2.11.0.0
 wired-in package ghc mapped to ghc-8.1
 wired-in package dph-seq not found.
 wired-in package dph-par not found.
 Hsc static flags:
 *** Checking old interface for A:
 }}}

 Dastardly. We've choked checking the old interface!

 The problem seems to be that the `toEnum` exception is not an
 `IOException`, so we don't catch it in `tryMost` (which `readIface` uses
 to catch errors). Funnily enough, the comment above says precisely, `TODO:
 I'm not entirely sure if this is catching what we really want to catch`.
 But to catch these, we'll have to catch all `UserError`s (because that is
 what is being thrown in this case.) Maybe a bridge too far? Another
 possibilty is to use some home-baked `toEnum` which catches errors of this
 sort. Anyway, the fix should be simple, we just have to decide what to do.

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


More information about the ghc-tickets mailing list