[GHC] #14788: `error` in GHC internals can disappear by rerunning ghc again

GHC ghc-devs at haskell.org
Sat Feb 10 18:12:08 UTC 2018


#14788: `error` in GHC internals can disappear by rerunning ghc again
-------------------------------------+-------------------------------------
           Reporter:  nh2            |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.2.2
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  Poor/confusing
  Unknown/Multiple                   |  error message
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:  #14533
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 I was messing around with GHC's source code and thus triggered a bug,
 manifesting in my case as the `pprPanic "applyTypeToArgs" panic_msg` in
 `applyTypeToArgs` in GHC 8.2.1.

 Expectedly, ghc died with `the 'impossible' happened` while compiling a
 package (in my case `vector`).

 With output like this (it's not important to read the output in detail,
 only to see the `.o` file involved):

 {{{
 [17 of 21] Compiling Data.Vector.Storable.Mutable (
 Data/Vector/Storable/Mutable.hs, .stack-
 work/dist/x86_64-linux/Cabal-2.0.0.2/build/Data/Vector/Storable/Mutable.o
 )

 Data/Vector/Storable/Mutable.hs:77:1: warning: [-Wunused-imports]
     The import of ‘Foreign.Ptr’ is redundant
       except perhaps to import instances from ‘Foreign.Ptr’
     To import instances alone, use: import Foreign.Ptr()
    |
 77 | import Foreign.Ptr
    | ^^^^^^^^^^^^^^^^^^
 ghc: panic! (the 'impossible' happened)
   (GHC version 8.2.1 for x86_64-unknown-linux):
         applyTypeToArgs
   Expression: n#_aKi p_a3X ds5_XM4 ds7_aKj x#_aKa eta_X1H
   Type: Int#
   Args: [p_a3X, ds5_XM4, ds7_aKj, x#_aKa, eta_X1H]
   Call stack:
       CallStack (from HasCallStack):
         prettyCurrentCallStack, called at
 compiler/utils/Outputable.hs:1133:58 in ghc:Outputable
         callStackDoc, called at compiler/utils/Outputable.hs:1137:37 in
 ghc:Outputable
         pprPanic, called at compiler/coreSyn/CoreUtils.hs:226:14 in
 ghc:CoreUtils
 }}}

 What I did not expect was that by rerunning my `ghc --make` invocation
 again, the error would disappear!

 This is because after the error, the `.o` file is corrupt, just cut off in
 the middle.

 The reason is probably that GHC writes the `.o` file contents from an
 expression that can contain `error` thunks deep in, so the error only
 surfaces in the middle of the writing.

 As a result, the `.o` file is touched and `ghc --make` build pipeline,
 when resumnig the build next time, thinks that the `.o` file was completed
 all fine.

 I think `ghc --make` should not write the `.o` file when there's an
 obvious error.

 I suggest that ghc either `deepseq` the string to be written to the `.o`
 file before calling `writeFile` or equivalent, or write the file to an
 `.o.tmp` file and rename the temp file upon completion. The latter
 approach would also help against corrupted files due to power loss, see
 #14533.

 Fixing this would make developing GHC easier, as right now you can
 accidentally continue from a completely broken state (corrupt `.o` file)
 and only notice the error much later and then have to backtrack.

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


More information about the ghc-tickets mailing list