Compilation fails first time without giving an error, later succeeds without changing code
There is one particular module in our Haskell project that causes GHC to act oddly. We compile using GHC --make Main, and compilation on this particular module often fails on the first attempt. There are no errors given, just a lot of warnings of the form "Defined but not used: ..." (we are *not* using -Werror anywhere). All these warnings are about unused bindings (e.g. foo x y = x, gives unused warning about y) -- even though we don't use the -fwarn-unused-matches option anywhere, nor -Wall.
If you then try to execute the same command several times, it usually succeeds on around the fourth attempt, without altering anything whatsoever. This bug is persistent -- it happens often, usually from a clean start (of compiling the whole project).
The command used for GHC is:
ghc $(GHC_OPTS) -o tock$(EXEEXT) --make Main -odir obj -hidir obj
where:
GHC_OPTS = \
-fglasgow-exts \
-fwarn-deprecations \
-fwarn-duplicate-exports \
-fwarn-incomplete-record-updates \
-fwarn-missing-fields \
-fwarn-missing-methods \
-fwarn-missing-signatures \
-fwarn-overlapping-patterns \
-fwarn-simple-patterns \
-fwarn-type-defaults \
-fwarn-unused-binds \
-fwarn-unused-imports \
-ibackends -ichecks -icommon -idata -iflow -ifrontends -ipass -itransformations \
-v -dcore-lint -XUndecidableInstances -fwarn-tabs -fwarn-monomorphism-restriction
(The -v and -dcore-lint flags were added to try and track down the bug). Output from the failed compilation is as follows:
compile: input file flow/FlowGraph.hs
*** Checking old interface for main:FlowGraph:
[42 of 51] Compiling FlowGraph ( flow/FlowGraph.hs, obj/FlowGraph.o )
*** Parser:
*** Renamer/typechecker:
flow/FlowGraph.hs:274:10: Warning: Defined but not used: `m'
flow/FlowGraph.hs:322:26: Warning: Defined but not used: `m'
flow/FlowGraph.hs:334:40: Warning: Defined but not used: `m'
flow/FlowGraph.hs:339:36: Warning: Defined but not used: `m'
flow/FlowGraph.hs:339:38: Warning: Defined but not used: `rep'
flow/FlowGraph.hs:357:31:
Warning: Defined but not used: `outStartA'
flow/FlowGraph.hs:375:27: Warning: Defined but not used: `m'
flow/FlowGraph.hs:383:26: Warning: Defined but not used: `str'
flow/FlowGraph.hs:383:31: Warning: Defined but not used: `route'
flow/FlowGraph.hs:391:27: Warning: Defined but not used: `m'
flow/FlowGraph.hs:398:26: Warning: Defined but not used: `m'
flow/FlowGraph.hs:415:49: Warning: Defined but not used: `m'
flow/FlowGraph.hs:419:19: Warning: Defined but not used: `pId'
flow/FlowGraph.hs:419:24: Warning: Defined but not used: `nStart'
flow/FlowGraph.hs:419:32: Warning: Defined but not used: `nEnd'
flow/FlowGraph.hs:419:46: Warning: Defined but not used: `m'
flow/FlowGraph.hs:430:19: Warning: Defined but not used: `pId'
flow/FlowGraph.hs:430:24: Warning: Defined but not used: `nStart'
flow/FlowGraph.hs:430:32: Warning: Defined but not used: `nEnd'
flow/FlowGraph.hs:443:19: Warning: Defined but not used: `pId'
flow/FlowGraph.hs:443:24: Warning: Defined but not used: `nStart'
flow/FlowGraph.hs:443:32: Warning: Defined but not used: `nEnd'
flow/FlowGraph.hs:509:46: Warning: Defined but not used: `m'
flow/FlowGraph.hs:557:20: Warning: Defined but not used: `m'
*** Deleting temp files:
Deleting: /tmp/ghc2747_0/ghc2747_0.s
Warning: deleting non-existent /tmp/ghc2747_0/ghc2747_0.s
Upsweep partially successful.
*** Deleting temp files:
Deleting:
link(batch): upsweep (partially) failed OR
Main.main not exported; not linking.
*** Deleting temp files:
Deleting: /tmp/ghc2747_0/ghc2747_1.hscpp /tmp/ghc2747_0/ghc2747_0.hscpp
*** Deleting temp dirs:
Deleting: /tmp/ghc2747_0
make[1]: *** [tock] Error 1
make[1]: Leaving directory `/home/neil/work/tock/branches/ghc-bug'
make: *** [all] Error 2
When the compilation later succeeds the output is as follows:
compile: input file flow/FlowGraph.hs
*** Checking old interface for main:FlowGraph:
[42 of 51] Compiling FlowGraph ( flow/FlowGraph.hs, obj/FlowGraph.o )
*** Parser:
*** Renamer/typechecker:
*** Desugar:
Result size = 11538
*** Core Linted result of Desugar:
*** Simplify:
Result size = 8648
*** Core Linted result of Simplifier phase 0, iteration 1 out of 4:
Result size = 7809
*** Core Linted result of Simplifier phase 0, iteration 2 out of 4:
Result size = 7797
*** Core Linted result of Simplifier phase 0, iteration 3 out of 4:
Result size = 7797
*** Core Linted result of Simplify phase 0 done:
*** Tidy Core:
Result size = 7959
*** Core Linted result of Tidy Core:
writeBinIface: 37 Names
writeBinIface: 167 dict entries
*** CorePrep:
Result size = 9571
*** Core Linted result of CorePrep:
*** Stg2Stg:
*** CodeGen:
*** CodeOutput:
*** Assembler:
gcc -march=athlon64 -Wa,--noexecstack -Iflow -c /tmp/ghc3185_0/ghc3185_0.s -o obj/FlowGraph.o
*** Deleting temp files:
Deleting: /tmp/ghc3185_0/ghc3185_0.s
The code in question is from http://offog.org/darcs/tock/ (version as of 22/3/08 4pm) -- I don't think it would easy to isolate the problem. The module in question (flow/FlowGraph.hs) can be found there.
Trac metadata
Trac field | Value |
---|---|
Version | 6.8.2 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |