[GHC] #14769: The RecompBecause [TH] check is not resume-build-safe
GHC
ghc-devs at haskell.org
Tue Feb 6 21:58:24 UTC 2018
#14769: The RecompBecause [TH] check is not resume-build-safe
-------------------------------------+-------------------------------------
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: Incorrect result
Unknown/Multiple | at runtime
Test Case: | Blocked By:
Blocking: | Related Tickets: #481
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
`ghc --make` aims to make compilation behave correctly and produce up-to-
date, no matter whether it completes or is interrupted (e.g. with Ctrl+C)
and later resumed
At no point should interrupting a build and running it again produce "less
correct" outputs than running it to the end; specifically interrupting
shouldn't result in necessary build steps to be "forgotten".
However, this seems to be the case with the `[TH]` check introduced in
#481.
Minimal test case with 3 files: https://github.com/nh2/th-recomp-test
Good behaviour when running without interrupting:
{{{
% touch A.hs && ~/.stack/programs/x86_64-linux/ghc-8.0.1/bin/ghc --make
Main.hs
[1 of 3] Compiling A ( A.hs, A.o )
[2 of 3] Compiling B ( B.hs, B.o ) [TH]
[3 of 3] Compiling Main ( Main.hs, Main.o ) [TH]
Linking Main ...
}}}
Bad behaviour when interrupting and running again:
{{{
% touch A.hs; timeout 0.1 ~/.stack/programs/x86_64-linux/ghc-8.0.1/bin/ghc
--make Main.hs; ~/.stack/programs/x86_64-linux/ghc-8.0.1/bin/ghc --make
Main.hs
[1 of 3] Compiling A ( A.hs, A.o )
[2 of 3] Compiling B ( B.hs, B.o ) [TH]
Linking Main ...
}}}
As you can see, when interrupting, the step `Compiling Main ( Main.hs,
Main.o ) [TH]` went missing.
This suggests to me that either:
* the `[TH]`s are unnecessary in the first place (unlikely and I buy into
the reason explained by #481 that changed values may be picked up by TH in
higher-level modules)
* the resumed `ghc --make` invocation may potentially produce wrong / not-
up-to-date outputs (most likely)
* re-running somehow retrieves the information that in fact recompiling
`Main` is not necessary for a correct build (if this is the case, then I'd
really like to know how that works and we should document it, likely also
try to use that way to avoid recompiling `Main` in the uninterrupted run)
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14769>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list